我是一名Docker新手,並試圖圍繞構建應用程序堆棧來包裝頭部。使用Docker構建應用程序堆棧
對於使用Nginx,MongoDB和Redis在Linux上運行的Node應用程序,你如何組成堆棧?
在DockerHub上,我可以看到Node,MongoDB和Redis的圖像,因此您需要爲堆棧中的每個組件創建映像嗎?
您是否將所有這些鏈接在Dockerfile中,然後將各個配置設置放入docker-compose.yaml中,如gist?
只是試圖得到一般的想法。
我是一名Docker新手,並試圖圍繞構建應用程序堆棧來包裝頭部。使用Docker構建應用程序堆棧
對於使用Nginx,MongoDB和Redis在Linux上運行的Node應用程序,你如何組成堆棧?
在DockerHub上,我可以看到Node,MongoDB和Redis的圖像,因此您需要爲堆棧中的每個組件創建映像嗎?
您是否將所有這些鏈接在Dockerfile中,然後將各個配置設置放入docker-compose.yaml中,如gist?
只是試圖得到一般的想法。
Docker的最佳實踐是run one process per container,故意難以編寫運行多個服務的Docker文件。
Docker Compose通過爲您提供運行多個容器(每個運行一個服務)而不是運行多個服務的單個容器所需的工具來解決問題。
您可以使用撰寫建立一個堆棧是這樣的:
version: '2'
services:
redis:
image: 'redis'
ports:
- '6379:6379'
nginx:
image: 'nginx'
ports:
- '80:80'
mongodb:
image: 'mongo'
ports:
- '27017:27017'
app:
build: .
ports:
- '3000:3000'
運行docker-compose up
後redis,nginx和mongo庫圖像將泊塢樞紐拉。
然後,它會嘗試從Dockerfile
與您的docker-compose.yml
文件在同一個目錄中構建一個容器。
如果你正在構建一個節點的應用程序,它可能是這個樣子:
FROM node
COPY . /app
RUN npm install
CMD ["npm", "start"]
泊塢撰寫還配置了網絡,使您的每一個組成的服務被映射到容器的IP地址的描述主機。例如,如果您從節點應用程序連接到Redis,則不會在localhost
上找到它(因爲這是您的容器)。相反,它將在redis:6379
。
它是爲Python編寫的,但getting started article非常好。
對於每個dockerfile,您只能構建一個應用程序,並且將它們建立在其他圖像上確實是一種很好的做法。具體而言,如果您想運行節點,則不需要Ubuntu。只需選擇official node image作爲起點,例如node/6.9
。
(甚至考慮了小內存佔用基於高山圖像。)
如果你需要一個MySQL use mysql:8
,如果你需要nginx的,使用nignx:stable。
第一個錯誤之一是做一個通用的「統治他們所有的容器」。初學者喜歡在Ubuntu上創建映像,然後通過apt-get
安裝所有工具或運行安裝腳本。這是過多的體力勞動。
雖然有時仍需要對圖像進行微調,但您可以使用特定圖像作爲起點,從碼頭生態系統中獲益更多。通常,僅通過環境變量來配置圖像的容器就足夠了。
與僅使用docker
鏈接是可能的,但相當困難。 docker-compose不是構建堆棧的必要工具,而是一個方便的工具。
將容器鏈接在一起不會發生在Dockerfile
中,而是發生在docker-compose.yml
中。
docker-compose是一種編排整個堆棧並將不同圖像鏈接在一起的工具。這是如何讓你的nginx和nodejs圖像互相交談。
週末我一直在玩這個,並取得了很好的進展。看起來最難的部分是爲您的特定用例找到最佳圖像,並將它們全部結合在碼頭合成文件中 – ChrisRich