1. 程式人生 > >Docker之Compose服務編排

Docker之Compose服務編排

pause nod service server 控制 leo name class spa

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

說明:Compose是Fig的升級版,Fig已經不再維護。Compose向下兼容Fig,所有fig.yml只需要更名為docker-compose.yml即可被Compose使用。

服務編排工具使得Docker應用管理更為方便快捷。 Compose網站:https://docs.docker.com/compose/

安裝Compose:

# 方法一:
$ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

# Linux下等效於
$ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose; chmod +x /usr/local/bin/docker-compose

# 方法二:使用pip安裝,版本可能比較舊
$ yum install python-pip python-dev
$ pip install docker-compose

# 方法三:作為容器安裝
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

# 方法四:離線安裝
# 下載[docker-compose-Linux-x86_64](https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64),然後重新命名添加可執行權限即可:
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose;
$ chmod +x /usr/local/bin/docker-compose
# 百度雲地址: http://pan.baidu.com/s/1slEOIC1 密碼: qmca
# docker官方離線地址:https://dl.bintray.com/docker-compose/master/

安裝完成後可以查看版本:

# docker-compose --version
docker-compose 1.8.1

升級

如果你使用的是 Compose 1.2或者早期版本,當你升級完成後,你需要刪除或者遷移你現有的容器。這是因為,1.3版本, Composer 使用 Docker 標簽來對容器進行檢測,所以它們需要重新創建索引標記。

卸載

$ rm /usr/local/bin/docker-compose

# 卸載使用pip安裝的compose
$ pip uninstall docker-compose

Compose區分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1沒有聲明版本默認是"version 1"。Version 1將來會被棄用。

版本1指的是忽略version關鍵字的版本;版本2必須在行首添加version: ‘2‘

入門示例

一般步驟

1、定義Dockerfile,方便遷移到任何地方;
2、編寫docker-compose.yml文件;
3、運行docker-compose up啟動服務

示例

準備工作:提前下載好鏡像:

docker pull mysql
docker pull wordpress

需要新建一個空白目錄,例如wptest。新建一個docker-compose.yml

version: ‘2‘
services:
    web: 
      image: wordpress:latest 
      links: 
        - db
      ports: 
        - "8002:80"
      environment:
        WORDPRESS_DB_HOST: db:3306
        WORDPRESS_DB_PASSWORD: 123456
    db: 
      image: mysql 
      environment: 
        - MYSQL_ROOT_PASSWORD=123456

以上命令的意思是新建db和wordpress容器。等同於:

$ docker run --name db -e MYSQL_ROOT_PASSWORD=123456 -d mysql
$ docker run --name some-wordpress --link db:mysql -p 8002:80 -d wordpress

註意,如果你是直接從fig遷移過來的,且weblinks- db:mysql,這裏會提示沒有給wordpress設置環境變量,這裏需要添加環境變量WORDPRESS_DB_HOSTWORDPRESS_DB_PASSWORD

好,我們啟動應用:

# docker-compose up
Creating wptest_db_1...
Creating wptest_wordpress_1...
Attaching to wptest_db_1, wptest_wordpress_1
wordpress_1 | Complete! WordPress has been successfully copied to /var/www/html

就成功了。瀏覽器訪問 http://localhost:8002(或 http://host-ip:8002)即可。

默認是前臺運行並打印日誌到控制臺。如果想後臺運行,可以:

docker-compose up -d

服務後臺後,可以使用下列命令查看狀態:

# docker-compose ps
       Name                      Command               State          Ports         
-----------------------------------------------------------------------------------
figtest_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp             
figtest_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8002->80/tcp 

# docker-compose logs
Attaching to wptest_wordpress_1, wptest_db_1
db_1        | 2016-10-4T14:38:46.98030Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1        | 2016-10-4T14:38:46.99974Z 0 [Note] mysqld (mysqld 5.7.15) starting as process 1 ...
db_1        | 2016-10-4T14:38:46.27191Z 0 [Note] InnoDB: PUNCH HOLE support available

停止服務:

# docker-compose stop
Stopping wptest_wordpress_1...
Stopping wptest_db_1...

重新啟動服務:

docker-compose restart

docker-compose.yml參考

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

image

指定鏡像tag或者ID。示例:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

註意,在version 1裏同時使用imagebuild是不允許的,version 2則可以,如果同時指定了兩者,會將build出來的鏡像打上名為image標簽。

build

用來指定一個包含Dockerfile文件的路徑。一般是當前目錄.。Fig將build並生成一個隨機命名的鏡像。

註意,在version 1bulid僅支持值為字符串。version 2裏支持對象格式。

build: ./dir

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

context為路徑,dockerfile為需要替換默認docker-compose的文件名,args為構建(build)過程中的環境變量,用於替換Dockerfile裏定義的ARG參數,容器中不可用。示例:
Dockerfile:

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

docker-compose.yml:

build:
  context: .
  args:
    buildno: 1
    password: secret

build:
  context: .
  args:
    - buildno=1
    - password=secret

command

用來覆蓋缺省命令。示例:

command: bundle exec thin -p 3000

command也支持數組形式:

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
 - container:container_name:rw

container:container_name格式僅支持version 2

environment

添加環境變量。同docker run -e。可以是數組或者字典格式:

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

depends_on

用於指定服務依賴,一般是mysql、redis等。
指定了依賴,將會優先於服務創建並啟動依賴。

links也可以指定依賴。

external_links

鏈接搭配docker-compose.yml文件或者Compose之外定義的服務,通常是提供共享或公共服務。格式與links相似:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

註意,external_links鏈接的服務與當前服務必須是同一個網絡環境。

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

extends

繼承自當前yml文件或者其它文件中定義的服務,可以選擇性的覆蓋原有配置。

extends:
  file: common.yml
  service: webapp

service必須有,file可選。service是需要繼承的服務,例如webdatabase

net

設置網絡模式。同docker的--net參數。

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

dns

自定義dns服務器。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir

這些命令都是單個值,含義請參考docker run。

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
mem_limit: 128M
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

命令行參考

$ docker-compose
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don‘t check the daemon‘s hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pulls service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

批處理腳本

# 關閉所有正在運行容器
docker ps | awk  ‘{print $1}‘ | xargs docker stop

# 刪除所有容器應用
docker ps -a | awk  ‘{print $1}‘ | xargs docker rm
# 或者
docker rm $(docker ps -a -q)

參考:
1、Overview of Docker Compose - Docker
https://docs.docker.com/compose/overview/
2、library/mysql - Docker Hub
https://hub.docker.com/_/mysql/
3、library/wordpress - Docker Hub
https://hub.docker.com/_/wordpress/

Docker之Compose服務編排