Docker Compose应用实战
文章目录
1、使用Docker Compose必要性及定义
用容器运行一个服务,需要使用docker run
命令。但如果我要运行多个服务呢?
假设我要运行一个web服务,还要运行一个db服务,那么是用一个容器运行,还是用多个容器运行呢?
一个容器运行多个服务会造成镜像的复杂度提高,docker倾向于一个容器运行一个应用。
那么复杂的架构就会需要很多的容器,并且需要它们之间有关联(容器之间的依赖和连接)就更复杂了。
这个复杂的问题需要解决,这就涉及到了容器编排的问题了。
Compose 编排
- 是对多个容器进行启动和管理的方法
- 例如:LNMT,先启动MySQL,再启动Tomcat,最后启动Nginx
服务架构的演进
- 单体服务架构
- 分布式服务架构
- 微服务架构
- 超微服务架构
容器编排工具
-
docker machine
- 在虚拟机中部署docker容器引擎的工具
-
docker compose
- 是一个用于定义和运行多容器Docker的应用程序工具
-
docker swarm
- 是Docker Host主机批量管理及资源调度管理工具
-
mesos+marathon
- mesos 对计算机计算资源进行管理和调度
- marathon 服务发现及负载均衡的功能
-
kubernetes
- google开源的容器编排工具
2、Docker Compose应用参考资料
网址:https://docs.docker.com/compose/
YAML说明:https://yaml.org/
3、Docker Compose应用最佳实践步骤
1_概念
工程(project)
服务 (Service)
容器 (Container)
2_步骤
1 定义应用的Dockerfile文件,为了anywhere
进行构建。
2 使用docker-compose.yaml
定义一套服务,这套服务可以一起在一个隔离环境中运行。
3 使用docker-compose up
就可以启动整套服务。
4、Docker Compose安装
下载
wget https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64
加入到全局可执行文件目录下
mv docker-compose-linux-x86_64 /usr/bin/docker-compose
授予执行权限
chmod +x /usr/bin/docker-compose
验证
[root@localhost ~]# docker-compose version
Docker Compose version v2.31.0
[root@localhost ~]# docker compose version
Docker Compose version v2.29.7
注意:docker 20.10 以上版本自动集成 v2 的 docker compose
( 没有连词符-
)
5、Docker Compose应用案例
运行Python语言开发的网站
1_网站文件准备
创建工作目录
mkdir flaskproject
cd flaskproject/
准备网站文件
vim app.py
添加如下内容(python)
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
# 用户的每一次访问都记录到redis中并返回给页面显示出来
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)
可以看到需要两个重要服务flask和redis,将所需资源写入文件中保存
vim requirements.txt
添加:
flask
redis
2_Dockerfile文件准备
编写Dockerfile文件
vim Dockerfile
内容如下:
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
COPY . .
CMD ["flask", "run"]
3_Compose文件准备
编写compose
文件,在不使用额外选项的情况下,名字只能叫这个
vim docker-compose.yaml
内容如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
version | yaml语法格式版本 |
---|---|
services | 工程中所包含的服务 |
web | web服务 |
build | . 基于当前目录下的Dockerfile文件来构建镜像 |
ports | 暴露容器5000端口到宿主机5000 |
redis | redis服务,同时使用了image 指定了镜像 |
注意启动顺序是从文件定义的内容自上而下的。
4_使用docker-compose up启动容器
经过如上操作,总共准备好了如下文件:
[root@localhost flaskproject]# ls
app.py docker-compose.yaml Dockerfile requirements.txt
执行docker-compose.yaml
,up
表示创建并启动容器,停止则使用down
。
如果不想容器在前台启动,加上-d
选项。
docker-compose up
输出:
[+] Running 9/9
✔ redis Pulled 15.8s
✔ da9db072f522 Pull complete 3.5s
✔ dd8d46bd4047 Pull complete 3.5s
✔ 5057e26f1a86 Pull complete 3.8s
✔ be83d0fd33a3 Pull complete 4.6s
✔ b3d150cb1b6c Pull complete 9.0s
✔ 369ad5b9119b Pull complete 9.0s
✔ 4f4fb700ef54 Pull complete 9.1s
✔ 37d63ae71d35 Pull complete 9.1s
[+] Running 0/0
[+] Building 33.9s (8/10) docker:default
=> [web internal] load build definition from Dockerfile 0.0s
[+] Building 42.5s (12/12) FINISHED docker:default
=> [web internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 339B 0.0s
=> [web internal] load metadata for docker.io/library/python:3.7-alpine 4.5s
=> [web internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [web internal] load build context 0.0s
=> => transferring context: 1.37kB 0.0s
=> [web 1/6] FROM docker.io/library/python:3.7-alpine@sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3 7.7s
=> => resolve docker.io/library/python:3.7-alpine@sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3 0.0s
=> => sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3 1.65kB / 1.65kB 0.0s
=> => sha256:e6da3ee9bb64dd12b98fa609487f112fe1e365522e6e8345309db15c22a80a51 1.37kB / 1.37kB 0.0s
=> => sha256:1bac8ae77e4af0b868b62a75115616a20e025e0451eeed05d94a4cfc4523e58a 6.87kB / 6.87kB 0.0s
=> => sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa 3.40MB / 3.40MB 3.6s
=> => sha256:9875af95546db78168a6761b7fa205ed1cd0c153cd89356c1512e551c12b2d5c 622.29kB / 622.29kB 2.5s
=> => sha256:4819c95424fc4a94767c9329b02238ebcce0bc682384cb671379bc1fb8a12b55 10.94MB / 10.94MB 6.0s
=> => sha256:148762f75a1f92cc9857e9c488bf95d5aac61e9905ec47a7408025b2dd5c3b7a 240B / 240B 3.0s
=> => sha256:ea1518237b3753b3fe40ee773d77651704178d9baa72ae5012e13a992cfa6c63 2.85MB / 2.85MB 5.2s
=> => extracting sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa 0.1s
=> => extracting sha256:9875af95546db78168a6761b7fa205ed1cd0c153cd89356c1512e551c12b2d5c 0.4s
=> => extracting sha256:4819c95424fc4a94767c9329b02238ebcce0bc682384cb671379bc1fb8a12b55 1.0s
=> => extracting sha256:148762f75a1f92cc9857e9c488bf95d5aac61e9905ec47a7408025b2dd5c3b7a 0.0s
=> => extracting sha256:ea1518237b3753b3fe40ee773d77651704178d9baa72ae5012e13a992cfa6c63 0.5s
=> [web 2/6] WORKDIR /code 0.3s
=> [web 3/6] RUN apk add --no-cache gcc musl-dev linux-headers 16.1s
=> [web 4/6] COPY requirements.txt requirements.txt 0.0s
=> [web 5/6] RUN pip install -r requirements.txt 13.3s
=> [web 6/6] COPY . . 0.0s
=> [web] exporting to image 0.5s
=> => exporting layers 0.5s
=> => writing image sha256:631b987cf5ad154d30190d2cdac81aeb50eea7b99d7cbb4f0258f32012f1a5d4 0.0s
[+] Running 4/2o docker.io/library/flaskproject-web 0.0s
✔ Service web Built 42.6s
✔ Network flaskproject_default Created 0.4s
✔ Container flaskproject-web-1 Created 0.1s
✔ Container flaskproject-redis-1 Created 0.1s
Attaching to redis-1, web-1
redis-1 | 1:C 08 Dec 2024 17:00:37.695 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-1 | 1:C 08 Dec 2024 17:00:37.695 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-1 | 1:C 08 Dec 2024 17:00:37.695 * Redis version=7.4.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis-1 | 1:C 08 Dec 2024 17:00:37.695 # 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 08 Dec 2024 17:00:37.695 * monotonic clock: POSIX clock_gettime
redis-1 | 1:M 08 Dec 2024 17:00:37.697 * Running mode=standalone, port=6379.
redis-1 | 1:M 08 Dec 2024 17:00:37.698 * Server initialized
redis-1 | 1:M 08 Dec 2024 17:00:37.698 * Ready to accept connections tcp
web-1 | * Serving Flask app 'app.py'
web-1 | * Debug mode: off
web-1 | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web-1 | * Running on all addresses (0.0.0.0)
web-1 | * Running on http://127.0.0.1:5000
web-1 | * Running on http://172.18.0.2:5000
web-1 | Press CTRL+C to quit
w Enable Watch
5_访问
6_常见操作补充
详见官网:https://docs.docker.com/compose/reference/
基本语法如下:
docker compose [OPTIONS] [COMMAND]
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose 文件的路径和名称 |
-p | 指定project 名称,project 就是当前compose 文件中设置的多个service 的集合,是逻辑概念 | |
Commands | up | 创建并启动所有service 容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |
6、Docker Compose的版本
version
是 Docker Compose 文件中的一个顶级字段,用来指定 Compose 文件的版本。
它直接影响文件的语法规则和功能支持,以下是对 version
的详细介绍:
1_支持的版本
Docker Compose 支持多个版本,每个版本提供不同的功能。主要版本包括:
1.x
- 使用的是较早的 Compose 文件格式。
- 没有顶级
version
字段。 - 功能较为有限。
2.x
- 引入了更复杂的功能,如
volumes
、networks
和depends_on
。 - 必须在文件中声明
version
,如:
version: '2'
3.x
- 当前推荐的版本,支持更多 Docker 的现代功能,如 Swarm 和服务扩展。
- 常见版本为
3
、3.1
、3.2
等,需声明为:
version: '3'
- 特性:支持
deploy
、configs
、secrets
等功能,专为 Swarm 模式优化。
选择 version
时,应根据以下因素进行判断:
1 Docker 和 Compose 的版本兼容性
- 运行环境的 Docker 和 Docker Compose 必须支持指定的 Compose 文件版本。
- 可以通过命令检查支持的版本:
docker-compose version
docker version
2 功能需求
- 简单场景: 如果仅需要基本功能(如定义服务、端口、卷等),可以使用
version: '2'
或version: '3'
。 - 复杂场景: 如果需要使用 Swarm 或高级功能(如
deploy
配置),则需要使用version: '3.x'
。
2_常见示例
以下是不同版本的 Compose 文件示例:
Version 1(无 version
字段)
适用于最基础的环境,仅定义服务。
web:
image: nginx
ports:
- "80:80"
Version 2
支持卷、网络、依赖等功能。
version: '2'
services:
web:
image: nginx
ports:
- "80:80"
depends_on:
- redis
redis:
image: redis:alpine
Version 3
支持 Swarm 集成功能。
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
deploy:
replicas: 3
redis:
image: redis:alpine
volumes:
data:
driver: local
3_关键点
1 向后兼容
- Docker Compose 支持向后兼容:较新版本的 Compose 文件可以在支持旧版本的环境中运行,但反之不一定成立。
- 如果不确定兼容性,使用较低版本(如
2.4
)可以提高通用性。
2 语法限制
- 不同
version
支持的功能不同,某些字段(如deploy
)仅在version: '3.x'
中可用。
3 最新推荐
- 当前推荐使用
version: '3.8'
,这是最新功能最完善的版本。
7、总结
docker compose 强吗? 很强,因为我们会发现不管多么复杂的应用,使用 docker compose 都可以轻松将其构建起来!
但是它其实功能还不是太全,比如不能跨 docker host 工作,在云原生领域中,真正强大的是kubernetes。
原文地址:https://blog.csdn.net/m0_62943934/article/details/144403709
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!