Docker 笔记(3):docker-compose

前面的几篇笔记中,只说明了如何使用单个镜像和容器。然而,在平常工做中,常常会碰到须要多个容器相互配合来完成某项任务的状况。例如要实现一个 Web 项目,除了 Web 服务容器自己,每每还须要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。python

那容器之间是怎样通讯的呢?多个容器之间的管理、通讯也就是所谓的容器编排。容器编排常使用的工具备docker-compose、kubernetes、swarm等。其中docker-compose是面对单机容器编排最经常使用的工具。mysql

如今介绍docker-compose文件的语法及相关配置。基本配置同docker的run命令中的参数,如CMD、EXPOSE、VOLUME、EVN等等。web

一个docker—compose包含多个服务,每一个服务都必须经过 image 指令指定镜像或 build 指令( 须要 Dockerfile) 等来自动构建生成镜像。redis

经常使用配置选项

build

指定 Dockerfile 所在文件夹的路径( 能够是绝对路径,或者相对 docker-compose.yml 文件的路径) 。 Compose 将会利用它自动构建这个镜像,而后使用这个镜像。sql

version: '2.0'
services:
    app:
        build: .
  • 你也可使用 context 指令指定 Dockerfile 所在文件夹的路径。
  • 使用 dockerfile 指令指定 Dockerfile 文件名。
  • 使用 arg 指令指定构建镜像时的变量。
args:
    - version: 3.0

在构建命令中使用: wget http://www.docker.com/some_so...$version, 构建参数和 ENV 的效果同样,都是设置环境变量。所不一样的是,ARG 所设置的构建环境的环境变量,在未来容器运行时是不会存在这些环境变量的。可是不要所以就使用 ARG 保存密码之类的信息,由于 docker history 仍是能够看到全部值的。docker

version: '2.0'
services:
    app:
        build: 
            context: ./dir
            dockerfile: your_docker_file_name
            args:
                arg_name: arg_value

使用 cache_from 指定构建镜像的缓存shell

build:
    context: ./dir
    cache_from:
        - img1:tag1
        - img2:tag2

command

覆盖容器启动后默认执行的命令数据库

command: echo "hello world"

configs

见 swarm modejson

cgroup_parent

制定父cgroup组,意味着将继承该组的资源限制flask

cgroup_parent: cgroups_1

container_name

制定容器名称

devices

指定设备映射关系,即把外设挂载在某个目录。

devices:
    - "/dev/ttyUSB1:/dev/ttyUSB0"

depends_on

解决容器的依赖、启动前后的问题。如下例子中会先启动 redis db 再启动 web

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

    redis:
        image: redis

    db:
        image: postgres

注意: web 服务不会等待 redis db 「 彻底启动」 以后才启动。

env_file

从文件中获取环境变量,能够为单独的文件路径或列表。

env_file: .env

env_file:
    - ./common.env
    - ./apps/web.env
    - /opt/secrets.env

文件中的内容为键值对:key=value,每行一条。 若是有变量名称与 environment 指令冲突,则之后者为准。这里所说的环境变量是对宿主机的 Compose 而言的,若是在配置文件中有 build 操做,这些变量并不会进入构建过程当中,若是要在构建中使用变量仍是首选前面刚讲的 arg 标签。

environment

设置环境变量。你可使用数组或字典两种格式。

environment:
    key: value
    key: value

environment:
    - key=value
    - key=value

若是变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。咱们设置的这些环境变量,能够在后面的命令中用到,用法同shell变量,如设置了一个叫VERSION的环境变量,咱们能够在entrypoint的命令中使用,如bash echo $VERSION$

expose

暴露端口

expose:
    - 4665
    - 8796

ports

映射端口,格式 宿主端口:容器端口。

ports:
    - 5421:5445

memory

咱们能够限制容器的内存使用

mem_limit: 1G //限制容器的内存使用量最大为1G

extra_hosts

相似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。

extra_hosts:
    - "googledns:8.8.8.8"
    - "dockerhub:52.1.157.61"

会在启动后的服务容器中 /etc/hosts 文件中添加以下两条条目。

8.8.8.8 googledns
52.1.157.61 dockerhub

healthcheck

经过命令检查容器是否健康运行

healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost"]
    interval: 1m30s
    timeout: 10s
    retries: 3

image

制定基础镜像

links

链接其余容器,不推荐使用,但抵不住它方便啊

links:
    - container1:alias1
    - container2:alias2

external_links

在使用Docker过程当中,咱们会有许多单独使用docker run启动的容器,为了使Compose可以链接这些不在docker-compose.yml中定义的容器,咱们须要一个特殊的标签,就是external_links,它可让Compose项目里面的容器链接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是链接到与项目内的服务的同一个网络里面)。 格式以下:

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

loggins

配置日志选项

logging:
    driver: syslog
    options:
        syslog-address: "tcp://192.168.0.42:133"

目前支持的日志类型有:

  • syslog
  • json-file //默认,所以你使用docker inspect container_id 获得的输出是json格式的
  • none

options的参数除了syslog-address,还有max-size max-file

options:
    max-size: "200k"
    max-file: "10"

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]"

networks

配置容器链接的网络。

version: "3.0"
services:
    some-service:
        networks:
            - network1
            - network2
    networks:
        network1:
        network2

volumes

数据卷所挂载路径设置。能够设置宿主机路径 (HOST:CONTAINER ) 或加上访问模式(HOST:CONTAINER:ro )

volumes:
    - host_dir:container_dir

以后,你在volume中的读写操做,本质上都是在host的文件系统进行读写的,所以哪怕你最后把容器删除,你也能够在主机目录中访问这些数据,除非你在删除容器的同时把volume也显式删除。咱们通常用于存储须要保证安全性的数据,如数据库的data目录

tmp file

挂载临时目录到容器内部,与 run 的参数同样效果:

tmpfs: /run
tmpfs:
  - /run
  - /tmp

为了让容器可以访问数据而不须要永久地写入数据,可使用 tmpfs 挂载,该挂载仅存储在主机的内存中(若是内存不足,则为 swap)。当容器中止时,tmpfs 挂载会被移除。若是提交容器,则不会保存 tmpfs 挂载。

label

labels:
    - key:value

为生成的镜像添加描述信息。可使用inspect查看。

其余

其余设置如omainname, entrypoint, hostname, ipc, mac_address, privileged,read_only, shm_size, restart, stdin_open, tty, user, working_dir ,基本同run命令中的格式与功能。如

restart:
    always

表示当遇到任意退出的时候,都会自动重启

例子

Dockerfile

FROM python:3.6-alpine
# 复制代码到镜像
ADD . /code   
# 设置后面的命令的pwd
WORKDIR /code
# 安装依赖
RUN pip install redis flask
# 运行服务的命令
CMD ["python", "app.py"]

docker-compose.yml

# docker版本
version: '2.0'
services:
    # 一个服务,名字为web
    web:
        # 指定从Dockerfile构建,并指定上下文
        build: .
        # 指定端口映射,host_port:container_port
        ports:
            - 5000:5000
        # 等待redis服务启动后再启动web服务
        depends_on:
            - redis_srv
    # redis服务,基于镜像redis
    redis_srv:
        image: "redis:latest"

运行

docker-compose up --build
  • docker-compose up:判断是否已经有目标镜像web和redis,若是有就启动;若是没有,就构建镜像并启动容器;若是已经构建可是Dockerfile或者docker-complse.yml发生变化,就从新构建并启动。“--build”选项表示不管如何都从新构建镜像。
  • docker-compose build: 只构建镜像不运行容器
  • docker-compose rm -f: 移除当前目录下docker-compose构建的镜像

相关文章
相关标签/搜索