286 lines
9.0 KiB
Markdown
286 lines
9.0 KiB
Markdown
|
<h1><center>Docker-compose</center></h1>
|
|||
|
|
|||
|
**作者:行癫(盗版必究)**
|
|||
|
|
|||
|
------
|
|||
|
|
|||
|
## 一:Docker-compose概述
|
|||
|
|
|||
|
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务
|
|||
|
|
|||
|
Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流程
|
|||
|
|
|||
|
使用 Compose 基本上是一个三步过程:
|
|||
|
|
|||
|
使用定义您的应用程序的环境,`Dockerfile`以便可以在任何地方复制它
|
|||
|
|
|||
|
定义构成您的应用程序的服务,`docker-compose.yml` 以便它们可以在隔离环境中一起运行
|
|||
|
|
|||
|
运行`docker compose up`,Docker compose 命令启动并运行您的整个应用程序
|
|||
|
|
|||
|
举例:
|
|||
|
|
|||
|
```shell
|
|||
|
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.下载
|
|||
|
|
|||
|
```shell
|
|||
|
[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.创建软连接
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdian ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
|
|||
|
```
|
|||
|
|
|||
|
#### 3.添加执行权限
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdian ~]# chmod a+x /usr/bin/docker-compose
|
|||
|
```
|
|||
|
|
|||
|
#### 4.验证版本
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdian ~]# docker-compose --version
|
|||
|
Docker Compose version v2.6.0
|
|||
|
```
|
|||
|
|
|||
|
## 三:Docker-compose入门
|
|||
|
|
|||
|
#### 1.设置
|
|||
|
|
|||
|
定义应用程序依赖项:
|
|||
|
|
|||
|
1.为项目创建一个目录:
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdian ~]# mkdir composetest
|
|||
|
[root@xingdian ~]# cd composetest
|
|||
|
```
|
|||
|
|
|||
|
2.在项目目录中创建一个名为的文件`app.py`并将其粘贴到:
|
|||
|
|
|||
|
```shell
|
|||
|
[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并将其粘贴到:
|
|||
|
|
|||
|
```shell
|
|||
|
flask
|
|||
|
redis
|
|||
|
```
|
|||
|
|
|||
|
#### 2.创建 Dockerfile
|
|||
|
|
|||
|
编写一个构建 Docker 映像的 Dockerfile。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身
|
|||
|
|
|||
|
```shell
|
|||
|
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`并粘贴以下内容:
|
|||
|
|
|||
|
```shell
|
|||
|
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 构建并运行您的应用程序
|
|||
|
|
|||
|
```shell
|
|||
|
[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/ 以查看正在运行的应用程序
|
|||
|
|
|||
|
![image-20220621164601764](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220621164601764.png)
|
|||
|
|
|||
|
#### 6.查看docker镜像
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdian composetest]# docker images
|
|||
|
```
|
|||
|
|
|||
|
![image-20220621171235416](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220621171235416.png)
|
|||
|
|
|||
|
注意:
|
|||
|
|
|||
|
停止应用程序,方法是`docker-compose down` 在第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按 CTRL+C
|
|||
|
|
|||
|
#### 7.编辑 Compose 文件以添加绑定挂载
|
|||
|
|
|||
|
```shell
|
|||
|
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!:
|
|||
|
|
|||
|
![image-20220621172737014](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220621172737014.png)
|
|||
|
|
|||
|
#### 9.在浏览器中刷新应用程序
|
|||
|
|
|||
|
![image-20220621173011640](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220621173011640.png)
|
|||
|
|
|||
|
#### 10.其他命令
|
|||
|
|
|||
|
```shell
|
|||
|
[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服务可以使用哪些环境变量
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|