1. 程式人生 > 其它 >docker-compose(Docker服務編排)

docker-compose(Docker服務編排)

docker 服務編排
docker 服務編排也叫docker compose,它的出現是應來解決使用docker部署大型應用的業務場景的問題。通常在生產環境中,使用docker部署一個應用需要使用多個容器,例如部署前端、後端、依賴服務、資料庫等。如果每個容器都需要手工使用shell來啟動則效率過於低下,所以在這樣的場景中,我們可以採用docker compose來進行docker容器的編排工作。

docker-compose.yml檔案的編寫
在docker-compose.yml檔案中可以編寫相關的配置屬性,用來管理compose的構建過程,主要的屬性包括:
1)version 代表compose檔案格式版本,按照官網的例項,建議目前採用‘3.9’版本
2)services 該屬性是compose檔案中的核心屬性,在該屬性之下,可以配置compose啟動的各種服務。主要是需要compose啟動的各種容器資訊。也是compose檔案中主要的開發內容。
常用屬性:

屬性名稱 說明
image 當前服務使用什麼映象檔案
ports 當前容器需要對映的埠資訊 - ”8080:80“
enviroments 當前映象需要傳遞的引數
volumes 當前映象的掛在點
tty:true 代表使用-it模式啟動服務
build 指定dockerfile所在的路徑,當使用docker compose編排一個容器,而且該容器需要構建的時候需要使用該引數
container_name 指定編排容器的名稱
restart:always 在docker服務重啟後,該容器是否自動重啟
depends_on: 服務名 設定服務依賴關係,通過該配置可以決定服務的啟動順序
env_file 指定配置檔案
context 指定上下文
dockerfile 指定需要使用的dockerfile檔案

docker-compose命令

docker-compose up命令來啟動一個容器編排,接下來,我們詳細瞭解一下,在docker-compose中常用的命令以及引數使用

docker-compose命令
常用引數:
-f 預設docker-compose會在當前資料夾下詢招Dockercompose.yml檔案,如果需要自定義檔名,可以使用-f 檔名 形式來指定
-p 指定專案名稱 指定專案後,通過compoose建立的所有容器都會自動新增專案名稱字首
-v 檢視當前docker-compose的版本資訊
docker-compose 環境變數
docker compose 預設的環境變數為.env,在其中我們可以使用對應的鍵值對模式給compose傳遞值 --env-file 引數可以動態制動compose需要使用的配置檔案位置
docker-compose up 啟動一個容器編排
常用引數: `

引數名稱 說明
-d 後臺執行
–force-recreate 強制更新已經存在的容器
–remove-orphans 刪除在compose檔案中沒有定義的容器,通常使用在修改了compose檔案的場景下使用服務名 單獨啟動compose中的某一個服務,如果服務存在依賴,則被依賴的服務也會被啟動
docker-compose down 刪除對應的容器,網路服務
docker-compose stop 停止compose對應的所有服務
docker-compose start 啟動所有的服務容器
docker-compose ps 檢視與當前compse相關的服務容器
-q 只列出id值,其他值不顯示
docker-compose logs 讀取日誌資訊
docker-compose pull 拉取服務對應的映象
docker-compose build 構建compose中的所有映象、
docker-compose images 檢視所有的映象資訊
docker-compose config 檢視配置檔案資訊
docker-compose restart 重啟服務
docker-compose exec 服務名 進行指定服務的容器
docker-compose rm 刪除所有已經停止的服務容器
以上命令涉及到某個服務的時候均可以通過:命令:服務名對相應的服務進行操作 看左面

docker compose 網路管理
​1. 預設場景下,使用docker compose編排服務,會自動建立對應的網路。可以使用docker network ls
2. 以及docker inspect 網路id 進行相關的查詢。
可以在compose檔案中,使用networks
定義一個網路,並在服務中使用networks屬性加入一個自定義網路。這時候有三種結果,如果所有的服務都加入到了自定義網路,則docker,會建立自定義網路,並將所有的服務容器新增到對應的網路中,如果沒有任何服務宣告加入自定義網路,則docker會建立預設網路,然後將容器新增到預設網路,而不會建立自定義網路,如果有的服務宣告新增到自定義網路,而有的服務沒有宣告,則docker會建立兩個網路,一個是自定義網路,而另一個是預設網路,並將對應的容器新增到對應的網路中。
3. 使用固定ip策略

version: '3.3'
services:
  cslcp_web:
    image: "cslcp_web_image:v01"
    ports:
      - "19090:8080"
    build:
      context: "../web/"
      dockerfile: "Dockerfile"
    networks:
      - "cslcp_net"
  cslcp_mysql:
    image: "mysql"
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.100
    ports:
      - "13306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
  cslcp_centos:
    container_name: 'test_centos'
    image: "centos"
    tty: true
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.11
networks:
  cslcp_net:
    ipam:
      config:
        - subnet: "192.168.13.0/24"
          gateway: "192.168.13.1"

  

    1. 使用服務策略
      當compose啟動成功後可以直接使用ping 訪問服務名
    2. 使用網路別名策略
networks:
  cslcp_net:
    ipam:
      config:
      - gateway: 192.168.13.1
        subnet: 192.168.13.0/24
services:
  cslcp_centos:
    container_name: test_centos
    depends_on:
      cslcp_web:
        condition: service_started
    image: centos
    links:
    - cslcp_web:cw
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.11
    tty: true
  cslcp_mysql:
    environment:
      MYSQL_ROOT_PASSWORD: root
    image: mysql
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.100
    ports:
    - published: 13306
      target: 33064
  cslcp_web:
    build:
      context: /root/docker/dockercompose/cslcp/web
      dockerfile: Dockerfile
    image: cslcp_web_image:v01
    networks:
      cslcp_net: null
    ports:
    - published: 19090
      target: 8080
version: '3.3'

  

  1. 使用container 策略
version: '3.3'
services:
  cslcp_web:
    image: "cslcp_web_image:v01"
    build:
      context: "../web/"
      dockerfile: "Dockerfile"
    depends_on:
      - "cslcp_centos"
    network_mode: "service:cslcp_centos"
  cslcp_mysql:
    image: "mysql"
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    depends_on:
      - "cslcp_centos"
    network_mode: "service:cslcp_centos"
  cslcp_centos:
    container_name: 'test_centos'
    image: "centos"
    tty: true
    ports:
      - "17070:8080"
      - "13306:3306"
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.11
networks:
  cslcp_net:
    ipam:
      config:
        - subnet: "192.168.13.0/24"
          gateway: "192.168.13.1"

  

鳴謝:

https://blog.csdn.net/ayhg1/article/details/118066576

 https://www.cnblogs.com/cwsheng/p/13944281.html