docker多个容器一起打包_如何链接多个Docker容器并封装结果?
在另一個容器中運行容器意味著在Docker容器中運行Docker引擎.這被稱為Docker-in-Docker的dind,我強烈反對它.你可以在線搜索’dind’并發現為什么在大多數情況下這是一個壞主意,但由于它不是你問題的主要對象,我不會進一步擴展這個主題.
在同一容器中運行node.js進程和neo4j進程
雖然大多數人會告訴你不要在Docker容器中運行多個進程,但沒有什么能阻止你這樣做.如果您想要遵循此路徑,請查看Docker文檔網站上的Using Supervisor with Docker或Phusion baseimage Docker鏡像.
請注意,這種做事方式會使Docker鏡像越來越難以維護.
鏈接容器
正如您所發現的那樣,保持Docker圖像盡可能簡單(即:在Docker容器中運行一個且只有一個應用程序)將使您的生活更加輕松.
當兩個容器在同一個Docker引擎上運行時,將容器鏈接在一起是微不足道的.這只是一個問題:
>讓你的neo4j容器expose服務器監聽它的端口
>使用–link< neo4j容器名稱>運行node.js容器:< alias>選項
>在node.js應用程序配置中,將neo4j主機設置為< alias> hostname,docker將負責將該連接轉發到它分配給neo4j容器的IP
如果要在不同的主機上運行這兩個容器,事情會變得更加困難.
使用Docker Compose,您必須使用link:鍵來定義鏈接
新的Docker網絡功能
您還發現將來不再支持鏈接容器,并且使多個Docker容器進行通信的新方法是創建虛擬網絡并將這兩個容器附加到該網絡.
以下是如何繼續:
docker network create mynet
docker run --detach --name myneo4j --net mynet neo4j
docker run --detach --name mynodejs --net mynet
然后,您的節點應用程序配置應使用myneo4??j作為要連接的主機.
要告訴Docker Compose使用新的網絡功能,您必須使用--x-networking選項.你也不會使用鏈接:key.
使用新的網絡功能還意味著您將無法為db定義任何別名.因此,您必須使用容器名稱.請注意,除非您在docker-compose.yml文件中使用container_name:密鑰,否則Compose將根據包含docker-compose.yml文件的目錄,yml文件中的服務名稱和編號創建容器名稱.
例如,以下docker-compose.yml文件,如果在名為“foo”的目錄中,將創建兩個名為foo_web_1和foo_db_1的容器:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
當使用docker-compose –x-networking啟動時,Web應用程序配置應該使用foo_db_1作為db主機名.
如果您使用container_name:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
container_name: mydb
當使用docker-compose -x-networking啟動時,Web應用程序配置應該使用mydb作為db主機名.
使用Docker Compose使用nodeJS和neo4j運行Web應用程序的示例
該項目將使用2個docker容器,一個用于運行neo4j數據庫,另一個用于運行nodeJS Web應用程序.
Docker化Web應用程序
我們需要構建一個Docker鏡像,Docker將從該鏡像中運行一個容器.為此,我們將編寫一個Dockerfile.
使用以下內容創建名為Dockerfile(介于大寫D)的文件:
FROM node
RUN git clone https://github.com/aseemk/node-neo4j-template.git
WORKDIR /node-neo4j-template
RUN npm install
# ugly 20s sleep to wait for neo4j to initialize
CMD sleep 20s && node app.js
這個Dockerfile描述了Docker引擎為我們的Web應用程序構建docker鏡像必須遵循的步驟.此泊塢窗圖像將:
>基于official node docker image
>從Github克隆nodeJS示例項目
>將工作目錄更改為包含git clone的目錄
>運行npm install命令以下載并安裝nodeJS應用程序依賴項
>指示docker在運行該映像的容器時使用哪個命令
對nodeJS代碼的快速回顧表明,作者允許我們使用NEO4J_URL環境變量配置要用于connect to the neo4j database的URL.
Docker化neo4j數據庫
好吧,人們已經為我們照顧好了.我們將使用可以在Docker Hub上找到的official Docker image for neo4j.
快速閱讀自述文件告訴我們使用NEO4J_AUTH環境變量來更改neo4j密碼.將此變量設置為none將同時禁用身份驗證.
設置Docker Compose
在與包含Dockerfile的目錄相同的目錄中,使用以下內容創建docker-compose.yml文件:
db:
container_name: my-neo4j-db
image: neo4j
environment:
NEO4J_AUTH: none
web:
build: .
environment:
NEO4J_URL: http://my-neo4j-db:7474
ports:
- 80:3000
此Compose配置文件描述了2個服務:db和web.
db服務將從官方neo4j docker映像生成一個名為my-neo4j-db的容器,并將啟動該容器,將NEO4J_AUTH環境變量設置為none.
Web服務將使用從當前目錄(build:.)中找到的Dockerfile構建的docker鏡像生成一個以docker命名的容器.它將啟動該容器,將環境變量NEO4J_URL設置為http:// my-neo4j-db:7474(注意我們如何在這里使用neo4j容器my-neo4j-db的名稱).此外,docker compose將指示Docker引擎在docker主機端口80上公開Web容器的端口3000.
解雇它
確保您位于包含docker-compose.yml文件的目錄中,并鍵入:docker-compose –x-networking up.
Docker compose將讀取docker-compose.yml文件,弄清楚它必須首先為Web服務構建一個docker鏡像,然后創建并啟動兩個容器,最后將為您提供來自兩個容器的日志.
一旦日志顯示web_1 |快速服務器監聽:http:// localhost:3000 /,一切都已熟,您可以將您的Internet導航器指向http://< ip of docker host> /.
要停止應用程序,請按Ctrl C.
如果您想在后臺啟動應用程序,請使用docker-compose –x-networking up -d.然后,為了顯示日志,請運行docker-compose logs.
停止服務:docker-compose stop
刪除容器:docker-compose rm
使neo4j存儲持久化
官方的neo4j docker image自述文件說容器將數據保存在/ data的卷上.然后,我們需要指示Docker Compose將該卷掛載到docker主機上的目錄.
使用以下內容更改docker-compose.yml文件:
db:
container_name: my-neo4j-db
image: neo4j
environment:
NEO4J_AUTH: none
volumes:
- ./neo4j-data:/data
web:
build: .
environment:
NEO4J_URL: http://my-neo4j-db:7474
ports:
- 80:3000
使用該配置文件,當您運行docker-compose –x-networking時,docker compose將創建一個neo4j-data目錄并將其安裝到位置/數據的容器中.
啟動應用程序的第二個實例
創建一個新目錄并復制Dockerfile和docker-compose.yml文件.
然后,我們需要編輯docker-compose.yml文件,以避免neo4j容器的名稱沖突和docker主機上的端口沖突.
將其內容更改為:
db:
container_name: my-neo4j-db2
image: neo4j
environment:
NEO4J_AUTH: none
volumes:
- ./neo4j-data:/data
web:
build: .
environment:
NEO4J_URL: http://my-neo4j-db2:7474
ports:
- 81:3000
現在它已準備好使用docker-compose –x-networking up命令.請注意,您必須位于具有該新docker-compose.yml文件的目錄中才能啟動第二個實例.
總結
以上是生活随笔為你收集整理的docker多个容器一起打包_如何链接多个Docker容器并封装结果?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 舒适度超越所有豪车!问界M7前脸官图公布
- 下一篇: 台积电2nm工艺挤牙膏 三星窃喜:202