在以前使用Docker的過程當中,一直是用 Docker run 命令單獨啓動container後再加入Overlay網絡的方式實現部署工做的. 這種方式看似直接,可是隨着服務所包含的container的個數愈來愈多(docker 命令)也就愈來愈多,由此帶來許多重複工做。。。node
在官網上看到了經過 docker-compose 能夠執行container的編排,尤爲是compose files -- V3版本,加入的許多功能能夠方便咱們將服務中的contain部署在單獨的docker host 或者多個 hosts (swarm 節點) 上,因而考慮到目前對於 docker 的使用狀況,確實也到了進行高級特性的嘗試階段,因而乎,走起!docker
分享一個示例:https://hackernoon.com/deploy-docker-compose-v3-to-swarm-mode-cluster-4159e9cca712#.lyx2e8fd9shell
上面的說的是如何使用compose V3 + swarm 構建一個貓狗投票系統,官方的例子,描述的很詳細,有興趣的童鞋能夠研究一下。。。我在這裏部署的方式也是使用了相似的方法,區別之處在與:實例中運用了「docker stack deploy」命令在多個host上面部署,而我使用的是「docker-compose up」 分別在兩個host上面啓動與部署服務。 bash
首先是經過 Swarm 建立 nodes,而且建立Overlay網絡模式. 我在這裏就不在贅述,你們能夠參看我以前的隨筆或者利用萬能的互聯網找到答案。網絡
我這裏使用的Docker engine 和 Docker-compose 版本以下:oracle
衆所周知,compose 就是 docker提供給咱們用來進行編排的利器,那麼咱們應該如何使用她呢?app
在解析docker-compose.yml以前,我想先說明一下個人業務,在熟悉業務以後,咱們再來看看具體的"code".ui
業務需求:咱們要在兩個host (swarm node)上面分別創建一組服務,爲了簡單起見,我將nodes命名爲nodeDB和nodeService;顧名思義,咱們就是要在nodeDB上面創建database的服務(我這裏是部署oracle server),在nodeService上面部署咱們的程序(containers). 而 containers 之間的通訊就是經過Swarm的Overlay網絡來完成的。spa
version: '3'
services:
frs_orasvr:
build:
context: ./frsDB
dockerfile: Dockerfile
image: frs_orasvr_img:v1
container_name: frs_orasvr
hostname: frs_orasvr
ports:
- "1521:1521"
volumes:
- /DATA/compose_frs/frsDB/cafisFRSDB/:/frs
networks:
- qrtSwamComposeNet
networks:
qrtSwamComposeNet:
driver: overlay
這裏請注意幾個內容:code
1. networks: 在 compose file V3中, 容許咱們經過networks關鍵字定義一個基於 Docker0 網絡的 subnet。 而後將咱們的服務添加到這個subnet中。這樣作的好處實現了服務之間的隔離,一旦咱們不須要這組服務了,咱們能夠經過命令「docker-compose down」 卸載服務和對應的subnet,他不會對其餘的服務形成影響。
2. build: 咱們能夠經過build命令來指定加載那個Dockerfile。 Dockerfile 提供給咱們一種方式將通用的dockr image 定製化成爲本身的image,這些定製化的步驟就能夠以Dockerfile的方式記錄下來。例如,我以前從docker 倉庫裏pull 下來一個image, 咱們叫他baseImage,以後在此基礎上進行了個人定製化生成myImage,若是須要在其餘機器上面使用myImage,以前的作法吧myImage提交到私有倉庫,在須要的時候pull下來,可是若是不一樣的地方須要不一樣的myImage (v1,v2,v3...),就有可能形成Image氾濫。如今咱們經過Dockerfile的方式記錄本身的定製過程,就會方便許多。
OK,囉嗦了一大堆。。。如今咱們再來看看咱們的Dockerfile長得如何:
FROM 172.100.1.15:5000/oracle11g_server_v3
RUN mkdir /frs/
COPY /cafisFRSDB/ /frs/
COPY /cafisFRSDB/listener.ora /app/oracle/11.2.0/network/admin/
CMD ["/bin/bash", "/frs/startup.sh"]
Dockerfile的內容很簡單,就是copy文件;
CMD -- 就是咱們須要在啓動container的時候執行的shell腳本,經過她啓動oracle服務和實例(業務邏輯需求)。
如今咱們cd到docker-compose.yml文件所在的目錄,輸入命令 「docker-compose up」,命令執行完成後咱們能夠看到
1. 創建網絡 composefrs_qrtSwarmComposeNet
2. 經過 Dockerfile 生成 imge
3. compose運行image,生成container而且調用shell腳本
到此,咱們在nodeDB上面的工做就完成了。。。
咱們要在這個host (swarm node) 部署服務,服務中的container須要與以前node上面oracle服務通訊。。。
直接上code (簡單起見,只列出了services 中的一個 container)
version: '3'
services:
frs_ftsoft:
build:
context: ./ftsoft
dockerfile: Dockerfile
image: frs_ftsoft_img:v1
networks:
- composefrs_qrtSwamComposeNet
container_name: frs_ftsoft
hostname: frs_ftsoft
mac_address: xx:xx:xx:xx:xx:xx
volumes:
- /data/CabisSvr/DockerFrs/ftsoft:/frs
networks:
composefrs_qrtSwamComposeNet:
external: true
Compose文件中使用的 Dockerfile 的內容和以前差很少,就不在這裏多說了。
注意:
1. 因爲以前咱們在nodeDB的compose file 裏面已經建立過了網絡,這裏須要指定爲external:true (不須要在建立了),在container裏面加入便可。
2. 咱們直接運行"docker-compose up"會報錯,內容大體爲找不到指定的網絡。。。這是因爲咱們以前在nodeDB上面建立的network不會自動再新的node上面顯示(官方說法),因此咱們須要先在 nodeService 上面運行一個container讓其加入網絡 「composefrs_qrtSwamComposeNet「
例如 「docker run -itd --name=mybusybox --network=composefrs_qrtSwamComposeNet busybox /bin/sh」
以後咱們即可以在nodeService上面可以查看到 composefrs_qrtSwamComposeNet 網絡,此時再運行「docker-compose up」就OK了。這點仍是有點坑的
OK,經過在nodeDB和nodeService上運行兩次 " docker-compose up ",命令,咱們實現了在不一樣的hosts節點上運行containers,最終將他們以service的方式展示給外部用戶。
PS,我還嘗試過用docker stack deploy的方式進行部署,使用它最大的好處就是能夠再一臺機器上完成部署(傳說中的一鍵部署),可是因爲其中的種種限制(例如必須保證須要部署的service中使用的image必須提早存在於指定機器或者私有倉庫,且不能使用Dockerfile臨時編譯; 不能指定conainer的IP,Mac 等等。。。),最終未能如願,但願在 docker 以後的版本里可以改善吧。