一、什么是docker-compose
docker-compose可以通过docker-compose.yaml文件在现有镜像的基础上(没有镜像自动pull)按顺序批量启动多个容器来完成环境的部署,比如 redis+mysql+elk+nginx。通常一个docker-compose.yaml就代表一个完整的项目。
二、docker-compose安装
查看docker-compose yaml文件应该使用哪个version,一般使用version:"3.0"就够用了
https://docs.docker.com/compose/compose-file/compose-versioning/
docker-compose并不直接依赖于docker-ce,直接安装最新版的就可以
https://github.com/docker/compose/releases
1、可以通过github下载安装
# 1.29.2版本
# sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# cp -pr /usr/local/bin/docker-compose /usr/sbin/
# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
# 直接下载二进制文件
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose -v
Docker Compose version v2.23.3
2、也可以去百度网盘下载docker-compose-Linux-1.29.2-x86_64
# mv docker-compose-Linux-1.29.2-x86_64 /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# cp -pr /usr/local/bin/docker-compose /usr/sbin/
# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
三、docker-compose常用命令
以下为docker-compose 1.29.2版本
1、启动 停止 重启
# 在1.29.2版本中yaml文件名称必须是docker-compose.yaml否则它会提示不认识该文件
# docker-compose -f docker-compose.yml up # 前台启动
# docker-compose -f docker-compose.yml up -d # 后台启动
# docker-compose -f docker-compose.yml restart
# docker-compose -f docker-compose.yml stop
# docker-compose kill # 会停掉所有contianer
2、查看列表、查看日志
# docker-compose ps # 23.2版本用ls查看
Name Command State Ports
-----------------------------------------------------------------------------
mytomcat catalina.sh run Up 0.0.0.0:8082->8080/tcp,:::8082->8080/tcp
# docker-compose logs tomcat # 这个名称必须是yaml文件中services下面的名称
# docker-compose logs -f tomcat
# docker-compose -f xxxxx.yaml logs tomcat
----------------------------------
获得一个命令的帮助
docker-compose 命令 --help
构建并启动所有容器,如果镜像存在就重新构建
docker-compose up -d --build
启动所有服务
docker-compose up -d
构建启动nignx容器
docker-compose up -d nginx
-f 指定使用的Compose配置文件启动,默认为docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
运行一个服务,并在服务上执行一个命令
docker-compose run 容器id或容器名 ip addr
登录到nginx容器中
docker-compose exec nginx bash
此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose down
列出项目中运行的所有容器
docker-compose ps
列出项目中运行及未运行的所有容器
docker-compose ps -a
列出所有运行的服务容器
docker-compose ls
列出所有服务容器(包括未运行的容器)
docker-compose ls -a
重新启动nginx容器
docker-compose restart nginx
构建镜像
docker-compose build nginx
不带缓存的构建
docker-compose build --no-cache nginx
查看各个服务容器内运行的进程
docker-compose top
查看nginx的实时日志
docker-compose logs -f nginx
列出 Compose 文件包含的镜像
docker-compose images
验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose config
以json的形式输出nginx的docker日志
docker-compose events --json nginx
暂停nignx容器
docker-compose pause nginx
恢复ningx容器
docker-compose unpause nginx
删除容器(删除前必须关闭容器,执行stop)
docker-compose rm nginx
强制删除容器(不必先关闭容器)
docker-compose rm -f nginx
停止nignx容器
docker-compose stop nginx
启动nignx容器
docker-compose start nginx
重启项目中的nignx容器
docker-compose restart nginx
下载依赖的镜像
docker-compose pull
推送服务依的镜像
docker-compose push
设置指定服务运行的容器个数。通过service=num的参数来设置数量
docker-compose scale web=3 db=2
查看版本信息
docker-compose version
四、docker-compose.yml语法
1、以某公司线上代码为例
(1) 查看当前镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
deepcloudsdpk8s.azurecr.cn/deeptundev dev_f52aa82_20210707_144953 74a2769538e7 12 days ago 1.64GB
deepcloudsdpk8s.azurecr.cn/deeptundev dev_ddd8a7d_20210706 609ec7a275f4 13 days ago 1.64GB
deeptunbetaal v6.0.27_0629_1840 10e9322eeade 2 weeks ago 1.55GB
centos 7.6.1810 f1cb7c7d58b7 2 years ago 202MB
(2) 编写docker-compose.yml
# cat beta_gteway_1000001.yml
# 这里版本只要再4以下就行
version: "3"
# 这里表示可以写多个服务(一个服务就是一个容器)
services:
# 这是第一个服务名称(yml语法要求空2格)
beta_gteway_1000001:
# 表示该服务使用哪个镜像
image: deepcloudsdpk8s.azurecr.cn/deeptundev:dev_f52aa82_20210707_144953
# 表示该服务跟随docker启动而启动
restart: always
# 为容器起个名字
container_name: beta_gteway_1000001
# 为容器设置主机名
hostname: beta_gteway_1000001
# 表示以特权模式启动容器
privileged: true
# xxxx
volumes:
# 这里会把容器中的/project/openresty/nginx/logs挂载到宿主机的/data/gateway/beta_gteway_1000001/logs/nginx
# 注意:如果容器里面有文件启动容器后这些目录下的内容会被覆盖,所以需要提前在宿主目录中创建对应的文件再启动容器
- /data/gateway/beta_gteway_1000001/logs/nginx:/project/openresty/nginx/logs:rw
- /data/gateway/beta_gteway_1000001/logs/deeptun:/project/deeptun/logs:rw
- /data/gateway/beta_gteway_1000001/logs/connector:/project/connector/logs:rw
#这里会自动将容器目录挂载到宿主机的随机目录下,但是这个需要在下面volumes:deepspa声明一个卷名,具体挂载位置可以看docker inspect
- deepspa:/project/deepspa/logs:rw
# 这里表示挂在到当前目录下
- .:/var/www/html:rw
ports:
# 宿主机的30001端口对应容器中62205的udp端口,这里最后写成字符串形式
- "30001:62205/udp"
- "8080:8080"
- "127.0.0.1:8081:8081"
# 启动容器时的最大文件描述符
ulimits:
nproc: 65535
# 启动容器时指定的环境变量
environment:
# 变量中不能使用引号
- TUNPORT=30001
- REDISHOST=172.40.0.210:6379
- REDISPWD=Redcore@redis
- REDISDB=0
- ETCDHOST=172.40.0.210:2379,172.40.0.99:2379,172.40.0.208:2379
# 本机IP
- NODEIP=120.92.17.64
- REGION=BEIJING
# 使用南区配置
- NODEID=f2f48cd98f00b204e98045i8
- CTLID=s3r446484ae34901a8345662
# 自定义
- TUNID=beta00js00bj000000000001
tomcat: # 这是第二个服务
image: centos:7.6.1810
ports: "8081:8080"
privileged: true
restart: always
container_name: mytomcat
volumes:
deepspa: # 这里声明数据卷卷名,在上面的volumes中会自动和容器目录进行挂载。这里默认会用项目名+卷名(项目名就是当前目录名)
external: # 这个表示使用自定义的卷名
true # true为确定使用自定义的卷名,这种方式需要先创建卷名docker volume create deepspa
2、让容器加入同一个网桥
# 创建网桥
# docker network create -d birged lamp
version: "3.0"
services:
apache2:
image: ubuntu/apache2
container_name: apache2
restart: always
privileged: true
networks:
- lamp # 创建容器是指定网桥
ports:
- "8081:80"
mysql8:
image: mysql
container_name: mysql8
restart: always
privileged: true
networks:
- lamp # 创建容器是指定网桥
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
networks:
lamp: # 这里还需要把外部的网桥引入进来才能让上面的2个容器使用
external: true
3、通过docker-compose运行容器
# docker-compose -f beta_gteway_1000001.yml up -d
--------------
-f 表示指定docker-compose.yml文件
up 表示前台启动
up -d 表示后台启动
stop 停止
restart 重启
五、docker-compose项目案例
1、编写docker-tomcat.yml项目
[root@bogon wenqiang]# cat docker-tomcat.yml
version: "3.0"
services:
tomcat01: # 第一个容器
image: tomcat:latest # 容器来源镜像
container_name: mytomcat01 # 为容器起名
ports:
- "8080:8080" #宿主机端口:容器端口
volumes:
- tomcatdata01:/usr/local/tomcat/webapps:rw # 这里是自动挂载,tomcatdata01对应下面定义好的卷名
networks: # 为当前容器定义一个网桥
- hello
tomcat02:
image: tomcat:latest
container_name: mytomcat02
ports:
- "8081:8080"
volumes:
- tomcatdata02:/usr/local/tomcat/webapps:rw
networks: # 为当前容器定义一个网桥
- hello
volumes: # 这里定义卷名
tomcatdata01: # 第一个卷名
external: # 这里表示自定义卷名
false # true表示使用自定义卷名需要提前创建docker volume create tomcatdata01, false表示自动创建卷名
tomcatdata02:
external:
false
networks:
hello: # 定义上面两个容器用到的网桥名称,这样就可以让两个容器之间通过该网桥通信了(在容器中访问另一个容器)
external: # 这里表示使用自定义网桥名称
false # false表示不适用自定义名称,true表示使用自定义名称,需要提前创建网桥docker network create -d birdge hello
# docker-compose -f docker-tomcat.yml up
2、编写docker-mysql.yml项目
[root@bogon wenqiang]# cat docker-mysql.yml
version: "3.0"
services:
mysql:
image: mysql:5.7.35
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql:rw
- mysqlconf:/etc/mysql:rw
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
mysqldata:
external:
false
mysqlconf:
external:
false
[root@bogon wenqiang]# docker-compose -f docker-mysql.yml up