本文共 5857 字,大约阅读时间需要 19 分钟。
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。Compose 使用的三个步骤:
使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:
运行以下命令以下载 Docker Compose 的当前稳定版本:$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.24.1。
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose --versioncker-compose version 1.24.1, build 4667896b
compose文件格式版本 | docker版本 |
---|---|
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.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
version: '3'services: wordpress: #### 服务之一: wordpress image: wordpress:5.1 restart: always depends_on: ### 服务之间我们可以设置一个依赖. 让 wordpress 依赖下面的 db 服务. - db ports: - 8080:80 ### 让让8080这个端口的对应容器里面的80端口,这样在主机上面访问 8080 端口的时候,对应得到的就是容器里面的在 80 端口上面运行的服务 environment: WORDPRESS_DB_HOST: db ### db表示 workpress 使用的数据库的主机,这里可以把它设置成db, WORDPRESS_DB_USER: 'toview' WORDPRESS_DB_PASSWORD: '6H58v3hl9p2' WORDPRESS_DB_NAME: 'toview' volumes: - ./app/wp-content:/var/www/html/wp-content/ ### 当前目录(toview 目录)下的 app 文件夹 - ./app/config/php-uploads.ini:/usr/local/etc/php/conf.d/uploads.ini db: #### 服务之二: db 数据库服务 image: mysql:5.7 restart: always ports: - 3366:3306 environment: MYSQL_DATABASE: 'toview' ### Mysql 镜像里面有一个 mysql database,添加一个数据库,这个数据库应该是 toview. MYSQL_USER: 'toview' ### toview 这个数据库就是上面 wordpress 使用的数据库名字. MYSQL_PASSWORD: '6H58v3hl9p2' MYSQL_ROOT_PASSWORD: 'SlCUeVxNVbNpu9eESC3b14h' volumes: - ./app/db:/var/lib/mysql
参考文档:
通过docker-compose构建一个在docker中运行的基于python flask框架的web应用。
1.创建一个测试目录:
$ mkdir composetest$ cd composetest$touch app.py
2.在 app.py 的文件中写入以下内容:
import timeimport redisfrom flask import Flaskapp = 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)
3.在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:
flaskredis
4.在 composetest 目录中,创建一个名为的文件 Dockerfile,内容如下:
FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]
Dockerfile 内容解释:
FROM python:3.7-alpine:
从 Python 3.7 映像开始构建镜像。
WORKDIR /code:
将工作目录设置为 /code。
设置 flask 命令使用的环境变量。
ENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。
COPY requirements.txt requirements.txtRUN pip install -r requirements.txt
复制 requirements.txt 并安装 Python 依赖项。
5.在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:
version: '3'services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
6、使用 Compose 命令构建和运行您的应用
docker-compose up
如果你想在后台执行该服务可以加上 -d 参数:
docker-compose up -d
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定为构建镜像上下文路径:
示例:
version: "3.7"services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" target: prod
解释:
devices
指定设备映射列表。
dns
自定义 DNS 服务器,可以是单个值或列表的多个值
dns_search
自定义 DNS 搜索域。可以是单个值或列表。
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
image
指定容器运行的镜像。
volumes
将主机的数据卷或着文件挂载到容器里。
version: "3.7"services: db: image: postgres:latest volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data"
restart
logging
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file"driver: "syslog"driver: "none"
network_mode
设置网络模式network_mode: "bridge"network_mode: "host"network_mode: "none"network_mode: "service:[service name]"network_mode: "container:[container name/id]"
networks
配置容器连接的网络,引用顶级 networks 下的条目
services: some-service: networks: some-network: aliases: - alias1 other-network: aliases: - alias2networks: some-network: # Use a custom driver driver: custom-driver-1 other-network: # Use a custom driver which takes special options driver: custom-driver-2
转载地址:http://bzhzi.baihongyu.com/