马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1、使用Docker Compose须要性及界说
用容器运行一个服务,必要使用docker run下令。但假如我要运行多个服务呢?
假设我要运行一个web服务,还要运行一个db服务,那么是用一个容器运行,照旧用多个容器运行呢?
一个容器运行多个服务会造成镜像的复杂度进步,docker倾向于一个容器运行一个应用。
那么复杂的架构就会必要很多的容器,而且必要它们之间有关联(容器之间的依赖和毗连)就更复杂了。
这个复杂的标题必要办理,这就涉及到了容器编排的标题了。
Compose 编排
- 是对多个容器举行启动和管理的方法
- 比方:LNMT,先启动MySQL,再启动Tomcat,末了启动Nginx
服务架构的演进
容器编排工具
- docker machine
- docker compose
- 是一个用于界说和运行多容器Docker的应用步伐工具
- docker swarm
- 是Docker Host主机批量管理及资源调理管理工具
- mesos+marathon
- mesos 对盘算机盘算资源举行管理和调理
- marathon 服务发现及负载均衡的功能
- kubernetes
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/
复制代码 准备网站文件
添加如下内容(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,将所需资源写入文件中生存
添加:
2_Dockerfile文件准备
编写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文件,在不使用额外选项的环境下,名字只能叫这个
内容如下:
- version: '3'
- services:
- web:
- build: .
- ports:
- - "5000:5000"
- redis:
- image: "redis:alpine"
复制代码 versionyaml语法格式版本services工程中所包罗的服务webweb服务build.基于当前目次下的Dockerfile文件来构建镜像ports袒露容器5000端口到宿主机5000redisredis服务,同时使用了image指定了镜像注意启动序次是从文件界说的内容自上而下的。
4_使用docker-compose up
启动容器
颠末如上利用,统共准备好了如下文件:
- [root@localhost flaskproject]# ls
- app.py docker-compose.yaml Dockerfile requirements.txt
复制代码 实验docker-compose.yaml,up表现创建并启动容器,克制则使用down。
假如不想容器在前台启动,加上-d选项。
输出:
- [+] 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的聚集,是逻辑概念Commandsup创建并启动全部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,如:
3.x
- 当前保举的版本,支持更多 Docker 的今世功能,如 Swarm 和服务扩展。
- 常见版本为 3、3.1、3.2 等,需声明为:
- 特性:支持 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.yaml 文件中必要使用如 ${DOCKER_IP} 这种情势的环境变量可以有三种方式:
方法一:在运行下令前设置环境变量(保举)
在下令行运行 docker compose 前设置变量:
- export DOCKER_IP=192.168.1.100
- # 你的宿主机 IP
- docker compose up -d
复制代码 实用于暂时启动,变量只在当前终端有效。
方法二:使用 .env 文件
创建一个与 docker-compose.yml 同目次下的 .env 文件:
然后 docker compose 会主动读取 .env 文件并将此中的变量用于模板更换。
示例布局:
- project-folder/
- ├── docker-compose.yml
- └── .env
复制代码 实用于长期化设置,不必要每次手动 export。
方法三:直接在 docker-compose.yml 中写死
- environment:
- ACT_KEYCLOAK_URL: "http://192.168.1.100/auth"
复制代码 不保举用于多人协作或差异主机摆设,由于写死 IP 会缺乏机动性。
8、总结
docker compose 强吗? 很强,由于我们会发现不管多么复杂的应用,使用 docker compose 都可以轻松将其构建起来!
但是它实在功能还不是太全,好比不能跨 docker host 工作,在云原生范畴中,真正强大的是kubernetes。
|