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安装

下载

shell 复制代码
wget https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64

加入到全局可执行文件目录下

shell 复制代码
mv docker-compose-linux-x86_64 /usr/bin/docker-compose

授予执行权限

shell 复制代码
chmod +x /usr/bin/docker-compose

验证

shell 复制代码
[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_网站文件准备

创建工作目录

shell 复制代码
mkdir flaskproject
cd flaskproject/

准备网站文件

shell 复制代码
vim app.py

添加如下内容(python)

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,将所需资源写入文件中保存

shell 复制代码
vim requirements.txt

添加:

powershell 复制代码
flask
redis

2_Dockerfile文件准备

编写Dockerfile文件

shell 复制代码
vim 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文件,在不使用额外选项的情况下,名字只能叫这个

shell 复制代码
vim docker-compose.yaml

内容如下:

powershell 复制代码
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启动容器

经过如上操作,总共准备好了如下文件:

powershell 复制代码
[root@localhost flaskproject]# ls
app.py  docker-compose.yaml  Dockerfile  requirements.txt

执行docker-compose.yamlup表示创建并启动容器,停止则使用down

如果不想容器在前台启动,加上-d选项。

shell 复制代码
docker-compose up

输出:

powershell 复制代码
[+] 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/

基本语法如下:

shell 复制代码
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

  • 引入了更复杂的功能,如 volumesnetworksdepends_on
  • 必须在文件中声明 version,如:
yaml 复制代码
version: '2'

3.x

  • 当前推荐的版本,支持更多 Docker 的现代功能,如 Swarm 和服务扩展。
  • 常见版本为 33.13.2 等,需声明为:
yaml 复制代码
version: '3'
  • 特性 :支持 deployconfigssecrets 等功能,专为 Swarm 模式优化。

选择 version 时,应根据以下因素进行判断:

1 Docker 和 Compose 的版本兼容性

  • 运行环境的 Docker 和 Docker Compose 必须支持指定的 Compose 文件版本。
  • 可以通过命令检查支持的版本:
bash 复制代码
docker-compose version
docker version

2 功能需求

  • 简单场景: 如果仅需要基本功能(如定义服务、端口、卷等),可以使用 version: '2'version: '3'
  • 复杂场景: 如果需要使用 Swarm 或高级功能(如 deploy 配置),则需要使用 version: '3.x'

2_常见示例

以下是不同版本的 Compose 文件示例:

Version 1(无 version 字段)

适用于最基础的环境,仅定义服务。

yaml 复制代码
web:
  image: nginx
  ports:
    - "80:80"

Version 2

支持卷、网络、依赖等功能。

yaml 复制代码
version: '2'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    depends_on:
      - redis
  redis:
    image: redis:alpine

Version 3

支持 Swarm 集成功能。

yaml 复制代码
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。


相关推荐
文牧之10 分钟前
PostgreSQL 的扩展pageinspect
运维·数据库·postgresql
小兔子酱#35 分钟前
【Docker 01】Docker 简介
运维·docker·容器
jugt2 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
21号 14 小时前
9.进程间通信
linux·运维·服务器
阿福不是狗6 小时前
Python使用总结之Mac安装docker并配置wechaty
python·macos·docker
叶落闲庭9 小时前
【k8s】k8s集群搭建
云原生·容器·kubernetes
搬码临时工9 小时前
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
运维·服务器·网络
藥瓿亭9 小时前
K8S认证|CKS题库+答案| 3. 默认网络策略
运维·ubuntu·docker·云原生·容器·kubernetes·cks
xyhshen9 小时前
k8s下离线搭建elasticsearch
elasticsearch·容器·kubernetes
Gaoithe9 小时前
ubuntu 端口复用
linux·运维·ubuntu