1. 程式人生 > >Docker(九)Docker Compose

Docker(九)Docker Compose

Compose是Docker的服務編排工具,主要用來構建基於Docker的複雜應用,Compose 通過一個配置檔案來管理多個Docker容器,非常適合組合使用多個容器進行開發的場景。

安裝Docker compose

官方文件

pip安裝:
pip install docker-compose

從github安裝:
curl -L --fail https://github.com/docker/compose/releases/download/1.17.0/run.sh -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

解除安裝:

rm /usr/local/bin/docker-compose # 使用curl安裝的
pip uninstall docker-compose # 使用pip解除安裝

基本使用

#檢視幫助
docker-compose -h

# -f  指定使用的 Compose 模板檔案,預設為 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d 

#啟動所有容器,-d 將會在後臺啟動並執行所有的容器
docker-compose up -d

#停用移除所有容器以及網路相關
docker-compose down

#檢視服務容器的輸出
docker-compose logs

#列出專案中目前的所有容器
docker-compose ps

#構建(重新構建)專案中的服務容器。服務容器一旦構建後,將會帶上一個標記名,例如對於 web 專案中的一個 db 容器,可能是 web_db。可以隨時在專案目錄下執行 docker-compose build 來重新構建服務
docker-compose build

#拉取服務依賴的映象
docker-compose pull

#重啟專案中的服務
docker-compose restart

#刪除所有(停止狀態的)服務容器。推薦先執行 docker-compose stop 命令來停止容器。
docker-compose rm 

#在指定服務上執行一個命令。
docker-compose run ubuntu ping docker.com

#設定指定服務執行的容器個數。通過 service=num 的引數來設定數量
docker-compose scale web=3 db=2

#啟動已經存在的服務容器。
docker-compose start

#停止已經處於執行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。
docker-compose stop		

快速入門

通過搭建一個WordPress來熟悉compose的使用
https://hub.docker.com//wordpress/
https://hub.docker.com/
/mysql/

編寫docker-compose.yml檔案
docker-compose.yml 檔案是 Compose 使用的主模板檔案,包含三大概念:Services、networks、Volumes
一個service代表一個container,這個container可以從dockerhub的image來建立,或者從本地的Dockerfile build出來的image來建立,Service的啟動類似docker run,我們可以給其指定network和volume,所以可以給service指定network和volume的引用。

version: '3'

services:

  wordpress:
	image: wordpress
	restart: always
	ports:
	  - 8080:80
	environment:
	  WORDPRESS_DB_HOST: mysql
	  WORDPRESS_DB_PASSWORD: root
	networks:
	  - my-bridge

  mysql:
	image: mysql:5.7
	restart: always
	environment:
	  MYSQL_ROOT_PASSWORD: root
	  MYSQL_DATABASE: wordpress
	volumes:
	  - mysql-data:/var/lib/mysql
	networks:
	  - my-bridge

volumes:
  mysql-data:


networks:
  my-bridge:
	driver: bridge

上述檔案中的定義等價於在命令列中手動啟動WordPress和mysql容器:

docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7
docker run -d --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress 

啟動應用:

# docker-compose up -d
Creating network "tmp_my-bridge" with driver "bridge"
Creating tmp_wordpress_1 ... done
Creating tmp_mysql_1     ... done

這樣就成功了,然後瀏覽器訪問http://host-ip:8080即可
在這裡插入圖片描述

服務後臺啟動後檢視狀態:

# docker-compose ps 
     Name                    Command               State          Ports        
-------------------------------------------------------------------------------
tmp_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp 
tmp_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp

# docker-compose logs
Attaching to tmp_wordpress_1, tmp_mysql_1
wordpress_1  | WordPress not found in /var/www/html - copying now...
wordpress_1  | Complete! WordPress has been successfully copied to /var/www/html
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | [Wed Dec 12 02:11:39.611507 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.13 configured -- resuming normal operations
....

注意:這裡最好不要使用mysql最新的映象,因為在MySQL 8.0以上版本中,caching_sha2_password取代了mysql_native_password成為預設的身份驗證外掛,執行中會報MySQL Connection Error: (2002) Connection refused的錯誤

docker-compose.yml參考

每個docker-compose.yml必須定義image或者build中的一個,其它的是可選的。

image
指定映象tag或者ID:

image: wordpress
image: mysql:5.7

build
用來指定一個包含Dockerfile檔案的路徑。一般是當前目錄.

build: ./dir
---------------
build:
    context: ./dir
    dockerfile: Dockerfile
    args:
        buildno: 1

context為路徑,dockerfile為需要替換預設docker-compose的檔名,args為構建(build)過程中的環境變數,用於替換Dockerfile裡定義的ARG引數,容器中不可用

command
覆蓋容器啟動後預設執行的命令

command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]

links
用於連結另一容器服務,如需要使用到另一容器的mysql服務。可以給出服務名和別名;也可以僅給出服務名,這樣別名將和服務名相同。同docker run --link

links:
 - db
 - db:mysql
 - redis

使用了別名將自動會在容器的/etc/hosts檔案裡建立相應記錄:

172.17.2.186  db
172.17.2.186  mysql
172.17.2.187  redis

ports
用於暴露埠。同docker run -p

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

expose
expose提供container之間的埠訪問,不會暴露給主機使用。同docker run --expose

expose:
 - "3000"
 - "8000"

volumes
掛載資料卷。同docker run -v

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

volumes_from
掛載資料卷容器,掛載是容器。同docker run --volumes-from

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name

environment
新增環境變數。同docker run -e。可以是陣列或者字典格式:

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

logs
日誌輸出資訊

--no-color          單色輸出,不顯示其他顏.
-f, --follow        跟蹤日誌輸出,就是可以實時檢視日誌
-t, --timestamps    顯示時間戳
--tail              從日誌的結尾顯示,--tail=200

extra_hosts
新增主機名對映。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

將會在/etc/hosts建立記錄:

162.242.195.82  somehost
50.31.209.229   otherhost

參考連結

https://www.cnblogs.com/52fhy/p/5991344.html
https://hub.docker.com//wordpress/
https://hub.docker.com/
/mysql/