摘要:然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。现在介绍文件的语法及相关配置。使用指令指定文件名。解决容器的依赖启动先后的问题。当容器停止时,挂载会被移除。其他其他设置如,基本同命令中的格式与功能。
前面的几篇笔记中,只说明了如何使用单个镜像和容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
那容器之间是怎样通信的呢?多个容器之间的管理、通信也就是所谓的容器编排。容器编排常使用的工具有docker-compose、kubernetes、swarm等。其中docker-compose是面对单机容器编排最常用的工具。
现在介绍docker-compose文件的语法及相关配置。基本配置同docker的run命令中的参数,如CMD、EXPOSE、VOLUME、EVN等等。
一个docker—compose包含多个服务,每个服务都必须通过 image 指令指定镜像或 build 指令( 需要 Dockerfile) 等来自动构建生成镜像。
常用配置选项 build指定 Dockerfile 所在文件夹的路径( 可以是绝对路径,或者相对 docker-compose.yml 文件的路径) 。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
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 还是可以看到所有值的。
version: "2.0" services: app: build: context: ./dir dockerfile: your_docker_file_name args: arg_name: arg_value
使用 cache_from 指定构建镜像的缓存
build: context: ./dir cache_from: - img1:tag1 - img2:tag2command
覆盖容器启动后默认执行的命令
command: echo "hello world"configs
见 swarm mode
cgroup_parent制定父cgroup组,意味着将继承该组的资源限制
cgroup_parent: cgroups_1container_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 - 8796ports
映射端口,格式 宿主端口:容器端口。
ports: - 5421:5445memory
我们可以限制容器的内存使用
mem_limit: 1G //限制容器的内存使用量最大为1Gextra_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 dockerhubhealthcheck
通过命令检查容器是否健康运行
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3image
制定基础镜像
links连接其他容器,不推荐使用,但抵不住它方便啊
links: - container1:alias1 - container2:alias2external_links
在使用Docker过程中,我们会有许多多带带使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。 格式如下:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresqlloggins
配置日志选项
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: network2volumes
数据卷所挂载路径设置。可以设置宿主机路径 (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 挂载。
labellabels: - 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构建的镜像
上一节: Docker 笔记(2):Dockerfile
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27453.html
摘要:使用构建一个创建一个文件夹创建脚本这个脚本使用了和的包,并且启动了一个服务端口创建构建的由于在的时候,默认会去官方去获取,国内是无法访问的,所以这里使用了的镜像去下载包。 使用docker-compose构建一个python-web app 创建一个文件夹 python-web-app $mkdir python-web-app $cd python-web-app 2.创建pytho...
摘要:时间年月日星期六说明本文部分内容均来自慕课网。必填用于执行命令,当执行完毕后,将产生一个新的文件层。可选指定此镜像启动时默认执行命令。可选用于指定需要暴露的网络端口号。可选向镜像中挂载一个卷组。 时间:2017年09月16日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com 教学源码:无 学习源码:无 第一章:课程简介 1-1 课程介绍 Docke...
摘要:概述是一个用来定义和运行复杂应用的工具。使用,用户通过来进行构建。使用,不再需要使用脚本来启动容器。在配置文件中,所有的容器通过来定义,然后通过脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。 概述 Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成...
摘要:概述是一个用来定义和运行复杂应用的工具。使用,用户通过来进行构建。使用,不再需要使用脚本来启动容器。在配置文件中,所有的容器通过来定义,然后通过脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。 概述 Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成...
阅读 2026·2019-08-30 15:52
阅读 2389·2019-08-29 18:37
阅读 769·2019-08-29 12:33
阅读 2811·2019-08-29 11:04
阅读 1496·2019-08-27 10:57
阅读 2065·2019-08-26 13:38
阅读 2738·2019-08-26 12:25
阅读 2408·2019-08-26 12:23