Docker幫助你在你的機器上快速建立一個開發環境。完成整個過程只需要幾分鐘時間。
但是,讓我們假設你被分配到一個專案上,該專案需要至少10個不同的服務處於執行狀態來執行你的專案。例如,假設你的專案需要Java 8、Node 14、MySQL、MongoDB、Ruby on rails、RabbitMQ和其他。
在這種情況下,你必須從Docker中單獨提取所有這些映象,並在其容器中啟動所有這些映象。在某些時候,一個程序可能依賴於另一個程序來執行。所以,你必須給它們排序。
如果這是一個一次性的過程就好了。但是,不僅僅是一次–每天,每次你開始在你的專案上工作時–你都必須啟動所有這些服務。
這是一個乏味的過程,對嗎?
為了克服這個問題,Docker引入了一個叫做多容器(Docker Compose)的概念。在學習Docker Compose之前,讓我們快速瞭解一下如何在Docker中啟動資料庫主機。
在本教程的例子部分,我們將一起啟動一個NodeJS容器和MongoDB容器。在一開始就學習MongoDB,會讓你對我們轉向Docker Compose時有一個很好的理解。
我們將把本教程分成兩個部分:
- 如何使用docker作為資料庫主機(MongoDB)?
- 示例說明Docker Compose如何工作(NodeJS和MongoDB)
如何使用Docker作為資料庫主機
如果你有過後端開發的經驗,你可能有機會處理多個資料庫。例如,像MySQL/Postgres這樣的資料庫來處理關係型資料,Cassandra/MongoDB來處理非結構化資料。
想知道一個祕密嗎?你可以在不在本地機器上安裝資料庫的情況下進行後端開發工作。是的,你可以使用Docker作為資料庫主機。它在特定的映象檔案中預設擁有所有的依賴項。
為什麼我們需要Docker資料庫?
Docker幫助我們在不同的平臺和環境中保持一致的版本。假設你的團隊中有一群人在MongoDB 5.0版本上工作。如果一個新成員加入你的團隊,他們需要用精確的配置手動設定相同的版本。如果他們安裝了最新版本的MongoDB(6.0)呢?這將導致一些衝突。如果它蔓延到其他人的裝置上,這將是一場噩夢。
為了解決這個問題,你可以在Docker中使用帶有自定義配置的MongoDB,並將MongoDB映象推送到Docker Hub內部。如果有新人進來,他們可以拉動映象並開始實施,而無需任何手動配置。
讓我們來看看在Docker中使用資料庫的優勢。
- 通過使用這種實現方式,我們可以確保團隊中的每個人都使用準確的執行時間和配置,而不需要任何外部資源。
- 它非常容易設定,我們可以使用Docker桌面快速啟動/停止伺服器
如何使用Docker設定MongoDB
如果你不熟悉Docker Hub,這裡有一個簡短的介紹。Docker hub是一個平臺,你可以在這裡找到並分享公開或私有的Docker映象。它與GitHub / GitLab非常相似。簡而言之,它是一個Docker映象的儲存庫。
第一步,從Docker Hub拉出官方的Docker映象。
Docker Hub中的MongoDB映象
docker pull mongo:latest
從Docker Hub拉取Mongo映象的終端命令
從Docker Hub拉取Mongo映象的輸出示例
一旦你完成了Mongo映象的拉取,開啟你的Docker桌面,你就可以看到它了。
Docker桌面中的可用Mongo映象
讓我們使用 docker run
命令來執行我們的MongoDB映象。
docker run -d -p 27017:27017 --name mongo-server-local mongo: latest
在docker中執行mongodb的命令
在docker中執行mongodb的命令
我們已經成功執行了Docker映象。現在我們可以看到容器在Docker桌面上執行。
在Docker Desktop中執行的Mongo容器
所以,MongoDB伺服器正在你的機器上執行。讓我們在瀏覽器中確認這一點。在你的瀏覽器上進入http://localhost:27017,你應該能夠看到如下截圖所示的資訊:
使用Docker執行MongoDB伺服器時,”看起來你正試圖通過HTTP訪問MongoDB的本地驅動埠” 的輸出示例
有意思吧?
我們可以隨時使用Docker停止/啟動MongoDB伺服器。
重要說明
- 不建議將Docker作為生產用資料庫使用
- 不要在大規模應用中使用Docker資料庫
什麼是docker-compose?
讓我們再來看看docker-compose。
Docker Compose是一個工具,你可以用來定義和分享多容器應用程式。這意味著你可以使用一個單一的資源來執行一個具有多個容器的專案。
例如,假設你正在用NodeJS和MongoDB一起構建一個專案。你可以建立一個單一的映象,將兩個容器作為一個服務來啟動–你不需要分別啟動每個容器。
有意思吧?這就解決了我在本文一開始就提出的問題。
為了實現這個目標,我們需要定義一個 docker-compose.yml
。
docker-compose.yml檔案
compose檔案是一個YML檔案,定義了Docker容器的服務、網路和卷。有幾個版本的compose檔案格式可用–1、2、2.x和3.x。
在進一步開展工作之前,這裡有一個Docker Compose團隊給我們的重要說明。
從2023年6月底開始,Compose V1將不再被支援,並將從所有Docker桌面版本中移除。
我們在本文中使用的是版本3。
version: '3' services: app: image: node:latest container_name: app_main restart: always command: sh -c "yarn install && yarn start" ports: - 8000:8000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: localhost MYSQL_USER: root MYSQL_PASSWORD: MYSQL_DB: test mongo: image: mongo container_name: app_mongo restart: always ports: - 27017:27017 volumes: - ~/mongo:/data/db volumes: mongodb:
使用docker compose執行多個容器的命令
讓我們來拆解一下上面的程式碼,並逐一理解它:
version
指的是docker-compose的版本(最新的3)。services
定義了我們需要執行的服務app
是你的一個容器的自定義名稱image
指的是我們要拉的映象。這裡我們使用的是node:latest
和mongo
.container_name
是每個容器的名稱restart
啟動/重啟一個服務容器port
定義了執行該容器的自定義埠working_dir
是服務容器的當前工作目錄environment
定義了環境變數,如DB憑證等。command
是執行服務的命令
如何執行多容器
我們需要使用docker build來構建我們的多容器。
docker compose build
構建docker-compose.yml的命令
成功構建後,我們可以使用 up
命令來執行容器。
docker compose up
使用docker-compose執行多個容器的命令
如果你想以分離模式執行容器,只需使用 -d
標誌。
docker compose up -d
使用docker-compose以分離模式執行多個容器的命令
使用docker-compose以分離模式執行多個容器的輸出示例
好了,我們可以開始了。容器已經啟動並執行了。讓我們檢查一下容器列表。
docker compose ps
列出正在執行的容器服務的命令
列出執行中的容器服務的輸出樣本
好耶,我們可以看到有兩個容器在同時執行。
使用docker執行nodejs服務的輸出樣本
使用docker執行mongodb服務的輸出樣本
為了檢視MongoDB中的資料,你必須安裝MongoDB Compass。
下面是它的螢幕截圖。
mongodb compass中的MongoDB伺服器檢視
小結
在這篇文章中,你已經通過一個例子瞭解了Docker Compose是如何工作的。使用多個容器,你可以旋轉任何型別的服務,如RabbitMQ或Apache Kafka,並在一個單一的服務源中執行。希望你喜歡閱讀這篇文章。
評論留言