2017-01-26 64 views
3

我是一名Docker新手,並試圖圍繞構建應用程序堆棧來包裝頭部。使用Docker構建應用程序堆棧

對於使用Nginx,MongoDB和Redis在Linux上運行的Node應用程序,你如何組成堆棧?

在DockerHub上,我可以看到Node,MongoDBRedis的圖像,因此您需要爲堆棧中的每個組件創建映像嗎?

您是否將所有這些鏈接在Dockerfile中,然後將各個配置設置放入docker-compose.yaml中,如gist

只是試圖得到一般的想法。

回答

3

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 upredisnginxmongo庫圖像將泊塢樞紐拉。

然後,它會嘗試從Dockerfile與您的docker-compose.yml文件在同一個目錄中構建一個容器。

如果你正在構建一個節點的應用程序,它可能是這個樣子:

FROM node 

COPY . /app 
RUN npm install 
CMD ["npm", "start"] 

泊塢撰寫還配置了網絡,使您的每一個組成的服務被映射到容器的IP地址的描述主機。例如,如果您從節點應用程序連接到Redis,則不會在localhost上找到它(因爲這是您的容器)。相反,它將在redis:6379

它是爲Python編寫的,但getting started article非常好。

+0

週末我一直在玩這個,並取得了很好的進展。看起來最難的部分是爲您的特定用例找到最佳圖像,並將它們全部結合在碼頭合成文件中 – ChrisRich

2

對於每個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圖像互相交談。

+0

感謝您的解釋。我能夠使用docker-compose.yaml使用Node,Nginx,Redis和Mongo構建堆棧。這不是100%的麻煩,但經過一些試驗和錯誤,我得到了堆棧運行。 – ChrisRich

+0

https://gist.github.com/ChristianRich/0f423175dd0b02a2605047ed80b6dcb1 – ChrisRich

相關問題