【必看】Docker容器实战教程第9篇,教你如何使用Docker Compose快速编排容器!

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【必看】Docker容器实战教程第9篇,教你如何使用Docker Compose快速编排容器!

0 多容器的APP太恶心

  • 要从Dockerfile build image或Dockerhub拉取image
  • 要创建多个container
  • 要管理这些container(启动停止删除)

Docker Compose 批处理

1 前言

1.1 概述

  • Compose 是一个用于定义和运行多容器 Docker 应用程序的工具
  • 可使用 YAML 配置应用程序的服务
  • 使用一个命令,可从配置中创建并启动所有服务
  • Compose 适用于所有环境:生产、暂存、开发、测试及 CI 工作流。还具有用于管理应用程序整个生命周期的命令:
  • 启动、停止和重建服务
  • 查看运行服务的状态
  • 流式传输正在运行的服务的日志输出
  • 在服务上运行一次性命令

1.2 使用步骤

  1. 使用Dockerfile定义应用程序环境,以便它能在任何地方复制
  2. 定义构成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离环境中一起运行
  3. 运行docker compose up,Docker compose 命令启动并运行整个应用程序。也可docker-compose up使用 Compose 独立运行(docker-compose二进制)

2 docker-compose.yml

已有三个版本,建议使用version3。

2.1 核心概念

2.1.1 Services

一个service代表一个container,这个container可以从dockerhub的image来创建或从本地的Dockerfile build出来的image来创建。

Service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和Volume的引用。

services:
  db:
    image: postgres:9.4
    volumes:
      -"db-data:/var/lib/postgresql/data'
    networks:
      - back-tier

等价于

docker run -d
--networks back-tier
-v db-data:/var/lib/postgresql/data
postgres:9.4
services:
  worker:
    # 不是从 dockerhub 拉取的,而是从本地 build 的。即指定 dockerfile 的位置
    build: ./worker
    # worker 会和哪几个容器关联
    links:
      - db
      - redis
    networks:
      - back-tier
深入理解 Docker 网络与 Links 之间的关系

用于连接容器,实现容器间的通信。

我们都会通过 compose,创建新的 docker-bridge,若所有 container都连接在该 bridge,则根本不需要 links。只有当连接的是默认的 docker-0 时才需要links 做 dns-name 的翻译。

  • Docker Compose 会默认创建一个 docker-compose 网络(bridge 类型),并将文件中定义的所有容器连接到这个网络上
  • 在同一个 Docker 网络内的容器可以直接通过容器名来相互访问,不需要 links 也可以实现 DNS 解析
  • 只有当容器连接到默认的 docker0 网络时(没有指定网络的情况),才需要使用 links 手动配置 DNS 解析,才能通过容器名访问
  • links 的主要作用就是在默认网络下配置 DNS 转发,将父容器的 IP 地址和容器名关联,这样子容器可以访问父容器

所以,若一个 Docker Compose 文件定义了网络,并将所有容器加入该网络,则这些容器间可以直接通过 DNS 自动发现和访问。此时 links 标签就没有太大作用了。只有在少数情况下,当容器连接默认网络,又需要和其他容器通信时,links 才需要作为一个手动配置的备选方案。但 links 方式相比 Docker 网络存在诸多限制,所以 Docker 一直在推荐使用自定义网络来连接容器,而非 links。所以,总体来说,这个说法正确。


compose 帮我们创建的网络使容器间可以自动发现和访问,大部分情况 links 的作用就不大了。


但links方式有如下缺点:

  1. 不支持服务发现:links只能手动指定连接的容器,无法实现自动服务发现。这不利于应用部署的动态性和扩展性
  2. 端口冲突风险:links 会将父容器的所有端口暴露给子容器,可能造成端口冲突的问题
  3. 配置复杂:大型项目下,手动配置众多容器之间的 links 会变得非常复杂
  4. 不支持负载均衡:links 无法实现对多个容器的负载均衡,只能链接单个容器
  1. 性能影响:links 的工作方式需要在主机上创建 iptables 规则,这会对性能产生一定影响

所以,links的缺点及限制性使其大多数时候都不是一个理想的容器间通信方案。Docker更推荐使用如下替代方案:

  1. Docker 网络:使用 Docker 自己的网络功能,可以实现自动服务发现、端口隔离、性能更优等目的
  2. Consul:使用 Consul 这样的服务发现工具,可以实现自动服务注册与发现,避免手动 links
  1. Traefik:使用反向代理工具 Traefik,可以自动发现后端容器,并且实现负载均衡等功能
  2. 环境变量:在不同容器设置相同的环境变量,实现简单的配置共享和参数传递

所以,总体来说,Links 的使用已经被 Docker 网络、服务发现工具等更高级的机制所替代。在新项目中,优先考虑使用 Docker 自身网络或第三方服务发现、负载均衡工具实现容器间通信。Links 现在只适用于非常简单的容器化应用或用于兼容旧的 Docker Compose 文件。所以大部分时候来说Links 标签都没用。

2.1.2 volume
services:
  db:
    image: postgres:9.4
    volumes:
      db-data:
    networks:
      - back-tier

docker volume create db-data

2.1.3 Networks
services:
  db:
    image: postgres:9.4
    volumes:
      db-data:
    networks:
      back-tier:
        driver: bridge
      front-tier:
        driver: bridge

docker network create -d bridge back-tier

2.2 实例

version: '3'
services:
  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge
volumes:
  mysql-data:
networks:
  my-bridge:
    driver: bridge

这段 Docker Compose 文件定义了一个 WordPress 应用由两个容器组成:


1.wordpress:使用官方 WordPress 镜像,端口映射到 8080,连接到 my-bridge 网络。


  使用环境变量配置 WordPress 数据库连接信息,连接 mysql 容器。

2.mysql:使用官方 MySQL 镜像,设置 root 密码和创建 wordpress 数据库,将 mysql-data 卷挂载到 /var/lib/mysql,也连接到 my-bridge 网络。


3.mysql-data:命名为 mysql-data 的匿名数据卷,挂载到 mysql 容器。用于存储数据库文件。


4.my-bridge:Docker Compose 定义的 bridge 类型网络,两个容器都连接到这个网络上,实现互相访问。


这个 Compose 文件实现了 WordPress 和 MySQL 的组合部署,两者连接到同一个网络,WordPress 通过环境变量连接 MySQL,并使用数据卷实现数据库文件持久化。


第一次启动时,会:


1.拉取 WordPress 和 MySQL 镜像


2.创建 my-bridge 网络


3.创建 mysql-data 数据卷


4.启动 wordpress 容器,连接网络,设置环境变量并映射端口


5.启动 mysql 容器,连接网络,设置环境变量并挂载数据卷


6.WordPress 通过环境变量连接 mysql 容器,网站数据保存到数据卷


7.可以通过主机的 8080 端口访问 WordPress 网站


以后启动只会重新启动容器,网络和卷会保持不变。

3 操作

[root@icv-monitor-platform-dev ~]# yum install -y docker-compose
Loaded plugins: langpacks, versionlock
base                                                                                                                                                       | 3.6 kB  00:00:00     
docker-ce-stable                                                                                                                                           | 3.5 kB  00:00:00     
epel                                                                                                                                                       | 4.7 kB  00:00:00     
extras                                                                                                                                                     | 2.9 kB  00:00:00     
updates                                                                                                                                                    | 2.9 kB  00:00:00     
yum_bcm                                                                                                                                                    | 2.5 kB  00:00:00     
epel/x86_64/updateinfo         FAILED                                          
http://mirrors.agilecloud.com/epel/7/x86_64/repodata/e06414b68d54c610e042619ea9ed5efb25bb5a6d31e42dfdd38699029423209b-updateinfo.xml.bz2: [Errno 14] HTTP Error 404 - Not FoundTA 
Trying other mirror.
To address this issue please refer to the below knowledge base article 
https://access.redhat.com/articles/1320623
If above article doesn't help to resolve this issue please create a bug on https://bugs.centos.org/
epel/x86_64/primary_db         FAILED                                          
http://mirrors.agilecloud.com/epel/7/x86_64/repodata/a80f23383e955fc3c9c1874dcf2619d8abff2bd6c8dd2062923cdf91d1dcb464-primary.sqlite.bz2: [Errno 14] HTTP Error 404 - Not FoundTA 
Trying other mirror.
(1/3): docker-ce-stable/7/x86_64/primary_db                                                                                                                | 106 kB  00:00:00     
Excluding 1 update due to versionlock (use "yum versionlock status" to show it)
Resolving Dependencies
--> Running transaction check
---> Package docker-compose.noarch 0:1.18.0-4.el7 will be installed
...
--> Finished Dependency Resolution
Dependencies Resolved
==================================================================================================================================================================================
 Package                                                 Arch                                 Version                                    Repository                          Size
==================================================================================================================================================================================
Installing:
 docker-compose                                          noarch                               1.18.0-4.el7                               epel                               222 k
Installing for dependencies:
... epel                                59 k
Transaction Summary
==================================================================================================================================================================================
Install  1 Package (+15 Dependent packages)
Total download size: 1.4 M
Installed size: 7.5 M
Downloading packages:
...
(16/16): python36-websocket-client-0.47.0-2.el7.noarch.rpm                                                                                                 |  59 kB  00:00:00     
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                             8.8 MB/s | 1.4 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
...
  Verifying  : python36-websocket-client-0.47.0-2.el7.noarch                                                                                                                16/16 
Installed:
  docker-compose.noarch 0:1.18.0-4.el7                                                                                                                                            
Dependency Installed:
  python36-PyYAML.x86_64 0:3.13-1.el7          python36-cached_property.noarch 0:1.5.1-2.el7 python36-chardet.noarch 0:3.0.4-1.el7           python36-docker.noarch 0:2.6.1-3.el7
  python36-docker-pycreds.noarch 0:0.2.1-2.el7 python36-dockerpty.noarch 0:0.4.1-18.el7      python36-docopt.noarch 0:0.6.2-8.el7            python36-idna.noarch 0:2.7-2.el7    
  python36-jsonschema.noarch 0:2.5.1-4.el7     python36-pysocks.noarch 0:1.6.8-7.el7         python36-requests.noarch 0:2.14.2-2.el7         python36-six.noarch 0:1.14.0-2.el7  
  python36-texttable.noarch 0:1.6.2-1.el7      python36-urllib3.noarch 0:1.25.6-1.el7        python36-websocket-client.noarch 0:0.47.0-2.el7
Complete!
[root@icv-monitor-platform-dev ~]# docker compose version
Docker Compose version v2.17.3

3.1 启动

[root@icv-monitor-platform-dev docker]# docker-compose up
Recreating docker_wordpress_1 ... 
Recreating docker_wordpress_1 ... done
Attaching to docker_mysql_1, docker_wordpress_1
wordpress_1  | WordPress not found in /var/www/html - copying now...
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Initializing database files
mysql_1      | 2023-05-06T09:11:25.184821Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.27) initializing of server in progress as process 42
mysql_1      | 2023-05-06T09:11:25.194319Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2023-05-06T09:11:26.099933Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2023-05-06T09:11:27.476271Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:27.476300Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:27.627812Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
mysql_1      | 2023-05-06 09:11:30+00:00 [Note] [Entrypoint]: Database files initialized
mysql_1      | 2023-05-06 09:11:30+00:00 [Note] [Entrypoint]: Starting temporary server
mysql_1      | 2023-05-06T09:11:31.071379Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 91
mysql_1      | 2023-05-06T09:11:31.091286Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2023-05-06T09:11:31.350282Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2023-05-06T09:11:31.544377Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:31.544407Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:31.545449Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_1      | 2023-05-06T09:11:31.545492Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_1      | 2023-05-06T09:11:31.547265Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1      | 2023-05-06T09:11:31.564869Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
mysql_1      | 2023-05-06T09:11:31.565054Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
mysql_1      | 2023-05-06 09:11:31+00:00 [Note] [Entrypoint]: Temporary server started.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql_1      | 2023-05-06 09:11:33+00:00 [Note] [Entrypoint]: Creating database wordpress
mysql_1      | 
mysql_1      | 2023-05-06 09:11:33+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql_1      | 2023-05-06T09:11:33.250603Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.27).
mysql_1      | 2023-05-06T09:11:34.554923Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27)  MySQL Community Server - GPL.
mysql_1      | 2023-05-06 09:11:35+00:00 [Note] [Entrypoint]: Temporary server stopped
mysql_1      | 
mysql_1      | 2023-05-06 09:11:35+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
mysql_1      | 
mysql_1      | 2023-05-06T09:11:35.539635Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1
mysql_1      | 2023-05-06T09:11:35.551731Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2023-05-06T09:11:35.804326Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2023-05-06T09:11:36.004188Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:36.004221Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:36.005212Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_1      | 2023-05-06T09:11:36.005253Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_1      | 2023-05-06T09:11:36.008635Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1      | 2023-05-06T09:11:36.026993Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
mysql_1      | 2023-05-06T09:11:36.027899Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
wordpress_1  | Complete! WordPress has been successfully copied to /var/www/html
wordpress_1  | No 'wp-config.php' found in /var/www/html, but 'WORDPRESS_...' variables supplied; copying 'wp-config-docker.php' (WORDPRESS_DB_HOST WORDPRESS_DB_PASSWORD)
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | [Sat May 06 09:52:36.197040 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.56 (Debian) PHP/8.0.28 configured -- resuming normal operations
wordpress_1  | [Sat May 06 09:52:36.197088 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
[root@icv-monitor-platform-dev ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
08538a461949   wordpress           "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:8083->80/tcp, :::8083->80/tcp         docker_wordpress_1
fceb9e329624   mysql               "docker-entrypoint.s…"   43 minutes ago       Up 42 minutes       3306/tcp, 33060/tcp                           docker_mysql_1
28888809ef74   redis:myredis-1.0   "docker-entrypoint.s…"   8 days ago           Up 8 days           0.0.0.0:32768->6379/tcp, :::32768->6379/tcp   redisABC
[root@icv-monitor-platform-dev docker]# docker-compose  ps
       Name                     Command               State                  Ports                
--------------------------------------------------------------------------------------------------
docker_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp                 
docker_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8083->80/tcp,:::8083->80/tcp
[root@icv-monitor-platform-dev docker]#  

3.2 停止

docker-compose stopdocker-compose down 都是用于停止 Docker Compose 中运行的容器。

stop-停止服务

停止正在运行的容器,但不删除容器和网络:

  • 网络会保留,容器启动后会重新连接网络
  • 数据卷也会保留,容器的数据不会丢失
[root@icv-monitor-platform-dev docker]# docker-compose stop
Stopping docker_wordpress_1 ... done
Stopping docker_mysql_1     ... done
[root@icv-monitor-platform-dev docker]# 

容器处于停止状态,可通过 start 命令重启:

[root@icv-monitor-platform-dev docker]# docker-compose  start
Starting wordpress ... done
Starting mysql     ... done
[root@icv-monitor-platform-dev docker]# 
down

停止并删除容器、网络和数据卷:

  • 容器被完全删除,无法再启动
  • 网络也被删除,容器重新创建后需要重新连接网络
  • 数据卷也被删除,容器重建后丢失之前的数据

所以,总结来说:

  • stop用于临时停止容器,可以重新启动并保留数据。适用于短暂停机维护等场景
  • down会彻底停止并删除容器及相关资源。停机后需要重新创建容器和连接网络,之前的数据也丢失。适用于项目关闭或环境重建等场景。

举例来说:项目日常开发环境,可使用 stop/start 用于临时重启容器。

项目发布新版本前,需要使用 down 停止开发环境,然后 up 启动生产环境。所以,按需求选择不同的停止方式:

  • 开发测试阶段可以使用 stop 保留数据
  • 生产发布时使用 down 确保干净的环境

3.3 exec

基于 2.2 节中的 yaml实例:

[root@icv-monitor-platform-dev docker]# docker-compose exec mysql bash
root@fceb9e329624:/# ls
bin   dev                         entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint-initdb.d  etc            lib   media  opt  root  sbin  sys  usr
root@fceb9e329624:/# exit
exit
[root@icv-monitor-platform-dev docker]# 

3.4 network

[root@icv-monitor-platform-dev docker]# docker network ls
NETWORK ID     NAME               DRIVER    SCOPE
64ad1eca60f7   bridge             bridge    local
4689aefb8f9b   docker_my-bridge   bridge    local
f2f555bed377   host               host      local
d02380dd3da4   none               null      local
[root@icv-monitor-platform-dev docker]# 

可见,docker-compose 机制会自动帮我们在my-bridge之前增加 docker_ 前缀。


4 Docker Compose主要特性

4.1 在单机拥有多个隔离环境

Compose 使用项目名称将环境彼此隔离。可在几个不同的上下文中使用此项目名称:

  • 在开发主机,创建单个环境的多个副本,例如当您想要为项目的每个功能分支运行稳定副本时
  • 在 CI 服务器,为了防止构建相互干扰,您可以将项目名称设置为唯一的构建号
  • 在共享主机或开发主机,以防止可能使用相同服务名称的不同项目相互干扰

默认项目名称是项目目录的基本名称:

默认项目名称是项目目录的基本名称:

默认项目目录是 Compose 文件的基目录。--project-directory可以使用命令行选项为其定义自定义值。

4.2 创建容器时保留 Volume 数据

Compose 会保留您的服务使用的所有卷。运行时docker compose up ,若它发现之前运行的任何容器,它会将卷从旧容器复制到新容器。此过程可确保您在卷中创建的任何数据都不会丢失。

4.3 仅重新创建已更改的容器

Compose 缓存用于创建容器的配置。当您重新启动未更改的服务时,Compose 会重新使用现有容器。重新使用容器意味着您可以非常快速地更改您的环境。

4.4 支持变量并在环境之间移动组合

Compose 支持 Compose 文件中的变量。可使用这些变量为不同的环境或不同的用户定制您的组合。

详细信息参阅变量替换

可使用该字段或通过创建多个 Compose 文件来扩展 Compose 文件extends

详细信息参阅扩展

5 Docker Compose 的常见用例

Compose 可以多种不同方式使用。

5.1 开发环境

在开发软件时,在隔离环境中运行应用程序并与之交互的能力至关重要。Compose 命令行工具可用于创建环境并与之交互。

Compose文件提供了一种记录和配置应用程序所有服务依赖项(数据库、队列、缓存、Web 服务 API 等)的方法。使用 Compose 命令行工具,可使用单个命令 ( docker compose up) 为每个依赖项创建和启动一或多个容器。


这些功能共同为开发人员提供一种开始项目的便捷方式。Compose 可以将多页的“开发人员入门指南”缩减为单个机器可读的 Compose 文件和一些命令。


5.2 自动化测试环境

任何持续部署或持续集成过程的一个重要部分是自动化测试套件。自动化的端到端测试需要一个运行测试的环境。Compose 提供方便的方法,为你的测试套件创建和销毁隔离的测试环境。


通过在Compose文件定义完整的环境,只需几个命令即可创建和销毁这些环境:

$ docker compose up -d
$ ./run_tests
$ docker compose down

5.3 单主机部署

Compose 传统上专注于开发和测试工作流,但随着每个版本的发布,我们都在更多面向生产的功能上取得进展。

有关使用面向生产的功能的详细信息,参阅 本文档中的在生产中组合。

6 实战flask

6.1 前置文件

app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)
docker-compose.yml
version: "3"
services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8084:5000
    environment:
      REDIS_HOST: redis
dockerfile
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
[root@icv-monitor-platform-dev flask-redis]# ll
total 12
-rw-r--r-- 1 root root 432 May  8 09:49 app.py
-rw-r--r-- 1 root root 186 May  8 09:47 docker-compose.yml
-rw-r--r-- 1 root root 155 May  8 09:49 Dockerfile

6.2 启动

[root@icv-monitor-platform-dev flask-redis]# docker-compose up
flaskredis_redis_1 is up-to-date
Recreating flaskredis_web_1 ... done
Attaching to flaskredis_redis_1, flaskredis_web_1
redis_1  | 1:C 08 May 2023 01:54:53.395 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 08 May 2023 01:54:53.395 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 08 May 2023 01:54:53.395 # 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 May 2023 01:54:53.396 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 08 May 2023 01:54:53.396 * Running mode=standalone, port=6379.
redis_1  | 1:M 08 May 2023 01:54:53.396 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 08 May 2023 01:54:53.396 # Server initialized
redis_1  | 1:M 08 May 2023 01:54:53.396 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 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:M 08 May 2023 01:54:53.397 * Ready to accept connections
web_1    |  * Serving Flask app "app" (lazy loading)
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: on
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    |  * Debugger is active!
web_1    |  * Debugger PIN: 703-966-402

访问 ip:8084,得到响应:

web_1    | 10.51.11.8 - - [08/May/2023 02:02:38] "GET / HTTP/1.1" 200 -
web_1    | 10.51.11.8 - - [08/May/2023 02:02:38] "GET /favicon.ico HTTP/1.1" 404 -

测试完毕,停止服务:

^CGracefully stopping... (press Ctrl+C again to force)
Stopping flaskredis_web_1   ... done
Stopping flaskredis_redis_1 ... done
[root@icv-monitor-platform-dev flask-redis]# docker-compose down
Removing flaskredis_web_1   ... done
Removing flaskredis_redis_1 ... done
Removing network flaskredis_default
[root@icv-monitor-platform-dev flask-redis]# 

7 Docker Stack

Docker Stack:使用Docker  Compose进行编排的生产级别部署。


Docker Compose是一个流行的工具,用于定义和运行多个Docker容器的应用程序。但是,当你需要在生产环境中部署应用程序时,可能需要更强大的工具来管理容器的生命周期和扩展性。


这就是Docker Stack的作用,用于编排和管理多个Docker容器的工具,它使用Docker Compose文件来定义服务,并提供了更强大的功能,如滚动更新、自动扩展和服务发现。


使用Docker Stack进行生产级别部署的基本步骤


1.编写Docker Compose文件:与使用Docker Compose一样,您需要编写一个YAML文件来定义您的服务。但是,在Docker Stack中,您需要将文件命名为docker-compose.yml,并使用version 3或更高版本。

2.部署服务:使用docker stack deploy命令来部署服务。该命令将从您的docker-compose.yml文件中读取服务定义,并将它们部署到集群中。

3.管理服务:您可以使用docker stack命令来管理服务。例如,使用docker stack ls命令列出所有正在运行的服务,使用docker stack ps命令查看服务的状态,使用docker stack rm命令删除服务等等。

4.更新服务:您可以使用docker stack deploy命令来更新服务。例如,要滚动更新服务,请使用docker service update命令更新服务,并将–update-parallelism和–update-delay选项设置为适当的值。

Docker Stack是一个强大的工具,用于在生产环境中编排和管理多个Docker容器的应用程序。它使用Docker Compose文件来定义服务,并提供了更强大的功能,例如滚动更新、自动扩展和服务发现。如果您正在寻找一种更强大的工具来管理Docker容器,那么Docker Stack是一个不错的选择。

docker stack deploy wordpress -c=docker-compose.yml

这个命令是使用Docker Stack来部署WordPress应用程序。它指定了一个名为"wordpress"的堆栈,并使用docker-compose.yml文件中定义的服务来启动应用程序。


具体来说,该命令执行以下操作:


1.使用docker stack命令启动一个新的堆栈,该堆栈的名称为"wordpress"。


2.使用-c选项指定docker-compose.yml文件的路径。该文件包含有关要部署的服务的信息,例如WordPress网站和MySQL数据库。


3.Docker Stack将读取docker-compose.yml文件中的服务定义,并将它们部署到Docker Swarm集群中。这包括创建Docker服务、分配容器和网络等。


总之,该命令使用Docker Stack和Docker Compose文件来简化WordPress应用程序的部署过程,并提供了更强大的功能,例如滚动更新、自动扩展和服务发现。


参考


·更多信息参阅 Compose 文件参考


目录
相关文章
|
5天前
|
关系型数据库 MySQL API
|
6天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
1天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
1天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
1天前
|
运维 持续交付 Docker
深入理解Docker容器化技术
深入理解Docker容器化技术
|
6天前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
31 3
|
7天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
40 1
|
9天前
|
Docker 容器
docker 修改容器内的系统时间
【10月更文挑战第27天】docker 修改容器内的系统时间
163 2
|
1天前
|
NoSQL Redis Docker
【赵渝强老师】使用Docker Compose管理容器
Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。
|
1天前
|
前端开发 开发者 Docker
深入探索Docker Compose:简化多容器应用的部署
深入探索Docker Compose:简化多容器应用的部署
10 0
下一篇
无影云桌面