From:https://docs.docker.com/compose/gettingstarted/

Docker Compose介绍

Docker Compose是一个定义和运行多容器应用的单机编排工具。通过Docker Compose你可以使用一个单一的YAML文件来配置多个应用服务,通过一条命令,就可以将所有配置的服务全部启动起来。

使用Docker Compose的三个步骤:
使用Dockerfile定义环境,这样可以确保其在任意地方运行
使用docker-compose.yml文件定义服务,这样它们就可以在独立环境中一起运行
运行docker-compose up使用docker-compose启动所有应用
Docker Compose可以管理应用的整个生命周期:
启动、停止、重建服务
查看服务的运行状态
流式输出服务日志
对服务执行一次性命令

Docker Compose使用

二进制安装

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

定义应用程序依赖项

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是应用程序网络上redis容器的主机名。我们使用Redis的默认端口6379。
处理瞬态错误
请注意get_hit_count函数的编写方式。如果redis服务不可用,这个基本的重试循环允许我们多次尝试我们的请求。这在应用程序联机时启动时非常有用,但如果需要在应用程序生命周期内的任何时间重新启动Redis服务,这也会使我们的应用程序更具弹性。在群集中,这还有助于处理节点之间的瞬时连接丢弃。
3、创建requirements.txt项目目录中调用的另一个文件并将其粘贴到:
flask
redis

创建Dockerfile

在此步骤中,您将编写一个构建Docker镜像的Dockerfile。该图像包含Python应用程序所需的所有依赖项,包括Python本身。
在项目目录中,创建一个名为的文件Dockerfile并粘贴以下内容:
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD [“python”, “app.py”]
这告诉Docker:
从Python 3.4映像开始构建映像。
将当前目录添加.到/code映像中的路径中。
将工作目录设置为/code。
安装Python依赖项。
将容器的默认命令设置为python app.py。
有关如何编写Dockerfiles的更多信息,请参阅Docker用户指南Dockerfile参考

在Compose文件中定义服务

创建docker-compose.yml项目目录中调用的文件并粘贴以下内容:
version: ‘3’
services:
web:
build: .
ports:
- “5000:5000”
redis:
image: “redis:alpine”
此Compose文件定义了两个服务,web和redis。该web服务:

  • 使用从Dockerfile当前目录中构建的图像。

  • 将容器上的公开端口5000转发到主机上的端口5000。我们使用Flask Web服务器的默认端口5000。

该redis服务使用从Docker Hub注册表中提取的公共 Redis映像。

使用Compose构建并运行您的应用程序

1、从项目目录中,通过运行启动应用程序docker-compose up
[root@c7docker1 composetest]# docker-compose up
Creating network “composetest_default” with the default driver
Building web
Step 1/5 : FROM python:3.4-alpine
—-> 70e8d5e8a1cb
Step 2/5 : ADD . /code
—-> c9dbc5276ebf
Step 3/5 : WORKDIR /code
—-> Running in 22db1dea3e28
Removing intermediate container 22db1dea3e28
—-> 48076222c960
Step 4/5 : RUN pip install -r requirements.txt
—-> Running in 2e2abdf6c9e1
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)
Collecting redis (from -r requirements.txt (line 2))
Downloading https://files.pythonhosted.org/packages/f5/00/5253aff5e747faf10d8ceb35fb5569b848cde2fdc13685d42fcf63118bbc/redis-3.0.1-py2.py3-none-any.whl (61kB)
Collecting itsdangerous>=0.24 (from flask->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Jinja2>=2.10 (from flask->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl (126kB)
Collecting click>=5.1 (from flask->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Werkzeug>=0.14 (from flask->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/ac/7e/1b4c2e05809a4414ebce0892fe1e32c14ace86ca7d50c70f00979ca9b3a3/MarkupSafe-1.1.0.tar.gz
Building wheels for collected packages: MarkupSafe
Running setup.py bdist_wheel for MarkupSafe: started
Running setup.py bdist_wheel for MarkupSafe: finished with status ‘done’
Stored in directory: /root/.cache/pip/wheels/81/23/64/51895ea52825dc116a55f37043f49be0939bcf603de54e5cde
Successfully built MarkupSafe
Installing collected packages: itsdangerous, MarkupSafe, Jinja2, click, Werkzeug, flask, redis
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0 redis-3.0.1
Removing intermediate container 2e2abdf6c9e1
—-> 418fc4703b14
Step 5/5 : CMD [“python”, “app.py”]
—-> Running in 27b72fc6769f
Removing intermediate container 27b72fc6769f
—-> 995db1c19e70
Successfully built 995db1c19e70
Successfully tagged composetest_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use docker-compose build or docker-compose up --build.
Creating composetest_web_1 … done
Creating composetest_redis_1 … done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 07 Dec 2018 02:35:04.505 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 07 Dec 2018 02:35:04.506 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 07 Dec 2018 02:35:04.506 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 07 Dec 2018 02:35:04.513 Running mode=standalone, port=6379.
redis_1 | 1:M 07 Dec 2018 02:35:04.513 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 07 Dec 2018 02:35:04.513 # Server initialized
redis_1 | 1:M 07 Dec 2018 02:35:04.514
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: 695-669-523

[root@c7docker1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae9c0a84eed0 composetest_web “python app.py” About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp composetest_web_1
fb97aa0a10bc redis:alpine “docker-entrypoint.s…” About a minute ago Up About a minute 6379/tcp composetest_redis_1

Compose拉取Redis图像,为您的代码构建图像,并启动您定义的服务。在这种情况下,代码在构建时静态复制到映像中。

2、在浏览器中输入http://0.0.0.0:5000/以查看正在运行的应用程序。
如果您在Linux,Docker for Mac或Docker for Windows上本机使用Docker,那么Web应用程序现在应该在Docker守护程序主机上的端口5000上进行侦听。指向您的Web浏览器http://localhost:5000以查找Hello World消息。如果这不能解决,您也可以尝试http://0.0.0.0:5000。
如果您在Mac或Windows上使用Docker Machine,请使用docker-machine ip MACHINE_VM获取Docker主机的IP地址。然后,http://MACHINE_VM_IP:5000在浏览器中打开
您应该在浏览器中看到一条消息:
Hello World! I have been seen 1 times.
Docker Compose单机容器编排 - 图1
3、刷新页面,数字应该增加。
Hello World! I have been seen 2 times.
Docker Compose单机容器编排 - 图2

4、切换到另一个终端窗口,然后键入docker image ls以列出本地图像.
[root@c7docker1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 995db1c19e70 15 minutes ago 77.2MB
redis alpine 84aab155ab74 8 days ago 40.9MB
nginx latest 568c4670fa80 9 days ago 109MB
python 3.4-alpine 70e8d5e8a1cb 2 weeks ago 65.8MB
mysql 5.6 a876cc5d29e4 3 weeks ago 256MB
httpd latest 2a51bb06dc8b 3 weeks ago 132MB
centos 7 75835a67d134 8 weeks ago 200MB
busybox latest 59788edf1f3e 2 months ago 1.15MB

  1. 通过docker-compose down 在第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按CTRL + C来停止应用程序

编辑Compose文件以添加绑定装载

编辑docker-compose.yml在项目目录添加绑定安装的web服务:
version: ‘3’
services:
web:
build: .
ports:
- “5000:5000”
volumes:
- .:/code
redis:
image: “redis:alpine”
新volumes密钥将主机上的项目目录(当前目录)/code安装到容器内,允许您动态修改代码,而无需重建映像

使用Compose重新构建并运行应用程序

重新构建

root@c7docker1 composetest]# docker-compose up -d
Creating network “composetest_default” with the default driver
Building web
Step 1/5 : FROM python:3.4-alpine
—-> 70e8d5e8a1cb
Step 2/5 : ADD . /code
—-> a7e686067b21
Step 3/5 : WORKDIR /code
—-> Running in 04c695289517
Removing intermediate container 04c695289517
—-> dfde25710440
Step 4/5 : RUN pip install -r requirements.txt
……

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

更新应用程序

由于应用程序代码现在使用卷安装到容器中,因此您可以更改其代码并立即查看更改,而无需重建映像。
1、更改问候语app.py并保存。例如,将Hello World!邮件更改为Hello from Docker!:
return ‘Hello from Docker! I have been seen {} times.\n’.format(count)
2、在浏览器中刷新应用程序。问候语应该更新,计数器仍然应该递增。
Docker Compose单机容器编排 - 图3

Docker Compose常用命令说明

在上面的一个简单示例中,我们已经使用了docker-compose up来启动一个docker-compose.yml文件定义的服务。我们刚刚通过docker-compose up虽然启动了服务,当是docker-compose指令却在前台执行,如果需要将其放入后台运行,可以使用-d参数:
[root@c7docker1 composetest]# docker-compose up -d
Creating network “composetest_default” with the default driver
Creating composetest_web_1 … done
Creating composetest_redis_1 … done
[root@c7docker1 composetest]#

docker-compose up还可以使用—scale参数实现服务的扩缩容:
[root@c7docker1 composetest]# docker-compose up -d —scale redis=2
composetest_web_1 is up-to-date
Starting composetest_redis_1 … done
Creating composetest_redis_2 … done
[root@c7docker1 composetest]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8aa0c1645c73 redis:alpine “docker-entrypoint.s…” 9 seconds ago Up 6 seconds 6379/tcp composetest_redis_2
57f7c8dc8a18 redis:alpine “docker-entrypoint.s…” 56 seconds ago Up 50 seconds 6379/tcp composetest_redis_1
157da4f9fdf1 composetest_web “python app.py” 56 seconds ago Up 50 seconds 0.0.0.0:5000->5000/tcp composetest_web_1

通过-f选项指定compose文件:
[root@c7docker1 composetest]# docker-compose -f docker-compose-demo.yml up -d
Creating network “composetest_default” with the default driver
Creating composetest_redis_1 … done
Creating composetest_web_1 … done

1、docker-compose ps
[root@c7docker1 composetest]# docker-compose ps
Name Command State Ports
——————————————————————————————————————————-
composetest_redis_1 docker-entrypoint.sh redis … Up 6379/tcp
composetest_web_1 python app.py Up 0.0.0.0:5000->5000/tcp

2、docker-compose stop
[root@c7docker1 composetest]# docker-compose stop
Stopping composetest_redis_1 … done
Stopping composetest_web_1 … done

3、Docker-compose start
[root@c7docker1 composetest]# docker-compose start
Starting web … done
Starting redis … done

4、Docker-compose restart
[root@c7docker1 composetest]# docker-compose restart
Restarting composetest_redis_1 … done
Restarting composetest_web_1 … done

5、Docker-compose run [command]
[root@c7docker1 composetest]# docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2d9ca9109a8f
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.9
PYTHON_PIP_VERSION=18.1
HOME=/root

6、Docker-compose down
[root@c7docker1 composetest]# docker-compose down
Stopping composetest_redis_1 … done
Stopping composetest_web_1 … done
Removing composetest_web_run_447d78db00df … done
Removing composetest_redis_1 … done
Removing composetest_web_1 … done
Removing network composetest_default
通过—volumes还会删除自动挂载的容器卷
[root@c7docker1 composetest]# docker-compose down —volumes
Stopping composetest_redis_1 … done
Stopping composetest_web_1 … done
Removing composetest_redis_1 … done
Removing composetest_web_1 … done
Removing network composetest_default
[root@c7docker1 composetest]# docker volume ls
DRIVER VOLUME NAME

7、Docker-compose build/docker-compose up —build /docker-compose up -d —build
默认情况下,我们写好了Dockerfile,第一次通过docker-compose启动的时候,会自动完成构建,但如果随后Dockerfile发生了改动,再次通过docker-compose来启动实现更新的话,docker-compose不会再次自动构建镜像,而是复用第一次生成的镜像,如果希望镜像能够被重新构建,需要单独执行docker-compose build 或者docker-compose up —build or docker-compose up -d —build

8、Docker-compose top
[root@c7docker1 composetest]# docker-compose top
composetest_redis_1
UID PID PPID C STIME TTY TIME CMD
————————————————————————————————-
100 106147 106128 1 11:42 ? 00:00:00 redis-server

composetest_web_1
UID PID PPID C STIME TTY TIME CMD
—————————————————————————————————————————
root 106118 106093 9 11:42 ? 00:00:00 python app.py
root 106266 106118 6 11:42 ? 00:00:00 /usr/local/bin/python app.py

9、Docker-compose kill
[root@c7docker1 composetest]# docker-compose kill web
Killing composetest_web_1 … done
[root@c7docker1 composetest]# docker-compose ps
Name Command State Ports
—————————————————————————————————————
composetest_redis_1 docker-entrypoint.sh redis … Up 6379/tcp
composetest_web_1 python app.py Exit 137

10、Docker-compose logs
[root@c7docker1 composetest]# docker-compose logs
Attaching to composetest_redis_1, composetest_web_1
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: 214-718-333
redis_1 | 1:C 07 Dec 2018 03:42:40.012 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 07 Dec 2018 03:42:40.015 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 07 Dec 2018 03:42:40.015 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 07 Dec 2018 03:42:40.032
Running mode=standalone, port=6379.
redis_1 | 1:M 07 Dec 2018 03:42:40.032 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 07 Dec 2018 03:42:40.032 # Server initialized
redis_1 | 1:M 07 Dec 2018 03:42:40.032 * Ready to accept connections

Docker Compose文件详解

Compose和Docker兼容性矩阵

撰写文件格式 Docker Engine版本
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

services

我们上面所说的所有服务的定义都是定义在services区域中,接下来,我们学习下services下常用的配置项

image

标明image的ID,这个image ID可以是本地也可以是远程的,如果本地不存在,compose会尝试pull下来
示例:
image: ubuntu
image: hub.dz11.com/library/tomcat:8

build

该参数指定Dockerfile文件的路径,compose会通过Dockerfile构建并生成镜像,然后使用该镜像
示例:
build: /path/to/build/dir

command

重写默认的命令,或者说指定启动容器的命令
示例:
command: “/run.sh”

links

链接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称
示例:
links:
- db
- db:database
- redis
此时,在容器内部,会在/etc/hosts文件中用别名创建几个条目,如下:
172.17.2.100 db
172.17.2.100 database
172.17.2.100 redis

external_links

链接到compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法
示例:
external_links:
- redis_1
- project_db_1: mysql
- project_db_2: postgresql

ports

暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口
注:当以 主机:容器 的形式来映射端口时,如果使容器的端口小于60,那可能会出现错误,因为YAML会将 xx:yy这样格式的数据解析为六十进制的数据,基于这个原因,时刻记得要将端口映射明确指定为字符串
示例:
ports:
- “3000”
- “8000:8000”
- “49100:22”
- “127.0.0.1:8001:8001”

expose

暴露端口,但不需要建立与宿主机的映射,只是会向链接的服务提供
示例:
expose:
- “3000”
- “8000”

environment

加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值
示例:
environment:
RACK_ENV: development
SESSION_SECRET:

environment:
- RACK_ENV: development
- SESSION_SECRET:

env_file

从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值
示例:
env_file:
- env

cat env
RACK_ENV: development

depends_on

定义当前服务启动时,依赖的服务,当前服务会在依赖的服务启动后启动
depends_on:
- redis

deploy

该配置项在version 3里才引入,用于指定服务部署和运行时相关的参数
version: ‘3’
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure

下面是deploy中常用参数的说明
replicas
指定副本数:
version: ‘3’
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
replicas: 6

restart_policy
指定重启策略:
version: “3”
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure #重启条件:on-failure, none, any
delay: 5s # 等待多长时间尝试重启
max_attempts: 3 #尝试的次数
window: 120s # 在决定重启是否成功之前等待多长时间

update_config
定义更新服务的方式,常用于滚动更新
version: ‘3.4’
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2 # 一次更新2个容器
delay: 10s # 开始下一组更新之前,等待的时间
failure_action:pause # 如果更新失败,执行的动作:continue, rollback, pause,默认为pause
max_failure_ratio: 20 # 在更新过程中容忍的失败率
order: stop-first # 更新时的操作顺序,停止优先(stop-first,先停止旧容器,再启动新容器)还是开始优先(start-first,先启动新容器,再停止旧容器),默认为停止优先,从version 3.4才引入该配置项

resources

限制服务资源:
version: ‘3’
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: ‘0.50’
memory: 50M
reservations:
cpus: ‘0.25’
memory: 20M

healthcheck

执行健康检查
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost“] # 用于健康检查的指令
interval: 1m30s # 间隔时间
timeout: 10s # 超时时间
retries: 3 # 重试次数
start_period: 40s # 启动多久后开始检查

network_mode

网络类型,可指定容器运行的网络类型
示例:
network_mode: “bridge”
network_mode: “host”
network_mode: “none”

dns

自定义dns服务
示例:
dns: 8.8.8
dns:
- 223.5.5.5
- 223.6.6.6

networks

网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。
在networks中定义一个名为app_net,类型为driver的网络:
version: ‘2’

services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10

networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
-
subnet: 172.16.238.0/24
-
gateway: 172.168.238.254

volumes

version: “3.2”
services:
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static

db:
image: postgres:latest
volumes:
- “/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock”
- “dbdata:/var/lib/postgresql/data”

volumes:
mydata:
dbdata:

Docker Compose案例实践

使用Docker Compose一键部署zabbix
version: ‘3’
services:
mysql-server:
hostname: mysql-server
container_name: mysql-server
image: mysql:5.7
network_mode: host
volumes:
- /data/mysql5721/data:/var/lib/mysql
command: —character-set-server=utf8
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix

zabbix-web-nginx-mysql:
hostname: zabbix-web-nginx-mysql
container_name: zabbix-web-nginx-mysql
image: zabbix/zabbix-web-nginx-mysql:alpine-3.4.11
network_mode: host
depends_on:
- mysql-server
- zabbix-server
ports:
- 80:80
environment:
DB_SERVER_HOST: 127.0.0.1
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: 123456
ZBX_SERVER_HOST: 127.0.0.1
PHP_TZ: Asia/Shanghai

zabbix-server:
hostname: zabbix-server-mysql
container_name: zabbix-server-mysql
image: zabbix/zabbix-server-mysql:alpine-3.4.11
depends_on:
- mysql-server
network_mode: host
ports:
- 10051:10051
environment:
DB_SERVER_HOST: 127.0.0.1
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: 123456

zabbix-agent:
hostname: zabbix-agent
container_name: zabbix-agent
image: zabbix/zabbix-agent:alpine-3.4.11
network_mode: host
environment:
ZBX_HOSTNAME: monitor
ZBX_SERVER_HOST: 127.0.0.1