5 容器单机编排工具 Docker Compose

5.1 Docker Compose介绍

image-20240216112059360

当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时推荐使用docker 单机编排工具 docker-compose。

docker-compose 是 docker 容器的一种单机编排服务,docker-compose 是一个管理多个容器的工具,比如: 可以解决容器之间的依赖关系,就像启动一个nginx 前端服务的时候会调用后端的tomcat,那就得先启动tomcat,但是启动tomcat 容器还需要依赖数据库,那就还得先启动数据库,dockercompose 可以用来解决这样的嵌套依赖关系,并且可以替代docker命令对容器进行创建、启动和停止等手工的操作。

因此,如果说docker命令就像linux的命令,docker compose就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理,或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件。

docker-compose 项目是Docker 官方的开源项目,负责实现对Docker 容器集群的快速编排,dockercompose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Github地址: https://github.com/docker/compose

官方地址: https://docs.docker.com/compose/

5.2 安装和准备

5.2.1 安装Docker Compose

5.2.1.1 方法1: 在线安装,通过pip安装

python-pip 包将安装一个 pip 的命令,pip 命令是一个python 安装包的安装工具,其类似于ubuntu 的apt 或者 redhat 的yum,但是pip 只安装 python 相关的安装包,可以在多种操作系统安装和使用pip。

此方式当前安装的版本较新,为docker_compose-1.25.3,推荐使用。

Ubuntu:   
# apt update 
# apt install -y python-pip

CentOS:   
# yum install epel-release 
# yum install -y python-pip 
# pip install --upgrade pip

范例: 基于python3 安装 docker-compose

#配置加速
[root@ubuntu2004 ~]#mkdir ~/.pip

[root@ubuntu2004 ~]#cat > ~/.pip/pip.conf <<-EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
EOF

[root@ubuntu2004 ~]#apt -y install python3-pip
[root@ubuntu2004 ~]#pip3 install --upgrade pip
[root@ubuntu2004 ~]#pip3 install docker-compose

[root@ubuntu2004 ~]#docker-compose --version
docker-compose version 1.27.4, build unknown

#基于python2安装docker-compose
[root@ubuntu1804 ~]#apt -y install python-pip
[root@ubuntu1804 ~]#pip install docker-compose

[root@ubuntu1804 ~]#docker-compose --version
docker-compose version 1.25.3, build unknown

5.2.1.2 方法2: 在线直接从包仓库安装

此方法安装的版本较旧,不推荐使用

#ubuntu安装,此为默认版本
[root@ubuntu1804 ~]#apt -y install docker-compose

[root@ubuntu1804 ~]#docker-compose --version
docker-compose version 1.17.1, build unknown

#CentOS7安装,依赖EPEL源
[root@centos7 ~]#yum -y install docker-compose

[root@centos7 ~]#docker-compose --version
docker-compose version 1.18.0, buil 8dd22a9 

5.2.1.3 方法3: 离线安装,直接从github或国内镜像站下载安装对应版本

参看说明: https://github.com/docker/compose/releases

此方法安装版本可方便指定,推荐方法,但网络下载较慢

[root@ubuntu1804 ~]#curl -L https://github.com/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

root@ubuntu2204:~# wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64

#从国内镜像站下载
[root@ubuntu1804 ~]#curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.3/dockercompose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
[root@ubuntu1804 ~]#chmod +x /usr/local/bin/docker-compose

5.2.2 查看命令格式

官方文档: https://docs.docker.com/compose/reference/

docker-compose --help
Define and run multi-container applications with Docker.
Usage:
 docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
 docker-compose -h|--help

#选项说明:  
-f,-file FILE #指定Compose 模板文件,默认为docker-compose.yml
-p,-project-name NAME #指定项目名称,默认将使用当前所在目录名称作为项目名。
--verbose   #显示更多输出信息
--log-level LEVEL   #定义日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) 
--no-ansi   #不显示ANSI 控制字符
-v, --version  #显示版本

#以下为命令选项,需要在docker-compose.yml|yaml 文件所在在目录里执行
config  -q #查看当前配置,没有错误不输出任何信息
up   #创建并启动容器
build   #构建镜像
bundle  #从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker Bundle 备份文件
create  #创建服务
down    #停止和删除所有容器、网络、镜像和卷
events  #从容器接收实时事件,可以指定json 日志格式
exec  #进入指定容器进行操作
help  #显示帮助细信息
images  #显示镜像信息
kill  #强制终止运行中的容器
logs  #查看容器的日志
pause #暂停服务
port  #查看端口
ps    #列出容器
pull  #重新拉取镜像,镜像发生变化后,需要重新拉取镜像
push  #上传镜像
restart #重启服务
rm   #删除已经停止的服务
run  #一次性运行容器
scale    #设置指定服务运行的容器个数,新版已废弃
start #启动服务
stop  #停止服务
top   #显示容器运行状态
unpause  #取消暂定

范例:

[root@ubuntu1804 ~]#docker-compose --version
docker-compose version 1.25.3, build d4d1b42b

5.2.3 docker compose 文件格式

官方文档: https://docs.docker.com/compose/compose-file/

docker compose 文件是一个yaml格式的文件,所以注意行首的缩进很严格

默认docker-compose命令会调用当前目录下的docker-compose.yml的文件,因此一般执行docker-compose命令前先进入docker-compose.yml文件所在目录。

docker compose文件的格式很不同版本,版本不同,语法和格式有所不同,参看以下列表 https://docs.docker.com/compose/compose-file/compose-file-v3/

Compose file formatDocker Engine release
3.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.417.12.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+

docker compose版本众多,以下通过具体示例说明docker compose的使用方法

5.3 从 docker compose 启动单个容器

注意: 使用Docker compose之前,先要安装docker

5.3.1 创建 docker compose文件

docker compose 文件可在任意目录,创建文件名为docker-compose.yml 配置文件,要注意前后的缩进

root@ubuntu2204:~# docker-compose -v
docker-compose version 1.25.4, build 8d51620a

root@ubuntu2204:~# mkdir /data/docker-compose -p
root@ubuntu2204:~# cd /data/docker-compose
root@ubuntu2204:/data/docker-compose# vim docker-compose.yml
root@ubuntu2204:/data/docker-compose# cat docker-compose.yml
service-nginx-web:
 image: harbor.zhou.org/example/nginx-centos7-base:1.6.1
 container_name: nginx-web
 expose:
   - 80
   - 443
 ports:
    - "80:80"
    - "443:443"

5.3.2 查看配置和格式检查

root@ubuntu2204:/data/docker-compose# docker-compose config 
name: docker-compose
services:
  nginx-web:
    container_name: nginx-web
    expose:
      - "80"
      - "443"
    image: nginx:1.21.1-alpine
    networks:
      default: null
    ports:
      - mode: ingress
        target: 80
        published: "80"
        protocol: tcp
      - mode: ingress
        target: 443
        published: "443"
        protocol: tcp
networks:
  default:
    name: docker-compose_default

root@ubuntu2204:/data/docker-compose# docker-compose config -q

5.3.3 启动容器

注意: 必须要在docker compose文件所在的目录执行

#前台启动
root@ubuntu2204:~# docker images 
REPOSITORY     TAG       IMAGE ID       CREATED       SIZE
centos-nginx   c71.9     8d5cfed63c2b   8 years ago   273MB

root@ubuntu2204:/data/docker-compose# cat docker-compose.yml 
service-nginx-web:
 image: centos-nginx:c71.9
 container_name: nginx-web
 expose:
   - 80
   - 443
 ports:
    - "80:80"
    - "443:443"

root@ubuntu2204:/data/docker-compose# docker-compose up
Creating nginx-web ... done
Attaching to nginx-web

#以上是前台执行不退出

5.3.4 验证docker compose执行结果

#上面命令是前台执行,所以要查看结果,可以再开一个终端窗口进行观察
CONTAINER ID   IMAGE                COMMAND                  CREATED              STATUS              PORTS                                                                      NAMES
be54e1d43834   centos-nginx:c71.9   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx-web

root@ubuntu2204:~# docker-compose ps
ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml
      
root@ubuntu2204:~# cd /data/docker-compose/
root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp

root@ubuntu2204:/data/docker-compose# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

root@ubuntu2204:/data/docker-compose# docker-compose images
Container    Repository     Tag      Image Id       Size  
----------------------------------------------------------
nginx-web   centos-nginx   c71.9   8d5cfed63c2b   272.9 MB

root@ubuntu2204:/data/docker-compose# docker-compose exec service-nginx-web bash
[root@be54e1d43834 /]# 

[root@be54e1d43834 ~]# tail /var/log/nginx/access.log 
172.17.0.1 - - [16/Feb/2024:04:26:38 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0" "-"

5.3.5 结束前台执行

root@ubuntu2204:/data/docker-compose# docker-compose up
Creating nginx-web ... done
Attaching to nginx-web  #ctrl+c键,结束容器
^CGracefully stopping... (press Ctrl+C again to force)
Stopping nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State    Ports
-------------------------------------------------
nginx-web   nginx -g daemon off;   Exit 0

root@ubuntu2204:/data/docker-compose# docker ps -a
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS                      PORTS     NAMES
be54e1d43834   centos-nginx:c71.9   "nginx -g 'daemon of…"   10 minutes ago   Exited (0) 24 seconds ago             nginx-web

root@ubuntu2204:/data/docker-compose# docker-compose start 
Starting service-nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp
                                        
#关闭容器
root@ubuntu2204:/data/docker-compose# docker-compose kill
Killing nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command           State     Ports
---------------------------------------------------
nginx-web   nginx -g daemon off;   Exit 137

5.3.6 删除容器

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command           State     Ports
---------------------------------------------------
nginx-web   nginx -g daemon off;   Exit 137

#只删除停止的容器
root@ubuntu2204:/data/docker-compose# docker-compose rm
Going to remove nginx-web
Are you sure? [yN] y
Removing nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose up -d
Creating nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose rm
No stopped containers

#停止并删除容器及镜像
root@ubuntu2204:/data/docker-compose# docker-compose ps -a
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp 

root@ubuntu2204:/data/docker-compose# docker-compose down
Stopping nginx-web ... done
Removing nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
Name   Command   State   Ports
------------------------------

root@ubuntu2204:/data/docker-compose# docker-compose ps -a
Name   Command   State   Ports
------------------------------

#也会自动删除镜像
root@ubuntu2204:/data/docker-compose# docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------

5.3.7 后台执行

root@ubuntu2204:/data/docker-compose# docker-compose up -d
Creating nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp 

root@ubuntu2204:/data/docker-compose# curl 127.0.0.1

5.3.8 停止和启动与日志查看

root@ubuntu2204:/data/docker-compose# docker-compose stop
Stopping nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State    Ports
-------------------------------------------------
nginx-web   nginx -g daemon off;   Exit 0

root@ubuntu2204:/data/docker-compose# docker-compose start
Starting service-nginx-web ... done
root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp

root@ubuntu2204:/data/docker-compose# docker-compose restart
Restarting nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp

#执行上面操作时,可以同时开一个终端,观察日事件
root@ubuntu2204:/data/docker-compose# docker-compose events
2024-02-16 04:44:27.278633 container kill da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b (image=centos-nginx:c71.9, name=nginx-web)
2024-02-16 04:44:27.725588 container stop da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b (image=centos-nginx:c71.9, name=nginx-web)
2024-02-16 04:44:27.731206 container die da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b (image=centos-nginx:c71.9, name=nginx-web)
2024-02-16 04:44:28.336162 container start da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b (image=centos-nginx:c71.9, name=nginx-web)
2024-02-16 04:44:28.336393 container restart da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b (image=centos-nginx:c71.9, name=nginx-web)

#以json格式显示日志
root@ubuntu2204:/data/docker-compose# docker-compose events --json
{"time": "2024-02-16T05:00:43.109948", "type": "container", "action": "kill", "id": "da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b", "service": "service-nginx-web", "attributes": {"name": "nginx-web", "image": "centos-nginx:c71.9"}}
{"time": "2024-02-16T05:00:43.634358", "type": "container", "action": "stop", "id": "da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b", "service": "service-nginx-web", "attributes": {"name": "nginx-web", "image": "centos-nginx:c71.9"}}
{"time": "2024-02-16T05:00:43.640445", "type": "container", "action": "die", "id": "da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b", "service": "service-nginx-web", "attributes": {"name": "nginx-web", "image": "centos-nginx:c71.9"}}
{"time": "2024-02-16T05:00:44.174242", "type": "container", "action": "start", "id": "da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b", "service": "service-nginx-web", "attributes": {"name": "nginx-web", "image": "centos-nginx:c71.9"}}
{"time": "2024-02-16T05:00:44.174288", "type": "container", "action": "restart", "id": "da17452399525584eeb43909c54a200b021e9b62ede6245828660e2356fe128b", "service": "service-nginx-web", "attributes": {"name": "nginx-web", "image": "centos-nginx:c71.9"}}

5.3.9 暂停和恢复

root@ubuntu2204:/data/docker-compose# docker-compose pause
Pausing nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Paused   0.0.0.0:443->443/tcp,:::443->443/tcp,               
                                            0.0.0.0:80->80/tcp,:::80->80/tcp

root@ubuntu2204:/data/docker-compose# curl -m 1 127.0.0.1
curl: (28) Operation timed out after 1008 milliseconds with 0 bytes received

root@ubuntu2204:/data/docker-compose# docker-compose unpause
Unpausing nginx-web ... done

root@ubuntu2204:/data/docker-compose# docker-compose ps
  Name            Command          State                            Ports                       
--------------------------------------------------------------------------------------------------
nginx-web   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp,:::443->443/tcp,                
                                           0.0.0.0:80->80/tcp,:::80->80/tcp

root@ubuntu2204:/data/docker-compose# curl -m 1 127.0.0.1

5.4 从 docker compose 启动多个容器

5.4.1 编辑 docker-compose 文件并使用数据卷

注意: 同一个文件 ,数据卷的优先级比镜像内的文件优先级高

[root@ubuntu1804 docker-compose]#vim docker-compose.yml 
[root@ubuntu1804 docker-compose]#cat docker-compose.yml 
service-nginx-web:
 image: 10.0.0.102/example/nginx-centos7-base:1.6.1
 container_name: nginx-web 
 volumes:
    - /data/nginx:/apps/nginx/html/#指定数据卷,将宿主机/data/nginx挂载到容器/apps/nginx/html
 expose:
   - 80
   - 443
 ports:
    - "80:80"
    - "443:443"
    
service-tomcat-app1:
 image: 10.0.0.102/example/tomcat-web:app1
 container_name: tomcat-app1
 expose:
    - 8080
 ports:
    - "8081:8080"
    
service-tomcat-app2:
 image: 10.0.0.102/example/tomcat-web:app2
 container_name: tomcat-app2
 expose:
    - 8080
 ports:
    - "8082:8080"
    
#在宿主机准备nginx测试页面文件
[root@ubuntu2204 docker-compose]#mkdir /data/nginx
[root@ubuntu2204 docker-compose]#echo Docker compose test page > /data/nginx/index.html

5.4.2 启动容器并验证结果

[root@ubuntu2204 docker-compose]#docker-compose up -d
Pulling service-tomcat-app1 (10.0.0.102/example/tomcat-web:app1)...
app1: Pulling from example/tomcat-web
f34b00c7da20: Already exists
544476d462f7: Already exists
39345915aa1b: Already exists
4b792f2bae38: Already exists
4439447a3522: Already exists
fe34d2ec1dd0: Already exists
b8487ca03126: Already exists
5a475b7d8b1a: Already exists
df8703d3d2dd: Already exists
f0da1ffa7aa7: Pull complete
80fd4c70e670: Pull complete
c2a0247d7bfa: Pull complete
b0977ed809cd: Pull complete
Digest: sha256:e0aba904df6095ea04c594d6906101f8e5f4a6ceb0a8f9b24432c47698d0caa8
Status: Downloaded newer image for 10.0.0.102/example/tomcat-web:app1
Pulling service-tomcat-app2 (10.0.0.102/example/tomcat-web:app2)...
app2: Pulling from example/tomcat-web
f34b00c7da20: Already exists
544476d462f7: Already exists
39345915aa1b: Already exists
4b792f2bae38: Already exists
4439447a3522: Already exists
fe34d2ec1dd0: Already exists
b8487ca03126: Already exists
5a475b7d8b1a: Already exists
df8703d3d2dd: Already exists
f0da1ffa7aa7: Already exists
80fd4c70e670: Already exists
1a55cb76a801: Pull complete
565ab795f82a: Pull complete
Digest: sha256:c4d6f166c3933f6c1ba59c84ea0518ed653af25f28b87981c242b0deff4209bb
Status: Downloaded newer image for 10.0.0.102/example/tomcat-web:app2
Creating tomcat-app1 ... done
Creating tomcat-app2 ... done
Creating nginx-web   ... done

[root@ubuntu2204 docker-compose]#docker-compose ps 
   Name                 Command               State                   Ports     
             
-----------------------------------------------------------------------------------------
nginx-web     /apps/nginx/sbin/nginx           Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
tomcat-app1   /apps/tomcat/bin/run_tomcat.sh   Up      8009/tcp, 0.0.0.0:8081->8080/tcp        
tomcat-app2   /apps/tomcat/bin/run_tomcat.sh   Up      8009/tcp, 0.0.0.0:8082->8080/tcp    

[root@ubuntu2204 docker-compose]#curl http://127.0.0.1/
Docker compose test page

[root@ubuntu2204 docker-compose]#curl http://127.0.0.1:8081/app/
Tomcat Page in app1

[root@ubuntu2204 docker-compose]#curl http://127.0.0.1:8082/app/
Tomcat Page in app2

5.4.3 指定同时启动容器的数量

[root@ubuntu2204 docker-compose]#vim docker-compose.yml 
[root@ubuntu2204 docker-compose]#cat docker-compose.yml
service-nginx-web:
 image: 10.0.0.102/example/nginx-centos7-base:1.6.1
# container_name: nginx-web #同时启动多个同一镜像的容器,不要指定容器名称,否则会冲突
 expose:
  - 80
  - 443
# ports:                   #同时启动多个同一镜像的容器,不要指定端口号,否则会冲突
#   - "80:80"
#   - "443:443"
#再加一个service
service-tomcat:
 image: 10.0.0.102/example/tomcat-base:v8.5.50
 
[root@ubuntu2204 docker-compose]#docker-compose ps 
Name   Command   State   Ports
------------------------------

[root@ubuntu2204 docker-compose]#docker-compose up -d --scale service-nginxweb=2
Creating docker-compose_service-tomcat_1    ... done
Creating docker-compose_service-nginx-web_1 ... done
Creating docker-compose_service-nginx-web_2 ... done

[root@ubuntu2204 docker-compose]#docker-compose ps 
               Name                         Command           State         Ports 
    
---------------------------------------------------------------------------------
-----
docker-compose_service-nginx-web_1   /apps/nginx/sbin/nginx   Up       443/tcp, 80/tcp
docker-compose_service-nginx-web_2   /apps/nginx/sbin/nginx   Up       443/tcp, 80/tcp
docker-compose_service-tomcat_1     /bin/bash               Exit 0             
     
[root@ubuntu2204 docker-compose]#docker-compose up -d --scale service-nginxweb=3 --scale service-tomcat=2
Starting docker-compose_service-tomcat_1   ... done
Starting docker-compose_service-nginx-web_1 ... done
Starting docker-compose_service-nginx-web_2 ... done
Creating docker-compose_service-nginx-web_3 ... done
Creating docker-compose_service-tomcat_2   ... done

[root@ubuntu2204 docker-compose]#docker-compose ps 
               Name                         Command           State         Ports 
    
--------------------------------------------------------------------------------------
docker-compose_service-nginx-web_1   /apps/nginx/sbin/nginx   Up       443/tcp, 80/tcp
docker-compose_service-nginx-web_2   /apps/nginx/sbin/nginx   Up       443/tcp, 80/tcp
docker-compose_service-nginx-web_3   /apps/nginx/sbin/nginx   Up       443/tcp, 80/tcp
docker-compose_service-tomcat_1     /bin/bash               Exit 0             
     
docker-compose_service-tomcat_2     /bin/bash               Exit 0             
     
[root@ubuntu2204 docker-compose]#docker-compose up -d 
Stopping and removing docker-compose_service-nginx-web_2 ... done
Stopping and removing docker-compose_service-nginx-web_3 ... done
Stopping and removing docker-compose_service-tomcat_2   ... done
Starting docker-compose_service-tomcat_1                 ... done
Starting docker-compose_service-nginx-web_1             ... done

[root@ubuntu2204 docker-compose]#docker-compose ps
Name                         Command           State         Ports 
    
--------------------------------------------------------------------------------------
docker-compose_service-nginx-web_1   /apps/nginx/sbin/nginx   Up       443/tcp, 80/tcp
docker-compose_service-tomcat_1     /bin/bash               Exit 0

5.4.4 扩容和缩容

注意: 新版中scale 命令已废弃

#扩容
[root@ubuntu2204 docker-compose]#docker-compose scale service-nginx-web=3

#缩容为0,即删除容器
[root@ubuntu2204 docker-compose]#docker-compose scale service-nginx-web=0

5.5 实战案例: 实现 Wordpress 应用

version: '3'
services:
  db:
    image: mysql:5.7.30
    container_name: db
    restart: unless-stopped
    environment:
      - MYSQL_DATABASE=wordpress
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=123456
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - wordpress-network
  wordpress:
    depends_on:
      - db
    image: wordpress:5.8.0-php8.0-apache
    container_name: wordpress
    restart: unless-stopped
    ports:
      - "80:80"
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=123456
      - WORDPRESS_DB_NAME=wordpress
    volumes:
      - wordpress:/var/www/html
    networks:
      - wordpress-network
volumes:
  wordpress:
  dbdata:
networks:
  wordpress-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16

5.6 实战案例: 搭建运维平台 Spug

Spug是面向中小型企业设计的轻量级无Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。

Spug是上海时巴克科技有限公司旗下的开源运维项目,公司旗下现有产品「Spug开源运维平台」「Spug推送助手」,公司专注为中小企业服务。

参考链接

https://spug.cc/docs/install-docker

范例: 基于docker-compse 部署 Spug

#安装docker和docker-compse
略
#创建docker-compse.yml文件
#vi docker-compose.yml
version: "3.9"
services:
 db:
   image: mariadb:10.8
   container_name: spug-db
   restart: always
   command: --character-set-server=utf8mb4 --collationserver=utf8mb4_unicode_ci
   volumes:
     - /data/spug/mysql:/var/lib/mysql
   environment:
     - MYSQL_DATABASE=spug
     - MYSQL_USER=spug
     - MYSQL_PASSWORD=spug.cc
     - MYSQL_ROOT_PASSWORD=spug.cc
 spug:
   image: openspug/spug-service
   container_name: spug
   privileged: true
   restart: always
   volumes:
     - /data/spug/service:/data/spug
     - /data/spug/repos:/data/repos
   ports:
      # 如果80端口被占用可替换为其他端口,例如: - "8000:80"
     - "80:80"
   environment:
     - SPUG_DOCKER_VERSION=v3.2.1
     - MYSQL_DATABASE=spug
     - MYSQL_USER=spug
     - MYSQL_PASSWORD=spug.cc
     - MYSQL_HOST=db
     - MYSQL_PORT=3306
   depends_on:
     - db
#启动项目
#docker compose up -d
#初始化:以下操作会创建一个用户名为 admin 密码为 spug.dev 的管理员账户,可自行替换管理员账户/密码。
docker exec spug init_spug admin spug.dev

#访问测试:在浏览器中输入 http://localhost:80 访问(默认账户密码在上面一步初始化时设置)。

5.7 案例: 一键生成 Docker Compose

利用网站将docker 命令自动生成 Docker Compse

https://www.composerize.com/

image-20240216132749550