[Docker Compose定義運行多個Docker容器]


[Docker Compose定義運行多個Docker容器]

Docker Compose

定義和運⾏多個 Docker 容器的應⽤(Defining and running multi-container Dockerapplications)

	我們知道使⽤⼀個 Dockerfile 模板⽂件,可以讓⽤戶很⽅便的定義⼀個單獨的應⽤容器。然⽽,在⽇常⼯作
中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現⼀個 Web 項⽬,除了 Web 服務容器本身,
往往還需要再加上后端的數據庫服務容器,甚⾄還包括負載均衡容器等。

	Compose 恰好滿⾜了這樣的需求。它允許⽤戶通過⼀個單獨的 docker-compose.yml 模板⽂件(YAML格
式)來定義⼀組相關聯的應⽤容器為⼀個項⽬(project)。

	docker-compose是容器編排工具,需要注意的是,docker-compose只是單機的容器編排工具。
	容器編排:管理多個容器

Compose 中有兩個重要的概念

服務 ( service )

⼀個應⽤的容器,實際上可以包括若⼲運⾏相同鏡像的容器實例。

項目 ( project )

由⼀組關聯的應⽤容器組成的⼀個完整業務單元,在 docker-compose.yml ⽂件中定義

Compose 的默認管理對象是項⽬,通過⼦命令對項⽬中的⼀組容器進⾏便捷地⽣命周期管理。

	Compose 項⽬由 Python 編寫,實現上調⽤了 Docker 服務提供的 API 來對容器進⾏管理。因此,只要所操作的平台⽀持 Docker API,就可以在其上利⽤ Compose 來進⾏編排管理。

安裝docker-compose

1、下載

curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2、修改權限

chmod +x /usr/local/bin/docker-compose 

3、文件更名

mv /usr/local/bin/docker-compose /usr/local/bin/docker-compose-Linux-x86_64

4、創建軟連接

ln -s /usr/local/bin/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

5、下載bash命令補全

curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

6、測試docker-compose是否安裝成功

docker-compose --version

顯示如下結果,表示成功

	# docker-compose version 1.24.0, build 0aa59064 

卸載docker-compose

如果是⼆進制包⽅式安裝的,刪除⼆進制⽂件即可。

rm /usr/local/bin/docker-compose /usr/local/bin/docker-compose-Linux-x86_64

docker-compose的使用

	模板⽂件是使⽤ Compose 的核⼼,涉及到的指令關鍵字也⽐較多。但⼤家不⽤擔⼼,這⾥⾯⼤部分指令跟
docker run 相關參數的含義都是類似的。

	默認的模板⽂件名稱為 docker-compose.yml ,格式為 YAML 格式。

docker-compose.yaml模板

參考⽂檔:https://github.com/yeasy/docker_practice/blob/master/compose/compose_file.md

version: "3.0"
services:
  django:
    image: django:v3
    ports:
      - "8000:8000"
    container_name: django
    networks:
      - django
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    container_name: mysql
    volumes:
    - "/root/docker-compose/mysql/data:/var/lib/mysql"
    networks:
      - django
    depends_on:
      - redis

  redis:
    image: redis:latest
    container_name: redis
    networks:
      - django

networks:
  django:

image :指定啟動的鏡像名稱或ID


指定為要啟動的鏡像名稱或鏡像 ID。如果鏡像在本地不存在, Compose 將會嘗試拉取這個鏡像(公網下載)。

build :構建鏡像啟動

	每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)等來⾃動構建⽣成鏡像。
	
	如果使⽤ build 指令,在 Dockerfile 中設置的選項(例如: CMD , EXPOSE , VOLUME , ENV 等) 將
會⾃動被獲取,⽆需在 docker-compose.yml 中重復設置。

	build:
	  context: ./dir
	  dockerfile: Dockerfile-alternate
	  args:
	    buildno: 1
            	
    context : 指令指定 Dockerfile 所在⽂件夾的路徑。
    
    dockerfile :指令指定 Dockerfile ⽂件名。
    
    arg :指令指定構建鏡像時的變量。

ports :暴露端口信息


使⽤宿主端⼝:容器端⼝格式,或者僅僅指定容器的端⼝(宿主將會隨機選擇端⼝)都可以。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

expose : 暴露端口,但不映射到宿主機,只被連接的服務訪問。僅可以指定內部端口為參數


expose:
 - "3000"
 - "8000"

command : 覆蓋容器啟動后默認執行的命令


設置容器啟動命令

command: echo "hello world"

container_name : 指定容器名稱


默認將會使⽤ 項⽬名稱_服務名稱_序號 這樣的格式。

container_name: docker-web-container

depends_on : 解決容器的依賴、啟動先后的問題


version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis
      
  redis:
    image: redis
    
  db:
    image: postgres
    
上面會先啟動 redis db 再啟動 web

注意: web 服務不會等待 redis db 「完全啟動」之后才啟動。

dns :自定義 DNS 服務器


可以是⼀個值,也可以是⼀個列表

dns: 8.8.8.8

dns:
 - 8.8.8.8
 - 114.114.114.114

environment : 設置環境變量


你可以使⽤數組或字典兩種格式

environment:
  RACK_ENV: development
  SESSION_SECRET:
environment:
  - RACK_ENV=development
  - SESSION_SECRET

只給定名稱的變量會⾃動獲取運⾏ Compose 主機上對應變量的值,可以⽤來防⽌泄露不必要的數據。

如果變量名稱或者值中⽤到 true|false,yes|no 等表達 布爾 含義的詞匯,最好放到引號⾥,避免 YAML
⾃動解析某些內容為對應的布爾語義。這些特定詞匯,包括

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

networks : 配置容器連接的⽹絡


version: "3"

services:
  some-service:
  networks:  # 給啟動的容器設置兩個網橋
    - some-network
    - other-network
    
networks:      # 設置兩個網橋
  some-network:
  other-network:

network_mode : 設置網絡模式


使⽤和 docker run 的 --network 參數⼀樣的值。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

env_file :從文件中獲取環境變量


從⽂件中獲取環境變量,可以為單獨的⽂件路徑或列表。

如果通過 docker-compose -f FILE ⽅式來指定 Compose 模板⽂件,則 env_file 中變量的路徑會基於模板
⽂件路徑。

如果有變量名稱與 environment 指令沖突,則按照慣例,以后者為准。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
  
環境變量⽂件中每⼀⾏必須符合格式,⽀持 # 開頭的注釋⾏。

	# common.env: Set development environment
	PROG_ENV=development

volumes :數據卷所掛載路徑設置


和 -v 差不多,不過-v是宿主主機映射到容器,兩邊同步。
而volumes直接就是兩邊數據同步。

healthcheck : 通過命令檢查容器是否健康運行


healthcheck:

  test: ["CMD", "curl", "-f", "http://localhost"] # 執行的命令
  interval: 1m30s  # 間隔時間
  timeout: 10s     # 設置超時時間
  retries: 3       # 設置允許失敗次數

  test: ["CMD", "ping", "-c1","-t1", "http://localhost"] # 執行的命令
  # -c1 : 只 ping 一次
  # -t1 :時間是一秒鍾,超出1秒則超時
  

docker-compose參數


啟動:docker-compose up # 啟動docker-compose.yaml文件里面的容器
	
刪除:docker-compose down # 刪除docker-compose.yaml文件里面的容器

重啟:docker-compose restart [容器的名稱...] # 重新啟動其中的一個容器

進入容器:docker-compose exec [參數] [SERVICE] [CMD] # 默認使用-T(類似 -it )	
	
停止:docker-compose stop [SERVICE] # 停⽌已經處於運⾏狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器查看各個服務容器內運⾏的進程

刪除容器:docker-compose rm [SERVICE]  # 刪除服務,停止之后才能刪除

	-f, --force 強制直接刪除,包括⾮停⽌狀態的容器。⼀般盡量不要使⽤該選項。
	-v 刪除容器所掛載的數據卷。

容器列表:docker-compose ps # 查看容器列表

啟動:docker-compose start [SERVICE...] # 啟動已經存在的服務容器

查看容器進程:docker-compose top  # 查看各個服務容器內運⾏的進程

暫停運行:docker-compose pause # 暫停服務容器

恢復運行:docker-compose unpause # 回復暫停狀態的服務容器

可視化工具

version: '3.0'
services:
  portainer:
    image: portainer/portainer-ce
    ports:
    - "8001:8000"
    - "9001:9000"
    container_name: portainer
    networks:
      - "portainer"
    volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
    - "/root/docker-compose/portainer_data:/data"
    healthcheck:
      test: ["CMD", "ping", "-c1", "-t1", "portainer"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  portainer:


免責聲明!

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



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