8.8 KiB
Docker-compose
作者:行癫(盗版必究)
一:Docker-compose概述
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务
Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流程
使用 Compose 基本上是一个三步过程:
使用定义您的应用程序的环境,Dockerfile
以便可以在任何地方复制它
定义构成您的应用程序的服务,docker-compose.yml
以便它们可以在隔离环境中一起运行
运行docker compose up
,Docker compose 命令启动并运行您的整个应用程序
举例:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
二:Docker-compose安装
1.下载
[root@xingdian ~]# curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
2.创建软连接
[root@xingdian ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
3.添加执行权限
[root@xingdian ~]# chmod a+x /usr/bin/docker-compose
4.验证版本
[root@xingdian ~]# docker-compose --version
Docker Compose version v2.6.0
三:Docker-compose入门
1.设置
定义应用程序依赖项:
1.为项目创建一个目录:
[root@xingdian ~]# mkdir composetest
[root@xingdian ~]# cd composetest
2.在项目目录中创建一个名为的文件app.py
并将其粘贴到:
[root@xingdian composetest]# cat 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)
注意:
在此示例中,redis
是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口,6379
3.在您的项目目录中创建另一个名为的文件requirements.txt并将其粘贴到:
flask
redis
2.创建 Dockerfile
编写一个构建 Docker 映像的 Dockerfile。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
注意:
从 Python 3.7 映像开始构建映像
将工作目录设置为/code
设置命令使用的环境变量flask
安装 gcc 和其他依赖项
复制requirements.txt
并安装 Python 依赖项
向镜像添加元数据以描述容器正在侦听端口 5000
将项目中的当前目录复制.
到镜像中的workdir .
将容器的默认命令设置为flask run
3.Compose 文件中定义服务
在项目目录中创建一个名为的文件docker-compose.yml
并粘贴以下内容:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
这个 Compose 文件定义了两个服务:web
和redis
注意:
该服务使用从当前目录中web
构建的图像。Dockerfile
然后它将容器和主机绑定到暴露的端口,8000
. 此示例服务使用 Flask Web 服务器的默认端口,5000
该redis
服务使用 从 Docker Hub 注册表中提取的公共Redis映像
4.使用 Compose 构建并运行您的应用程序
[root@xingdian composetest]# docker-compose up
[+] Building 95.0s (6/10)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 291B 0.0s
[+] Building 481.8s (6/10)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 291B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7-alpine 4.3s
=> [1/6] FROM docker.io/library/python:3.7-alpine@sha256:a03bd8ebf621e25cc51ee80cb82d04ca 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 1.06kB 0.0s
=> CACHED [2/6] WORKDIR /code 0.0s
=> [3/6] RUN apk add --no-cache gcc musl-dev linux-headers 477.5s
=> => # ERROR: libgomp-11.2.1_git20220219-r2: temporary error (try again later)
=> => # (5/12) Installing libatomic (11.2.1_git20220219-r2)
.............
composetest-web-1 | Use a production WSGI server instead.
composetest-web-1 | * Debug mode: off
composetest-web-1 | * Running on all addresses (0.0.0.0)
composetest-web-1 | WARNING: This is a development server. Do not use it in a production deployment.
composetest-web-1 | * Running on http://127.0.0.1:5000
composetest-web-1 | * Running on http://172.19.0.2:5000 (Press CTRL+C to quit)
5.测试访问
在浏览器中输入 http://localhost:8000/ 以查看正在运行的应用程序
6.查看docker镜像
[root@xingdian composetest]# docker images
注意:
停止应用程序,方法是docker-compose down
在第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按 CTRL+C
7.编辑 Compose 文件以添加绑定挂载
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
新volumes密钥将主机上的项目目录(当前目录)挂载到/code容器内,允许您即时修改代码,而无需重建映像。environment键设置 FLASK_ENV环境变量,它告诉flask run在开发模式下运行并在更改时重新加载代码。这种模式应该只在开发中使用
8.更新应用程序
由于应用程序代码现在使用卷安装到容器中,因此您可以对其代码进行更改并立即查看更改,而无需重建映像
更改问候语app.py并保存。例如,将Hello World! 消息更改为Hello from Docker!:
9.在浏览器中刷新应用程序
10.其他命令
[root@xingdian composetest]# docker-compose up -d //后台运行
[root@xingdian composetest]# docker-compose ps //列出容器
[root@xingdian composetest]# docker-compose pause //暂停服务
[root@xingdian composetest]# docker-compose unpause //取消暂停服务
[root@xingdian composetest]# docker-compose down //停止并移除容器、网络
[root@xingdian composetest]# docker-compose logs //查看容器的输出
[root@xingdian composetest]# docker-compose start //启动服务
[root@xingdian composetest]# docker-compose stop //停止服务
[root@xingdian composetest]# docker-compose stop [SERVICE...]
[root@xingdian composetest]# docker-compose cp //在服务容器和本地文件系统之间复制文件/文件夹
[root@xingdian composetest]# docker-compose cp [OPTIONS] SRC_PATH|- SERVICE:DEST_PATH
[root@xingdian composetest]# docker-compose run web env //为您的服务运行一次性命令,查看 web服务可以使用哪些环境变量