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