一、安装

$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

如果curl 命令无法下载,可在https://github.com/docker/compose/releases网站点下载,再使用:

[root@localhost ~]# mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
测试安装:

[root@myregistrydomain bin]# docker-compose --version
docker-compose version 1.23.2, build 1110ad01

升级:$ docker-compose migrate-to-labels

删除: $ sudo rm /usr/local/bin/docker-compose

二、配置python应用
1、创建一个临时目录

$ mkdir composetest
$ cd composetest

2、创建一个app.py

import time

import redis
from flask import Flask


app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

redis等第三方工具也可以预先安装好,配置上可用的host与port。

3、创建 requirements.txt 文件

flask
redis

4、创建 Dockerfile

FROM python:3.7.2
ADD . /root/app
WORKDIR /root/app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

5、创建docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:latest"

6、运行docker-compose.yml

$ docker-compose up
Building web
Step 1/6 : FROM python:3.7.2
 ---> ad01f54ca3a9
Step 2/6 : RUN mkdir -p /root/app
 ---> Running in 6dfd4c0db49b

 ---> 0c8d4fa45f8b
Removing intermediate container 6dfd4c0db49b
Step 3/6 : ADD . /root/app
 ---> 7b746ad08b96
Removing intermediate container d8c5a1680274
Step 4/6 : WORKDIR /root/app
 ---> 4d10074d895d
Removing intermediate container dfaa7afd83f1
Step 5/6 : RUN pip install -r requirements.txt
 ---> Running in ed78df8f448c

Collecting flask (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)

....

redis_1  | 1:M 27 Dec 21:59:07.907 * Ready to accept connections
web_1    |  * Serving Flask app "app" (lazy loading)
web_1    |  * Environment: production
web_1    |    WARNING: Do not use the development server in a production environment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: on
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    |  * Debugger is active!
web_1    |  * Debugger PIN: 278-298-439
web_1    | 172.18.0.1 - - [27/Dec/2018 22:05:41] "GET / HTTP/1.1" 500 -

7、测试

[root@localhost componsetest]# curl http://localhost:5000
Hello World! I have been seen 1 times.
[root@localhost componsetest]# curl http://localhost:5000
Hello World! I have been seen 2 times.

三、docker-compose操作命令

-f指定的文件或路径

$ docker-compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db

docker-compose.yml指定一个webapp服务

webapp:
  image: examples/web
  ports:
    - "8000:8000"
  volumes:
    - "/data"

docker-compose.admin.yml可以做为webapp的附加服务配置,如果与前面的docker-compose.yml文件配置重复,会覆盖上面的文件配置。

webapp:
  build: .
  environment:
    - DEBUG=1

所有命令行如下:

Command:
  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
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull 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
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

$ docker-compose up -d  #compose以守护进程模式运行加-d选项

$ docker-compose stop

$ docker-compose restart

$ docker-compose logs redis #查看compose日志

$ docker-compose run services cmd #对容器执行命令(一次)

$ docker-compose run web env #查看web容器环境变量

四、docker-compose.yml配置

compose 文件是一个定义服务、 网络和卷的 YAML 文件 。Compose 文件的默认路径是 ./docker-compose.yml,服务定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数一样 docker container create。同样,网络和卷的定义类似于 docker network create 和 docker volume create。正如 docker container create 在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,你不需要再次指定它们docker-compose.yml。可以使用 Bash 类 ${VARIABLE} 语法在配置值中使用环境变量。

提示: 可以是用 .yml 或 .yaml 作为文件扩展名

1、bulid

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。

build: /path/to/build/dir

也可以是相对路径:

build: ./dir

设定上下文根目录,然后以该目录为准指定 Dockerfile

build:
  context: ../
  dockerfile: path/of/Dockerfile

2、context

context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的url,当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context

build:
  context: ./dir

3、 dockerfile

使用此 dockerfile 文件来构建,必须指定构建路径

build:
  context: .
  dockerfile: Dockerfile-alternate

4、image

services:
  web:
    image: nginx

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd

5. args

添加构建参数,这些参数是仅在构建过程中可访问的环境变量,首先, 在Dockerfile中指定参数:

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

然后指定 build 下的参数,可以传递映射或列表

build:
  context: .
  args:
    fendo: 1
    password: fendo

build:
  context: .
  args:
    - fendo=1
    - password=fendo

指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值

args:
  - fendo
  - password

YAML中的布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。

6、command

使用 command 可以覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

该命令也可以是一个列表,方法类似于 dockerfile:

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

7、container_name

Compose 的容器名称格式是:<项目名称><服务名称><序号>

虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:

container_name: app
这样容器的名字就指定为 app 了。

8、depends_on

在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。

例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。

9、pid

pid: "host"

将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。

10、ports

映射端口的标签。

使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

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

注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
11.extra_hosts

添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker client的--add-host类似:

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

启动之后查看容器内部hosts:

162.242.195.82  somehost
50.31.209.229   otherhost

12.volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。
Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。

数据卷的格式可以是下面多种形式:

volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
   // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
   // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
   // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
   // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql
如果你不使用宿主机的路径,你可以指定一个volume_driver。

volume_driver: mydriver


 

参考:

https://docs.docker.com/compose/overview/

https://github.com/docker/compose/releases

12-28 16:58