Docker容器學習(四)之Docker Compose

dockerlogo

以前的文章中,咱們使用docker run 命令來啓動一個容器,而做爲真正的線上業務環境,咱們服務確定不止一個,也就說明容器確定不止一個,而若是仍是手動的一個個來啓動容器這未免會讓人頭皮發麻,幸虧有Docker Compose,用於定義和運行多容器Docker應用程序的工具,有了它咱們能夠一次啓動多個容器,這也很是適合與持續集成工具(Jenkins)來配合。java

安裝 Docker Compose

  • 根據官方安裝最新版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
複製代碼
  • 安裝腳本添加執行權限
chmod +x /usr/local/bin/docker-compose
複製代碼
  • 注意: 根據前面的步驟理論上是安裝完成了,可是咱們執行官方命令只是下載到了/usr/local/bin/這個目錄,添加腳本執行權限以後docker-compose並不能生效,依據官方文檔提示覆制該文件到/usr/bin/目錄下,並未該文件添加腳本執行權限
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

chmod +x /usr/bin/docker-compose
複製代碼
  • 此時咱們執行docker-compose版本命令就能看到版本號打印
# docker-compose --version
docker-compose version 1.24.0, build 0aa59064
複製代碼
  • 命令補全工具
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
複製代碼
  • 版本
    Docker Compose版本對應

docker-compose.yml 命令

docker-compose 命令

  • 和前面學習Docker容器命令同樣,docker-compose也有很多命令
命令 含義 示例
build 構建或從新構建服務 build [options] [--build-arg key=val...] [SERVICE...](使用 docker-compose help build 查看詳細使用)
help 查看docker-compose命令幫助文檔 docker-compose help COMMAND(標識要看的命令)
up 構建、建立、從新建立、啓動,鏈接服務的相關容器。全部鏈接的服務都會啓動,除非它們已經運行(前提該目錄下已經存在docker-compose.yml文件) docker-compose up(直接啓動,該命令退出,全部容器中止) docker-compose up -d (後臺運行全部容器)
kill 發送SIGKILL 信號中止指定服務的容器 docker-compose kill api-feign(注意該名稱爲docker-compose.yml中定義的服務名稱)
start 啓動指定服務已存在的容器 docker-compose start api-feign
stop 中止指定服務已存在的容器 docker-compose stop api-feign
logs 查看服務的日誌輸出 docker-compose logs --tail="all" api-feign(查看api-feign 所有日誌輸出)
ps 列出全部容器 docker-compose ps (和docker ps -a 同樣能夠查看容器,顯示信息不同)
rm 刪除指定服務的容器 docker-compose rm api-feign

編寫docker-compose.yml 啓動多服務

  • 服務器任意目錄編寫文件 docker-compose.yml
version: '3.4'
services:
  configerver:  # 指定一個服務名稱
    image: mao/configserver:0.0.1-SNAPSHOT  # 鏡像名稱
    ports:
      - 8666:8666  # 指定端口映射
  eureka:
    image: test1/eureka1:0.0.1-SNAPSHOT
    ports:
      - 8805:8805
  server-admin:
    image: mao/server-admin:0.0.1-SNAPSHOT
    ports:
      - 8806:8806
  api-feign:
    image: mao/api-feign:0.0.1-SNAPSHOT
    ports:
      - 8840:8840
  ribbon-consumer:
    image: mao/ribbon-consumer:0.0.1-SNAPSHOT
    ports:
      - 8830:8830
  ribbon-provider:
    image: mao/ribbon-provider:0.0.1-SNAPSHOT
    ports:
      - 8820:8820
複製代碼
  • 在docker-compose.yml目錄下執行命令啓動多個服務(安裝好Docker Compose前提下)
# docker compose 構建鏡像並使用鏡像啓動容器(-d 表示後臺啓動)
docker-compose up -d 
複製代碼

docker-compose.yml啓動對應的服務

  • 由上圖咱們發現各個服務都已經啓動在各自的容器當中,可是訪問服務的時候只有configserver(配置中心)可以訪問,其餘服務都不能訪問,咱們仔細想一想就能知道,除了配置中心,其餘服務的配置文件都要經過配置中心來獲取,可是docker-compose啓動是同時的,因此配置中心服務還沒提供其餘服務就已經啓動了,這顯然會讓其餘服務報錯,因此在生產環境中咱們必需要控制服務的啓動順序,也就是最早啓動配置中心,而後啓動註冊中心,最後再啓動其餘服務。

Docker Compose控制服務啓動順序

如何使用

  • 接下來我將介紹如何使用該腳原本控制咱們服務啓動順序
  • 首先咱們能夠將腳本打包到咱們的鏡像中,修改Dockerfile文件
#Dockerfile中 
....
COPY wait-for-it.sh /wait-for-it.sh #在本項目模塊根目錄下複製wait-for-it.sh 到鏡像/目錄下
RUN chmod +x /wait-for-it.sh # 修改腳本權限
....
複製代碼
  • 再次使用docker-maven-plugin打包鏡像
  • 從新編寫docker-compose.yml文件,添加entrypoint執行咱們前面打包如鏡像的wait-for-it.sh腳本監控配置中心是否已經提供服務,注意ENTRYPOINT指令是不會被覆蓋的,最終會執行監控./wait-for-it.sh configerver:8666配置中心是否提供服務來經過配置中心獲取配置來啓動其餘服務
version: '3.7'
services:
  configerver:  # 指定一個服務名詞
    image: mao/configserver:0.0.1-SNAPSHOT  # 鏡像名稱
    ports:
      - 8666:8666  # 指定端口映射
    depends_on:
      - eureka
  eureka:
    image: mao/eureka:0.0.1-SNAPSHOT
    ports:
      - 8805:8805
    entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
  server-admin:
    image: mao/server-admin:0.0.1-SNAPSHOT
    ports:
      - 8806:8806
    depends_on:
      - eureka
      - configerver
    entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
  api-feign:
    image: mao/api-feign:0.0.1-SNAPSHOT
    ports:
      - 8840:8840
    depends_on:
      - eureka
      - configerver
    entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
  ribbon-consumer:
    image: mao/ribbon-consumer:0.0.1-SNAPSHOT
    ports:
      - 8830:8830
    depends_on:
      - eureka
      - configerver
    entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
  ribbon-provider:
    image: mao/ribbon-provider:0.0.1-SNAPSHOT
    ports:
      - 8820:8820
    depends_on:
      - eureka
      - configerver
    entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
  gateway:
    image: mao/gateway:0.0.1-SNAPSHOT
    ports:
      - 8081:8081
    depends_on:
      - eureka
      - configerver
    entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
複製代碼
  • 而後咱們在服務器中執行docker-compose命令後臺一鍵啓動服務,不出意外服務就可以所有啓動
docker-compose up -d
複製代碼

後臺有順序啓動服務成功

最後

  • 本篇文章咱們學習瞭如何使用Docker Compose來啓動多個容器,而多個容器改如何管理呢?谷歌已經給了咱們答案,那就是使用k8s,而k8s是什麼呢,請看個人這一篇文章Kubeadm 部署 Kubernetes 1.14.2 集羣

參考連接

相關文章
相關標籤/搜索