自学内容网 自学内容网

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

img

下载

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"
versionyaml语法格式版本
services工程中所包含的服务
webweb服务
build.基于当前目录下的Dockerfile文件来构建镜像
ports暴露容器5000端口到宿主机5000
redisredis服务,同时使用了image指定了镜像

注意启动顺序是从文件定义的内容自上而下的。


4_使用docker-compose up启动容器

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

[root@localhost flaskproject]# ls
app.py  docker-compose.yaml  Dockerfile  requirements.txt

执行docker-compose.yamlup表示创建并启动容器,停止则使用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_访问

img


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

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

3.x

  • 当前推荐的版本,支持更多 Docker 的现代功能,如 Swarm 和服务扩展。
  • 常见版本为 33.13.2 等,需声明为:
version: '3'
  • 特性:支持 deployconfigssecrets 等功能,专为 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)!