0 多容器的APP太恶心
- 要从Dockerfile build image或Dockerhub拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
Docker Compose 批处理
1 前言
1.1 概述
- Compose 是一个用于定义和运行多容器 Docker 应用程序的工具
- 可使用 YAML 配置应用程序的服务
- 使用一个命令,可从配置中创建并启动所有服务
- Compose 适用于所有环境:生产、暂存、开发、测试及 CI 工作流。还具有用于管理应用程序整个生命周期的命令:
- 启动、停止和重建服务
- 查看运行服务的状态
- 流式传输正在运行的服务的日志输出
- 在服务上运行一次性命令
1.2 使用步骤
- 使用Dockerfile定义应用程序环境,以便它能在任何地方复制
- 定义构成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离环境中一起运行
- 运行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方式有如下缺点:
- 不支持服务发现:links只能手动指定连接的容器,无法实现自动服务发现。这不利于应用部署的动态性和扩展性
- 端口冲突风险:links 会将父容器的所有端口暴露给子容器,可能造成端口冲突的问题
- 配置复杂:大型项目下,手动配置众多容器之间的 links 会变得非常复杂
- 不支持负载均衡:links 无法实现对多个容器的负载均衡,只能链接单个容器
- 性能影响:links 的工作方式需要在主机上创建 iptables 规则,这会对性能产生一定影响
所以,links的缺点及限制性使其大多数时候都不是一个理想的容器间通信方案。Docker更推荐使用如下替代方案:
- Docker 网络:使用 Docker 自己的网络功能,可以实现自动服务发现、端口隔离、性能更优等目的
- Consul:使用 Consul 这样的服务发现工具,可以实现自动服务注册与发现,避免手动 links
- Traefik:使用反向代理工具 Traefik,可以自动发现后端容器,并且实现负载均衡等功能
- 环境变量:在不同容器设置相同的环境变量,实现简单的配置共享和参数传递
所以,总体来说,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 stop
和 docker-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 服务器,为了防止构建相互干扰,您可以将项目名称设置为唯一的构建号
- 在共享主机或开发主机,以防止可能使用相同服务名称的不同项目相互干扰
默认项目名称是项目目录的基本名称:
默认项目名称是项目目录的基本名称:
-p
可使用命令行选项- 或
COMPOSE_PROJECT_NAME
环境变量来设置自定义项目名称
默认项目目录是 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 文件参考