docker-compose介绍与使用

一、什么是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的爱迪生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值