Docker - 使用Swarm和compose部署服務(containers)


前言

 

在之前使用Docker的過程中,一直是用 Docker run 命令單獨啟動container后再加入Overlay網絡的方式實現部署工作的. 這種方式看似直接,但是隨着服務所包含的container的個數越來越多(docker 命令)也就越來越多,由此帶來許多重復工作。。。

 

在官網上看到了通過 docker-compose 可以執行container的編排,尤其是compose files -- V3版本,加入的許多功能可以方便我們將服務中的contain部署在單獨的docker host 或者多個 hosts (swarm 節點) 上,於是考慮到目前對於 docker 的使用情況,確實也到了進行高級特性的嘗試階段,於是乎,走起!

 

分享一個示例:https://hackernoon.com/deploy-docker-compose-v3-to-swarm-mode-cluster-4159e9cca712#.lyx2e8fd9

上面的說的是如何使用compose V3 + swarm 構建一個貓狗投票系統,官方的例子,描述的很詳細,有興趣的童鞋可以研究一下。。。我在這里部署的方式也是使用了類似的方法,區別之處在與:實例中運用了“docker stack deploy”命令在多個host上面部署,而我使用的是“docker-compose up” 分別在兩個host上面啟動與部署服務。 

 

准備工作

首先是通過 Swarm 創建 nodes,並且創建Overlay網絡模式. 我在這里就不在贅述,大家可以參看我之前的隨筆或者利用萬能的互聯網找到答案。

我這里使用的Docker engine 和 Docker-compose 版本如下:

 

Docker-compose

眾所周知,compose 就是 docker提供給我們用來進行編排的利器,那么我們應該如何使用她呢?

在解析docker-compose.yml之前,我想先說明一下我的業務,在熟悉業務之后,我們再來看看具體的"code".

業務需求:我們要在兩個host (swarm node)上面分別建立一組服務,為了簡單起見,我將nodes命名為nodeDB和nodeService;顧名思義,我們就是要在nodeDB上面建立database的服務(我這里是部署oracle server),在nodeService上面部署我們的程序(containers). 而 containers 之間的通信就是通過Swarm的Overlay網絡來完成的。

 

NodeDB的docker-compose.yml

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

這里請注意幾個內容:

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上面的工作就完成了。。。

 

NodeService的docker-compose.yml

 我們要在這個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 之后的版本里能夠改善吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM