Docker Compose介绍

Posted 小晞宝宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Compose介绍相关的知识,希望对你有一定的参考价值。

Docker-Compose

一、Docker Compse介绍

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

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

因此,如果说docker命令就像linux的命令,docker compse就像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/

二、Docker Compse 安装

  • github下载安装
[root@dockerclient src]# curl -L https://github.com/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0    739      0 --:--:-- --:--:-- --:--:--   739
100 16.4M  100 16.4M    0     0  4960k      0  0:00:03  0:00:03 --:--:-- 7183k
[root@dockerclient src]# 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 文件所在在目录里执行
build #构建镜像
bundle #从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker Bundle 备
份文件
config -q #查看当前配置,没有错误不输出任何信息
create #创建服务,较少使用
down #停止和删除所有容器、网络、镜像和卷
events #从容器接收实时事件,可以指定json 日志格式,较少使用
exec #进入指定容器进行操作
help #显示帮助细信息
images #显示镜像信息,较少使用
kill #强制终止运行中的容器
logs #查看容器的日志
pause #暂停服务
port #查看端口
ps #列出容器,较少使用
pull #重新拉取镜像,镜像发生变化后,需要重新拉取镜像,较少使用
push #上传镜像
restart #重启服务,较少使用
rm #删除已经停止的服务
run #一次性运行容器
scale #设置指定服务运行的容器个数
start #启动服务 ,较少使用
stop #停止服务,较少使用
top #显示容器运行状态
unpause #取消暂定
up #创建并启动容器 ,较少使用

[root@dockerclient src]# docker-compose --version
docker-compose version 1.25.3, build d4d1b42b

三、Docker Compose 文件格式

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

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

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

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

四、Docker Composer使用

  • docker compose 文件可在任意目录,创建文件名为docker-compose.yml 配置文件,要注意前后的缩进
[root@dockerclient docker-compose]# vim docker-compose.yml
[root@dockerclient docker-compose]# 
[root@dockerclient docker-compose]# 
[root@dockerclient docker-compose]# docker-compose config
services:
  service-nginx:
    container_name: nginx-web
    expose:
    - 80
    - 443
    image: 82.156.77.59/test/centos_nginx_1_18:v1
    network_mode: bridge
    ports:
    - 80:80/tcp
    - 443:443/tcp
version: 2.1
  • 启动容器

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

#前台启动
[root@fsl docker-compose]#docker-compose up
  • 查看docker-compose 结果
[root@dockerclient docker-compose]# docker-compose up
Creating nginx-web ... done
Attaching to nginx-web

[root@dockerclient docker-compose]# docker-compose  ps
  Name                 Command              State                    Ports                  
--------------------------------------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

[root@dockerclient docker-compose]# docker-compose images
Container       Repository       Tag     Image Id       Size  
--------------------------------------------------------------
nginx-web   centos7_nginx_1_18   v1    97ff26017259   446.7 MB

[root@dockerclient docker-compose]# docker-compose  start
Starting service-nginx ... done
[root@dockerclient docker-compose]# docker-compose ps
  Name                 Command              State                    Ports                  
--------------------------------------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
[root@dockerclient docker-compose]# docker-compose kill
Killing nginx-web ... done
[root@dockerclient docker-compose]# docker-compose  ps
  Name                 Command               State     Ports
------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Exit 137        
[root@dockerclient docker-compose]# 
  • 删除容器
[root@dockerclient docker-compose]# docker-compose  ps
  Name                 Command               State     Ports
------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Exit 137   
#只删除停止的容器
[root@dockerclient docker-compose]# docker-compose rm
Going to remove nginx-web
Are you sure? [yN] y
Removing nginx-web ... done
[root@dockerclient docker-compose]# docker-compose up -d
Creating nginx-web ... done
[root@dockerclient docker-compose]# docker-compose rm
No stopped containers

#停止并删除容器及镜像
[root@dockerclient docker-compose]# docker-compose down
Stopping nginx-web ... done
Removing nginx-web ... done
[root@dockerclient docker-compose]# docker-compose  ps
Name   Command   State   Ports
------------------------------
[root@dockerclient docker-compose]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
#也会自动删除镜像
[root@dockerclient docker-compose]# docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------
  • 后台启动
[root@dockerclient docker-compose]# docker-compose up -d
Creating nginx-web ... done
[root@dockerclient docker-compose]# docker-compose ps
  Name                 Command              State                    Ports                  
--------------------------------------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
[root@dockerclient docker-compose]# curl 127.0.0.1
leilei hello
  • 停止和启动与日志查看
[root@dockerclient docker-compose]# docker-compose stop
Stopping nginx-web ... done
[root@dockerclient docker-compose]# docker-compose ps
  Name                 Command              State    Ports
----------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Exit 0        
[root@dockerclient docker-compose]# docker-compose start
Starting service-nginx ... done
[root@dockerclient docker-compose]# docker-compose ps
  Name                 Command              State                    Ports                  
--------------------------------------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
[root@dockerclient docker-compose]# docker-compose restart
Restarting nginx-web ... done
[root@dockerclient docker-compose]# docker-compose ps
  Name                 Command              State                    Ports                  
--------------------------------------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

#执行上面操作时,可以同时开一个终端,观察日事件
[root@dockerclient docker-compose]# docker-compose events
2022-02-20 17:22:07.144968 container kill 4b94caf249846798e30881381989641fd7f5a9da696a40c57c7d0703fa689bcf (image=centos7_nginx_1_18:v1, name=nginx-web)
2022-02-20 17:22:07.180514 container die 4b94caf249846798e30881381989641fd7f5a9da696a40c57c7d0703fa689bcf (image=centos7_nginx_1_18:v1, name=nginx-web)
2022-02-20 17:22:07.300174 container stop 4b94caf249846798e30881381989641fd7f5a9da696a40c57c7d0703fa689bcf (image=centos7_nginx_1_18:v1, name=nginx-web)
2022-02-20 17:22:11.722409 container start 4b94caf249846798e30881381989641fd7f5a9da696a40c57c7d0703fa689bcf (image=centos7_nginx_1_18:v1, name=nginx-web)

#以json格式显示日志
[root@dockerclient docker-compose]#docker-compose events --json
  • 暂停与恢复
[root@dockerclient docker-compose]# docker-compose pause
Pausing nginx-web ... done
[root@dockerclient docker-compose]# docker-compose ps
  Name                 Command              State                     Ports                  
---------------------------------------------------------------------------------------------
nginx-web   /bin/sh -c /bin/sh -c nginx   Paused   0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
[root@dockerclient docker-compose]# curl 127.0.0.1
^C
[root@dockerclient docker-compose]# curl -m 2 127.0.0.1
curl: (28) Operation timed out after 2002 milliseconds with 0 out of -1 bytes received
[root@dockerclient docker-compose]# docker-compose unpause
Unpausing nginx-web ... done
[root@dockerclient docker-compose]# curl -m 2 127.0.0.1
leilei hello
  • 指定同时启动容器的数量
[root@dockerclient docker-compose]# cat docker-compose.yml 
service-nginx:
  image: centos7_nginx_1_18:v1  
  #container_name: nginx-web        #同时启动多个同一镜像的容器,不要指定容器名称,否则会冲突
  expose:
    - 80
    - 443
  #ports:           #同时启动多个同一镜像的容器,不要指定端口号,否则会冲突
  #  - "80:80"
  #  - "443:443"

service-haproxy:
  image: centos7_haproxy:v1

[root@dockerclient docker-compose]# docker-compose up -d --scale service-nginx=2
Recreating nginx-web ... done
Creating docker-compose_service-nginx_2 ... done
[root@dockerclient docker-compose]# docker-compose ps
             Name                           Command              State        Ports     
----------------------------------------------------------------------------------------
docker-compose_service-nginx_1   /bin/sh -c /bin/sh -c nginx   Up      443/tcp, 80/tcp
docker-compose_service-nginx_2   /bin/sh -c /bin/sh -c nginx   Up      443/tcp, 80/tc
  • Docker Compose 启动多个容器

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

[root@dockerclient docker-compose]# cat docker-compose.yml
service-nginx-web:
  image: nginx-web:v1
  container_name: nginx-web
  volumes:
    - /data/nginx:/apps/nginx/html/
  expose:
    - 80
    - 443
  ports:
    - "80:80"
    - "443:443"
service-tomcat-app1:
  image: tomcat-web:v1
  container_name: tomcat1
  expose:
    - 8080
  ports:
    - "8081:8080"
service-tomcat-app2:
  image: tomcat-web:v2
  container_name: tomcat2
  expose:
    - 8080
  ports:
    - "8082:8080"

五、示例

编写 docker-compose.yml 文件,实现haproxy+nginx

  • 基础 镜像
FROM centos:centos7.8.2003

LABEL maintainer="fsl"

RUN yum -y install wget && rm -f /etc/yum.repos.d/* && wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo \\
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo \\
&& yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget curl bzip2 lsof zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel \\
&& yum clean all \\
&& rm -f /etc/localtime \\
&& ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • nginx 镜像
FROM centos_base:v1  #基础镜像

LABEL maintainer="test_centos_nginx"

ADD nginx-1.18.0.tar.gz /usr/local/src

RUN cd  /usr/local/src/nginx-1.18.0 \\
&& ./configure --prefix=/usr/local/nginx --user=www --group=www \\
    --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \\
    --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \\
    --pid-path=/var/run/nginx/nginx.pid \\
&& make && make install \\
&& rm -rf /usr/local/src/nginx* 

RUN useradd -r www && chown -R www.www /var/log/nginx

RUN rm -rf /usr/local/nginx/html/*  && \\
echo "leilei hello" >/usr/local/nginx/html/index.html

ADD nginx.conf /usr/local/nginx/conf/nginx.conf #配置文件省略

EXPOSE 80

ENV PATH /usr/local/nginx/sbin/:$PATH

CMD ["nginx"]
  • haproxy 镜像
FROM centos_base:v1 

LABEL maintainer="fsl haproxy"

ADD haproxy-2.1.2.tar.gz /usr/local/src

RUN cd /usr/local/src/haproxy-2.1.2 \\
&& make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \\
USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/apps/haproxy \\
&& make install PREFIX=/apps/haproxy \\
&& ln -s /apps/haproxy/sbin/haproxy /usr/sbin/ \\
&& mkdir /apps/haproxy/run \\
&& rm -rf /usr/local/src/haproxy*

ADD haproxy.cfg /etc/haproxy/
ADD run_haproxy.sh /usr/bin/

EXPOSE 80 

CMD ["run_haproxy.sh"]  #脚本就是启动命令

#haproxy 配置注意事项
server nginx-web service-nginx-web:80 check inter 3000 fall 2 rise 5
#service-nginx-web是docker-compose.yml文件中使用的地址
  • Docker-compose 文件
service-nginx-web:
  image: centos7_nginx_1_18:v1 
  container_name: nginx-web
  expose:
    - 8080
  ports:
    - "8080:8080"
service-haproxy:
  image: centos7_haproxy:v1
  container_name: haproxy
  expose:
    - 80
  ports:
    - "80:80"
  links:
    - service-nginx-web  #为配置文件调用

以上是关于Docker Compose介绍的主要内容,如果未能解决你的问题,请参考以下文章

11-docker系列-docker之compose安装和相关命令

docker-compose up与docker-compose up -d

docker-compose link 导致服务不可用

Docker-Compose介绍,安装和使用

docker-compose介绍

docker与docker-compose介绍,对比与使用