200字
Docker Compose 容器单机编排工具
2026-03-13
2026-03-13

Docker Compose 容器单机编排工具

Docker Compose 介绍

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

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

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

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

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

安装和准备

安装 Docker Compose

方法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

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

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

#ubuntu安装,此为默认版本
[root@ubuntu2204 ~]#apt list docker-compose
正在列表... 完成
docker-compose/jammy 1.29.2-1 all

[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

方法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@ubuntu1804 ~]#curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.3/docker- compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

[root@ubuntu1804 ~]#chmod +x /usr/local/bin/docker-compose

查看命令格式

官方文档: 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

docker compose 文件格式

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

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

docker compose文件的格式很不同版本,版本不同,语法和格式有所不同

Compose file formatDocker Engine release
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+
1.01.9.1+

从 docker compose 启动单个容器

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

创建 docker compose文件

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

root@ubuntu1804 ~]#docker-compose --version
docker-compose version 1.25.4, build unknown
[root@ubuntu1804 ~]#mkdir /data/docker-compose
[root@ubuntu1804 ~]#cd /data/docker-compose
[root@ubuntu1804 docker-compose]#vim docker-compose.yml
[root@ubuntu1804 docker-compose]#cat docker-compose.yml
service-nginx-web:
image: harbor.aya.org/example/nginx-centos7-base:1.6.1
container_name: nginx-web
    expose:
    - 80
    - 443
    ports:
    - "80:80"
    - "443:443"

查看配置和格式检查

[root@ubuntu1804 docker-compose]#docker-compose config
services:
	service-nginx-web:
        container_name: nginx-web
        expose:
        - 80
        - 443
        image: harbor.aya.org/example/nginx-centos7-base:1.6.1
        network_mode: bridge
        ports:
        - 80:80/tcp
        - 443:443/tcp
version: '2.1'

[root@ubuntu1804 docker-compose]#docker-compose config -q

#改错ocker-compose文件格式
[root@ubuntu1804 docker-compose]#vim docker-compose.yml
service-nginx-web #改此行,最后的”:"删除
    image: harbor.aya.org/example/nginx-centos7-base:1.6.1
    container_name: nginx-web
    expose:
    - 80
    - 443
    ports:
    - "80:80"
    - "443:443"
[root@ubuntu1804 docker-compose]#docker-compose config -q
ERROR: yaml.scanner.ScannerError: mapping values are not allowed here
in "./docker-compose.yml", line 2, column 8
[root@ubuntu1804 docker-compose]#

启动容器

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

#前台启动
[root@ubuntu1804 docker-compose]#docker-compose up
Pulling service-nginx-web (harbor.aya.org/example/nginx-centos7-base:1.6.1)...
ERROR: Get https://harbor.aya.org/v2/: dial tcp 10.0.0.102:443: connect:
connection refused
[root@ubuntu1804 docker-compose]#vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--insecure-registry harbor.aya.org
[root@ubuntu1804 docker-compose]#systemctl daemon-reload
[root@ubuntu1804 docker-compose]#systemctl restart docker
[root@ubuntu1804 docker-compose]#docker-compose up
Pulling service-nginx-web (10.0.0.102/example/nginx-centos7-base:1.6.1)...
1.6.1: Pulling from example/nginx-centos7-base
f34b00c7da20: Pull complete
544476d462f7: Pull complete
39345915aa1b: Pull complete
d5376f2bbd9e: Pull complete
4596aecee927: Pull complete
1617b995c379: Pull complete
d00df95be654: Pull complete
Digest: sha256:82e9e7d8bf65e160ba79a92bb25ae42cbbf791092d1e09fb7de25f91b31a21ff
Status: Downloaded newer image for 10.0.0.102/example/nginx-centos7-base:1.6.1
Creating nginx-web ... done
Attaching to nginx-web
#以上是前台执行不退出

验证docker compose执行结果

#上面命令是前台执行,所以要查看结果,可以再开一个终端窗口进行观察
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES
d71030504f6a harbor.aya.org/example/nginx-centos7-base:1.6.1
"/apps/nginx/sbin/ng…" 15 seconds ago Up 13 seconds 0.0.0.0:80-
>80/tcp, 0.0.0.0:443->443/tcp nginx-web

[root@ubuntu1804 ~]#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@ubuntu1804 ~]#cd /data/docker-compose/
[root@ubuntu1804 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

[root@ubuntu1804 docker-compose]#curl 127.0.0.1/app/
Test Page in app
[root@ubuntu1804 docker-compose]#docker-compose images
Container Repository Tag Image Id Size
---------------------------------------------------------------------------------
--
nginx-web harbor.aya.org/example/nginx-centos7-base 1.6.1 ea3840c349e5
413.4 MB

[root@ubuntu1804 docker-compose]#docker-compose exec service-nginx-web bash
[root@17c17ad30193 /]#
[root@17c17ad30193 /]#
[root@17c17ad30193 /]#
[root@17c17ad30193 /]# tail -f /apps/nginx/logs/access.log
172.17.0.1 - - [04/Feb/2020:16:01:42 +0800] "GET /app/ HTTP/1.1" 200 17 "-"
"curl/7.58.0"
10.0.0.101 - - [04/Feb/2020:16:06:29 +0800] "GET /app/ HTTP/1.1" 200 17 "-"
"curl/7.58.0"
10.0.0.102 - - [04/Feb/2020:16:08:22 +0800] "GET /app/ HTTP/1.1" 200 17 "-"
"curl/7.58.0"

结束前台执行

[root@ubuntu1804 docker-compose]#docker-compose up
Pulling service-nginx-web (10.0.0.102/example/nginx-centos7-base:1.6.1)...
1.6.1: Pulling from example/nginx-centos7-base
f34b00c7da20: Pull complete
544476d462f7: Pull complete
39345915aa1b: Pull complete
d5376f2bbd9e: Pull complete
4596aecee927: Pull complete
1617b995c379: Pull complete
d00df95be654: Pull complete
Digest: sha256:82e9e7d8bf65e160ba79a92bb25ae42cbbf791092d1e09fb7de25f91b31a21ff
Status: Downloaded newer image for 10.0.0.102/example/nginx-centos7-base:1.6.1
Creating nginx-web ... done
Attaching to nginx-web
^CGracefully stopping... (press Ctrl+C again to force) #ctrl+c键,结束容器
Stopping nginx-web ... done

[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
---------------------------------------------------
nginx-web /apps/nginx/sbin/nginx Exit 0
[root@ubuntu1804 docker-compose]#docker ps -a
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES
d71030504f6a harbor.aya.org/example/nginx-centos7-base:1.6.1
/apps/nginx/sbin/ng…" 5 minutes ago Exited (0) About a minute ago
nginx-web

[root@ubuntu1804 docker-compose]#docker-compose start
Starting service-nginx-web ... done
[root@ubuntu1804 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

#关闭容器
[root@ubuntu1804 docker-compose]#docker-compose kill
Killing nginx-web ... done
[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
-----------------------------------------------------
nginx-web /apps/nginx/sbin/nginx Exit 137

删除容器

[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
---------------------------------------------------
nginx-web /apps/nginx/sbin/nginx Exit 0

#只删除停止的容器
[root@ubuntu1804 docker-compose]#docker-compose rm
Going to remove nginx-web
Are you sure? [yN] y
Removing nginx-web ... done
[root@ubuntu1804 docker-compose]#docker-compose up -d
Creating nginx-web ... done
[root@ubuntu1804 docker-compose]#docker-compose rm
No stopped containers

#停止并删除容器及镜像
[root@ubuntu1804 docker-compose]#docker-compose down
Stopping nginx-web ... done
Removing nginx-web ... done
[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
------------------------------
[root@ubuntu1804 docker-compose]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES

#也会自动删除镜像
[root@ubuntu1804 docker-compose]#docker-compose images
Container Repository Tag Image Id Size
----------------------------------------------

后台执行

[root@ubuntu1804 docker-compose]#docker-compose up -d
Creating nginx-web ... done
[root@ubuntu1804 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

[root@ubuntu1804 docker-compose]#curl 127.0.0.1/app/
Test Page in app
[root@ubuntu1804 docker-compose]#curl http://127.0.0.1/app/
Test Page in app

停止和启动与日志查看

[root@ubuntu1804 docker-compose]#docker-compose stop
Stopping nginx-web ... done
[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
---------------------------------------------------
nginx-web /apps/nginx/sbin/nginx Exit 0
[root@ubuntu1804 docker-compose]#docker-compose start
Starting service-nginx-web ... done
[root@ubuntu1804 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

[root@ubuntu1804 docker-compose]#docker-compose restart
Restarting nginx-web ... done
[root@ubuntu1804 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

#执行上面操作时,可以同时开一个终端,观察日事件
[root@ubuntu1804 docker-compose]#docker-compose events
2020-02-04 15:38:13.253822 container kill
5d92e4da8679a973145e5b4db364ae8cf8596a03c4fd0b3b6a28213a2f155be6
(image=harbor.aya.org/example/nginx-centos7-base:1.6.1, name=nginx-web)
2020-02-04 15:38:13.531208 container die
5d92e4da8679a973145e5b4db364ae8cf8596a03c4fd0b3b6a28213a2f155be6
(image=harbor.aya.org/example/nginx-centos7-base:1.6.1, name=nginx-web)
2020-02-04 15:38:13.631137 container stop
5d92e4da8679a973145e5b4db364ae8cf8596a03c4fd0b3b6a28213a2f155be6
(image=harbor.aya.org/example/nginx-centos7-base:1.6.1, name=nginx-web)
2020-02-04 15:38:15.137495 container start
5d92e4da8679a973145e5b4db364ae8cf8596a03c4fd0b3b6a28213a2f155be6
(image=harbor.aya.org/example/nginx-centos7-base:1.6.1, name=nginx-web)
2020-02-04 15:38:15.137546 container restart
5d92e4da8679a973145e5b4db364ae8cf8596a03c4fd0b3b6a28213a2f155be6
(image=10.0.0.102/example/nginx-centos7-base:1.6.1, name=nginx-web)

#以json格式显示日志
[root@ubuntu1804 docker-compose]#docker-compose events --json
{"time": "2020-02-04T15:48:22.423539", "type": "container", "action": "kill",
"id": "19d72e9bc85842d8879d7dcf2a3d2defd79a5a0c3c3d974ddfbbbc6e95bf910b",
"service": "service-nginx-web", "attributes": {"name": "nginx-web", "image":
"10.0.0.102/example/nginx-centos7-base:1.6.1"}}
{"time": "2020-02-04T15:48:22.537200", "type": "container", "action":
"exec_die", "id":
"19d72e9bc85842d8879d7dcf2a3d2defd79a5a0c3c3d974ddfbbbc6e95bf910b", "service":
"service-nginx-web", "attributes": {"name": "nginx-web", "image":
"10.0.0.102/example/nginx-centos7-base:1.6.1"}}
{"time": "2020-02-04T15:48:22.745670", "type": "container", "action": "die",
"id": "19d72e9bc85842d8879d7dcf2a3d2defd79a5a0c3c3d974ddfbbbc6e95bf910b",
"service": "service-nginx-web", "attributes": {"name": "nginx-web", "image":
"10.0.0.102/example/nginx-centos7-base:1.6.1"}}
{"time": "2020-02-04T15:48:22.863375", "type": "container", "action": "stop",
"id": "19d72e9bc85842d8879d7dcf2a3d2defd79a5a0c3c3d974ddfbbbc6e95bf910b",
"service": "service-nginx-web", "attributes": {"name": "nginx-web", "image":
"10.0.0.102/example/nginx-centos7-base:1.6.1"}}
{"time": "2020-02-04T15:48:23.979421", "type": "container", "action": "start",
"id": "19d72e9bc85842d8879d7dcf2a3d2defd79a5a0c3c3d974ddfbbbc6e95bf910b",
"service": "service-nginx-web", "attributes": {"name": "nginx-web", "image":
"10.0.0.102/example/nginx-centos7-base:1.6.1"}}
{"time": "2020-02-04T15:48:23.979468", "type": "container", "action": "restart",
"id": "19d72e9bc85842d8879d7dcf2a3d2defd79a5a0c3c3d974ddfbbbc6e95bf910b",
"service": "service-nginx-web", "attributes": {"name": "nginx-web", "image":
"10.0.0.102/example/nginx-centos7-base:1.6.1"}}

暂停和恢复

[root@ubuntu1804 docker-compose]#docker-compose pause
Pausing nginx-web ... done

[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------
-----
nginx-web /apps/nginx/sbin/nginx Paused 0.0.0.0:443->443/tcp, 0.0.0.0:80-
>80/tcp
[root@ubuntu1804 docker-compose]#curl -m 1 http://127.0.0.1/app/
curl: (28) Operation timed out after 1002 milliseconds with 0 bytes received
[root@ubuntu1804 docker-compose]#docker-compose unpause
Unpausing nginx-web ... done
[root@ubuntu1804 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
[root@ubuntu1804 docker-compose]#curl -m 1 http://127.0.0.1/app/
Test Page in app

从 docker compose 启动多个容器

编辑 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@ubuntu1804 docker-compose]#mkdir /data/nginx
[root@ubuntu1804 docker-compose]#echo Docker compose test page > /data/nginx/index.html

启动容器并验证结果

[root@ubuntu1804 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@ubuntu1804 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@ubuntu1804 docker-compose]#curl http://127.0.0.1/
Docker compose test page
[root@ubuntu1804 docker-compose]#curl http://127.0.0.1:8081/app/
Tomcat Page in app1
[root@ubuntu1804 docker-compose]#curl http://127.0.0.1:8082/app/
Tomcat Page in app2

指定同时启动容器的数量

[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 #同时启动多个同一镜像的容器,不要指定容器名称,否则会冲突
	expose:
	  - 80
	  - 443
# ports: #同时启动多个同一镜像的容器,不要指定端口号,否则会冲突
# 	- "80:80"
# 	- "443:443"
#再加一个service
    service-tomcat:
    	image: 10.0.0.102/example/tomcat-base:v8.5.50
    	

[root@ubuntu1804 docker-compose]#docker-compose ps
Name Command State Ports
------------------------------
[root@ubuntu1804 docker-compose]#docker-compose up -d --scale service-nginx-web=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@ubuntu1804 docker-compose]#docker-compose ps
[root@ubuntu1804 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@ubuntu1804 docker-compose]#docker-compose up -d --scale service-nginx-web=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@ubuntu1804 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@ubuntu1804 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@ubuntu1804 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

扩容和缩容

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

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

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

实战案例: 实现 Wordpress 应用

version: '3'

services:
	db:
		image: mysql:8.0.29-oracle
		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.3-apache
		image: wordpress:php7.4-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

实战案例: 搭建运维平台 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: mysql:5.7.30
		container_name: spug-db
		restart: always
		command: --character-set-server=utf8mb4 --collation-server=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: registry.aliyuncs.com/openspug/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 密码为 123456 的管理员账户,可自行替换管理员账户/密码。
docker exec spug init_spug admin 123456
#访问测试:在浏览器中输入 http://localhost:80 访问(默认账户密码在上面一步初始化时设置)。

实战案例: 一键生成 Docker Compose

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

https://www.composerize.com/

评论