Docker系列(十一):Docker Compose管理部署容器

Docker Compose是一个定义和管理多容器的工具,也是一种容器编排工具,前身是Pig,使用Python语言编写。使用Docker Compose配置文件描述多个容器应用的架构,比如使用什么镜像、数据卷、网络、映射端口等;然后一条命令管理所有服务,比如启动、停止、重启等。


Docker Compose的安装:

1)下载二进制文件

wget https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m`

2)添加可执行权限

mv docker-compose-Linux-x86_64 /usr/bin/docker-compose

chmod +x /usr/bin/docker-compose 

3)验证安装结果

[root@centos7 ~]# docker-compose --version

docker-compose version 1.13.0, build 1719ceb


Docker Compose的使用:

docker compose 将所管理的容器分为三层,分别是工程(project),服务以及容器。docker compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像,参数和依赖,一个服务可包括多个容器实例

Docker Compose的操作步骤:

  • 使用 dockerfile 定义应用程序环境,以便在任何地方重现该环境

  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行

  • 运行 docker-compose up 命令,启动并运行整个应用程序

前面已经介绍过dockerfile,所以这里介绍一下Docker Compose的配置文件。Docker Compose使用YAML作为其配置文件格式,在docker-compose.yml文件中定义了容器的镜像、参数、端口、启动顺序等。YAML是一种标记语言很直观的数据序列化格式,可读性高,类似于XML数据描述语言,但语法比XML简单很多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来,hash用花括号括起来。

YAML文件格式注意事项:

  • 不支持制表符tab键缩进,需要使用空格缩进;

  • 通常开头缩进2个空格;

  • 字符后缩进1个空格,如冒号、逗号、横杠;

  • 用#进行注释;

  • 如果包含特殊字符用单引号引起来;

  • 布尔值(true、false、yes、no、on、off)必须用引号括起来,这样分析器会将它们解释为字符串;


Compose配置文件常用参数:

build:构建镜像上下文路径

dockerfile:指定dockerfile文件名

image:来自镜像

args:构建参数,在dockerfile中指定的参数

command:覆盖默认命令

container_name:自定义容器名称。如果自定义名称,则无法将服务scale到1容器之外

deploy:指定与部署和运行相关的配置。限版本3

depends_on:服务之间的依赖,控制服务启动顺序,正常是按顺序启动服务

dns:自定义DNS服务器,可以是单个值或列表

entrypoint:覆盖entrypoint

env_file:从文件添加环境变量,可以是单个值或列表

environment:添加环境变量,可以是数组或字典,布尔值用引号括起来

expose:声明容器服务端口

links:连接到另一个容器

external_links:连接Compose之外的容器

extra_hosts:添加主机名映射,与--add-host相同

logging:记录该服务的日志,与--log-driver相同

network_mode:网络模式,与--net相同

networks:要加入的网络

pid:将PID模式设置主机PID模式,与宿主机共享PID地址空间,如pid: "host"

ports:暴露端口,与-p相同,但端口不低于60

sysctls:在容器内设置内核参数,可以是数组或字典

ulimits:覆盖容器的默认ulimits

volumes:挂载一个目录或一个已存在的数据卷容器到容器

restart:默认no,可选参数always|on-failure|unless-stopped

hostname:主机名

working_dir:工作目录


docker-compose.yml示例:

[root@centos7 compose_proj01]# cat docker-compose.yml 
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
    links:
      - "tomcat01:tomcat01"
      - "tomcat02:tomcat02"
    volumes:
      - ./webapps:/usr/local/nginx/html
    depends_on:
      - tomcat01
      - tomcat02
  tomcat01:
    hostname: tomcat01
    build: ./tomcat
    volumes:
      - ./webapps/tomcat01:/usr/local/tomcat/webapps
  tomcat02:
    hostname: tomcat02
    build: ./tomcat
    volumes:
      - ./webapps/tomcat02:/usr/local/tomcat/webapps


Docker Compose常用选项:

用法:docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

-f, --file FILE:指定Compose配置文件,默认docker-compose.yml

-p, --project-name NAME:指定项目名称,默认目录名

--verbose:显示更多的输出

-v, --version:显示docker compose版本

-H, --host HOST:指定守护socket连接到指定的主机

--project-directory PATH:指定一个可选的工作目录,默认为当前compose文件所在目录


Docker Compose常用命令:

build:重新构建服务

    用法:build [options] [--build-arg key=val...] [SERVICE...]

        --no-cache:不适用缓存构建镜像

        --build-arg key=val:设置构建时的变量

config:验证和查看Compose文件

    用法:config [options]

        -q, --quite:只验证不打印

        --services:只打印服务名称,每行一个

        --volumes:打印数据卷名称,每行一个

exec:在运行的容器里执行命令

    用法:exec [options] SERVICE COMMAND [ARGS...]

        -d:在后台运行命令

        --privileged:给这个进程赋予特权权限

        --user USER:作为该用户运行该命令

        -T:禁用分配伪终端,默认分配一个终端

        --index=index:多个容器时的索引数字,默认为1

port:打印绑定的开放端口

    用法:port [options] SERVICE PRIVATE_PORT

        --protocol=proto:tcp或udp协议,默认为tcp

        --index=index:多个容器时的索引数字,默认为1

ps:列出容器

    用法:ps [options] [SERVICE...]

        -q:只显示ID

rm:删除停止的服务容器

    用法:rm [options] [SERVICE...]

        -f, --force:强制删除

        -s, --stop:删除容器时如果需要先停止容器

        -v:删除与容器相关的任何匿名卷

scale:指定一个服务启动容器数量

    用法:scale [options] [SERVICE=NUM...]

        -t, --timeout TIMEOUT:指定一个停止超时时间,单位为秒,默认为10秒

up:创建和启动容器

    用法:up [options] [--scale SERVICE=NUM...] [SERVICE...]

        -d:在后台运行容器

        --no-deps:不启动连接服务

        --force-recreate:强制重建容器,即使它们的配置和镜像未发生任何修改

        --no-recreate:如果容器存在,不重建它们

        --no-build:不构建镜像,即使它丢失

        --build:启动容器前先构建镜像

        --scale SERVICE=NUM:指定一个服务(容器)的启动数量

stop:停止服务

    用法:stop [options] [SERVICE...]

        -t, --timeout TIMEOUT:指定停止服务的超时时间,单位为秒,默认值为10

start:启动服务

    用法:start [SERVICE...]

restart:重启服务

    用法:restart [options] [SERVICE...]

top:显示容器运行的进程

    用法:top [SERVICE...]

logs:显示容器的输出

    用法:logs [options] [SERVICE...]

        -f, --follow:实时输出日志

        -t, --timestamps:显示时间戳

        --tail="all":从日志末端显示行数

down:停止容器和删除容器、网络、数据卷和镜像

    用法:down [options]

        --rmi type:移除镜像,type能接收的值为:all,local。如果为all,则移除该服务用到的所有镜像;如果为local,则仅移除那些在image字段没有设置自定义标签的镜像。

        -v, --volumes:移除在volume区域定义的且链接到容器上的有命名的和匿名的数据卷

        --remove-orphans:移除在compose配置文件中为定义的服务容器


示例1:使用Docker compose部署nginx+tomcat环境

说明:目的是使用docker-compose部署nginx和tomcat的环境,使用nginx反向代理tomcat展示内容。

1)演示的文件目录结构如下

[root@centos7 compose_proj01]# tree
.
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── nginx.conf
├── tomcat
│   ├── apache-tomcat-8.5.38.tar.gz
│   ├── Dockerfile
│   └── jdk-8u162-linux-x64.tar.gz
└── webapps
    ├── hello.html
    ├── timg.jpg
    ├── tomcat01
    │   └── ROOT
    │       └── index.jsp
    └── tomcat02
        └── ROOT
            └── index.jsp
7 directories, 10 files

2)nginx目录的相关设置

注:nginx的Dockerfile使用的是前面dockerfile里记录的,所以不在赘述,这里补充一下nginx里的相关配置。

......
    upstream composeproj01 {
        server tomcat01:8080;
        server tomcat02:8080;
    }
    server {
        listen 80;
        server_name localhost;
        server_tokens off;
        location / {
            proxy_pass http://composeproj01;
            proxy_set_header Host $host;
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header SSL_CERT $ssl_client_cert;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        location ~ \.(html|css|jpg|png|gif)$ {
            root /usr/local/nginx/html;
        }
    }
......

3)tomcat目录的相关配置

注:tomcat的Dockerfile是用的也是前面的java镜像的构建文件,也不再过多介绍。

4)webapps的相关配置

[root@centos7 compose_proj01]# ll webapps/
total 40
-rw-r--r-- 1 root root    13 Apr 17 09:43 hello.html
-rw-r--r-- 1 root root 26591 Apr 17 09:29 timg.jpg
drwxr-xr-x 3 root root  4096 Apr 17 09:30 tomcat01
drwxr-xr-x 3 root root  4096 Apr 17 09:31 tomcat02
[root@centos7 compose_proj01]# tree webapps/
webapps/
├── hello.html
├── timg.jpg
├── tomcat01
│   └── ROOT
│       └── index.jsp
└── tomcat02
    └── ROOT
        └── index.jsp
4 directories, 4 files
[root@centos7 compose_proj01]# cat webapps/tomcat01/ROOT/index.jsp 
Display on tomcat01.
[root@centos7 compose_proj01]# cat webapps/tomcat02/ROOT/index.jsp 
Display on tomcat02.

5)docker-compose.yml配置

[root@centos7 compose_proj01]# cat docker-compose.yml 
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
    links:
      - "tomcat01:tomcat01"
      - "tomcat02:tomcat02"
    volumes:
      - ./webapps:/usr/local/nginx/html
    depends_on:
      - tomcat01
      - tomcat02
  tomcat01:
    hostname: tomcat01
    build: ./tomcat
    volumes:
      - ./webapps/tomcat01:/usr/local/tomcat/webapps
  tomcat02:
    hostname: tomcat02
    build: ./tomcat
    volumes:
      - ./webapps/tomcat02:/usr/local/tomcat/webapps

6)使用Docker Compose进行构建

[root@centos7 compose_proj01]# docker-compose up -d

<过程略>

7)验证结果

0001.png

0002.png

0004.png

0003.png

结论:通过docker-compose.yml成功部署了nginx和tomcat的环境,将webapps目录分别挂载到nginx和tomcat的工作目录中,实现动态内容通过tomcat展现,静态内容通过nginx展现。而这种动静分离一般都需要分别将服务部署在不同的机器上,使用docker compose很方便的就一步完成了。




猜你喜欢

转载自blog.51cto.com/jerry12356/2380132