一、Docker-compose简介
Docker-Compose项目是基于Python开发的Docker官方开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是 工程(project),服务(service)以及容器(container)。
- Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。
- 一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
- 一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如Consul。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。
二、YAML文件格式及编写注意事项
1、YAML文件格式
- YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。
- 类似于 json数据描述语言,语法比 json简单的很多。
- YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [ ] 括起来, hash 用花括号 { }括起来。
2、YAML格式的注意事项
- 不支持制表符 tab 键缩进,只能使用空格缩进
- 通常开头缩进2个空格
- 字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
- 用 # 号注释
- 如果包含特殊字符用单引号 ‘’ 引起来作为普通字符;如果用双引号“”表示特殊字符本身的意思
- 布尔值必须用引号 “” 括起来
- 区分大小写
3、YAML数据结构
对象: 键值对的字典
animal: pets
数组: 一组按次序排列的列表
- cat
- dog
- goldfish
布尔值
debug: "true"
debug: "false"
#Yaml示例
languages: #序列的映射
- Java
- Golang
- Python
websites: #映射的映射
Baidu: www.baidu.com
Wangyi: www.163.com
Souhu: www.souhu.com
#或者
languages: ["Java","Golong","Python"]
websites:
Baidu:
www.baidu.com
Wangyi:
www.163.com
Souhu:
www.souhu.com
#Json格式
{
languages: [
'Java',
'Golong',
'Python',
],
websites: [
Baidu: 'www.baidu.com',
Wangyi: 'www.163.com',
Souhu: 'www.souhu.com',
]
}
4、Docker-Compose配置常用字段
字段 | 描述 |
---|---|
build | 指定 Dockerfile 文件名 (要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定) |
dockerfile | 构建镜像上下文路径 |
context | 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址 |
image | 指定镜像(已存在) |
command | 执行命令。覆盖容器启动后默认执行的命令(会覆盖Dockerfile的CMD指令) |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称呢,则无法scale指定容器数量 |
deploy | 指定部署和运行服务相关配置,只能在 Swarm 模式使用 |
environment | 添加环境变量 |
networks | 加入网络,引用顶级networks下条目 |
network_mode | 设置容器的网络模式,如 host, bridge,...... |
ports | 暴露容器端口,与 -p 相同,但端口不能低于 60 |
volumes | 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称 |
volumes_from | 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持 |
hostname | 容器主机名 |
sysctls | 在容器内设置内核参数 |
links | 连接到另外一个容器,- 服务名称[:服务别名] |
privileged | 用来给容器root权限,注意是不安全的,true | false |
restart | 设置重启策略,no,always,nounless-st-failure,oped |
no,默认策略,在容器退出时不重启容器。 | |
on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 | |
on-failure:3,在容器非正常退出时重启容器,最多重启3次。 | |
always,在容器退出时总是重启容器。 | |
unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。 |
5、Docker-compose 常用命令
字段 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
三、部署docker-compose
1、安装所需包
[root@localhost ~]#cd /opt/
[root@localhost opt]#ls
containerd lnmp rh
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
containerd docker-compose-1.25.0 lnmp rh
[root@localhost opt]#mv docker-compose-1.25.0 docker-compose
[root@localhost opt]#ls
containerd docker-compose lnmp rh
[root@localhost opt]#chmod +x docker-compose
[root@localhost opt]#ls
containerd docker-compose lnmp rh
[root@localhost opt]#mv docker-compose /usr/local/bin/
[root@localhost opt]#docker-compose --version
docker-compose version 1.25.0-rc4, build 8f3c9c58
[root@localhost opt]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56b579133ec3 php:lnmp "/bin/sh -c '/usr/lo…" 18 hours ago Exited (0) 18 hours ago php
28af5fe9d022 mysql:lnmp "/usr/local/mysql/bi…" 19 hours ago Exited (0) 18 hours ago mysql
94f22e52423f nginx:lnmp "/usr/local/nginx/sb…" 22 hours ago Exited (0) 18 hours ago nginx
[root@localhost opt]#docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
56b579133ec3
28af5fe9d022
94f22e52423f
[root@localhost opt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php lnmp 3f352863e19b 18 hours ago 1.4GB
mysql lnmp d446e4998a17 20 hours ago 10.1GB
nginx lnmp 97a40e10689a 22 hours ago 569MB
nginx latest 7383c266ef25 5 days ago 188MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
2、部署docker-compose (nginx)
1.创建管理文件夹
[root@localhost opt]#ls
containerd lnmp rh
[root@localhost opt]#mkdir -p /opt/docker-compose_nginx
[root@localhost opt]#cd /opt/docker-compose_nginx/
[root@localhost docker-compose_nginx]#mkdir wwwroot
[root@localhost docker-compose_nginx]#ls
wwwroot
[root@localhost docker-compose_nginx]#mkdir /opt/docker-compose_nginx/nginx
[root@localhost docker-compose_nginx]#cd nginx/
[root@localhost nginx]#ls
[root@localhost nginx]#cd /opt/lnmp/nginx/
[root@localhost nginx]#ls
Dockerfile html nginx-1.12.0.tar.gz nginx.conf wordpress-4.9.4-zh_CN.tar.gz
[root@localhost nginx]#cp -r Dockerfile nginx-1.12.0.tar.gz /opt/docker-compose_nginx/nginx/
[root@localhost nginx]#cd -
/opt/docker-compose_nginx/nginx
[root@localhost nginx]#ls
Dockerfile nginx-1.12.0.tar.gz
[root@localhost nginx]#yum -y install tree
2.编写Dockerfile文件
[root@localhost nginx]#vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@localhost nginx]#vim Dockerfile
FROM centos:7
MAINTAINER this is nginx image <ah>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
RUN make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]
[root@localhost wwwroot]#pwd
/opt/docker-compose_nginx/wwwroot
[root@localhost wwwroot]#echo "<h1>this is nginx</h1>" > /opt/docker-compose_nginx/wwwroot/index.html
3.编写docker-compose.yml
[root@localhost docker-compose_nginx]#pwd
/opt/docker-compose_nginx
[root@localhost docker-compose_nginx]#vim docker-compose.yml
service:
nginx:
container_name: web
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1234:80
- 4321:443
networks:
lnmp:
ipv4_address: 172.19.0.10
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
mykysw:
driver: bridge
ipam:
config:
- subnet: 172.19.0.0/16
4.查看
[root@localhost docker-compose_nginx]#pwd
/opt/docker-compose_nginx
[root@localhost docker-compose_nginx]#tree
.
├── docker-compose.yml
├── nginx
│?? ├── Dockerfile
│?? ├── nginx-1.12.0.tar.gz
│?? └── run.sh
└── wwwroot
└── index.html
2 directories, 5 files
5.创建
6.验证
7.查看网络及IP地址
3、部署docker-compose (nginx+tomcat)
1.docker-compose.yml
[root@localhost docker-compose_nginx]#vim docker-compose.yml
version: '3'
services:
nginx:
container_name: web1
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1234:80
- 4321:443
networks:
lnmp:
ipv4_address: 172.19.0.10
volumes:
- ./wwwroot:/usr/local/nginx/html
tomcat:
container_name: web2
hostname: tomcat
build:
context: ./tomcat
dockerfile: Dockerfile
ports:
- 8080:8080
networks:
- lnmp:
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.19.0.0/16
2.将前面得web停止并删除
[root@localhost docker-compose_nginx]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
822da62329dd docker-compose_nginx_nginx "/usr/local/nginx/sb…" 2 hours ago Up 2 hours 0.0.0.0:1234->80/tcp, :::1234->80/tcp, 0.0.0.0:4321->443/tcp, :::4321->443/tcp web
[root@localhost docker-compose_nginx]#docker stop web
web
[root@localhost docker-compose_nginx]#docker rm web
web
删除镜像
[root@localhost docker-compose_nginx]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-compose_nginx_nginx latest b53232cf8956 2 hours ago 569MB
php lnmp 3f352863e19b 23 hours ago 1.4GB
mysql lnmp d446e4998a17 24 hours ago 10.1GB
nginx lnmp 97a40e10689a 27 hours ago 569MB
nginx latest 7383c266ef25 6 days ago 188MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
[root@localhost docker-compose_nginx]#docker rmi b53232cf8956
Untagged: docker-compose_nginx_nginx:latest
Deleted: sha256:b53232cf89565d4809d6580c40e6d410045a12baa2093c7c3dca8500fef25dd1
Deleted: sha256:c96b94b951f6995c3a08a511b4f9bcaf946d59e854abca693724a019acbea6c9
Deleted: sha256:b927f4590f300cd65ec3221b9207fca786121a9945f013647b95e35605d478e1
Deleted: sha256:fc083d1e4e5e001f971127691903c791b2d1e410845a7a80b3191e6daf9f3eed
Deleted: sha256:309a2811bf2be28b373a2f7ab9031288c3de2324c4baca43af9ee083f50762d2
Deleted: sha256:cb5cd75405984df005e991407e6f297ab6b8a4df9d9a0f5492aa2c286d1d3a8a
Deleted: sha256:6e4f5758bb520b355176a09f9ec1adb120ba16ba5b4cac476b53e552e9deab8c
Deleted: sha256:d847363fe07f07191510bb344f16fea90b08ad184bb197ad91a78f76e837af10
Deleted: sha256:cd279ee686dd81a052abb2186d350166829069738a969283b4605d28b7a029a2
Deleted: sha256:02b297343f9e6154cb5ae7cfd463329bbc5c6e571fc135d3489cabde6eba6b25
Deleted: sha256:f64bc769af5ded3de3938b2baf7259c6c3430921eb02a315199b17438c5370d4
Deleted: sha256:9fe95a817933ccaf72c14c51e28b6a83877fdacfee785b2f3b3850fcf54a0294
Deleted: sha256:f2ef02d8183a673b7645525021b8b43ba8291f06313ec4fd92352190f044bf20
Deleted: sha256:d9c98a6944c7f9b59c7f25ba49842af4152c4c467eae723f6a4b8f1fde210520
Deleted: sha256:ad949c056e1c32df2f31e55b4d58b448cecd0208e49cf04e8737dea9a9f0e28f
Deleted: sha256:fda4ed2dcf4c6b0413285f260eccdfa07bace68af94952220bca2f36d89feeb4
删除网路
[root@localhost docker-compose_nginx]#docker network list
NETWORK ID NAME DRIVER SCOPE
213c0b6bc77b bridge bridge local
0d33d51242cc docker-compose_nginx_lnmp bridge local
74a43c49b8c6 host host local
adf31dc63e2f mynetwork bridge local
71f04f9ad5e1 none null local
[root@localhost docker-compose_nginx]#docker network rm docker-compose_nginx_lnmp
docker-compose_nginx_lnmp
[root@localhost docker-compose_nginx]#docker network list
NETWORK ID NAME DRIVER SCOPE
213c0b6bc77b bridge bridge local
74a43c49b8c6 host host local
adf31dc63e2f mynetwork bridge local
71f04f9ad5e1 none null local
3.建立tomcat文件夹
[root@localhost docker-compose_nginx]#mkdir tomcat
[root@localhost docker-compose_nginx]#cd tomcat/
[root@localhost tomcat]#cp -r ../../apache-tomcat-8.5.16.tar.gz ./
[root@localhost tomcat]#cp -r ../../jdk-8u291-linux-x64.tar.gz ./
[root@localhost tomcat]#ls
apache-tomcat-8.5.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost tomcat]#vim Dockerfile
[root@localhost tomcat]#ls
apache-tomcat-8.5.16.tar.gz Dockerfile jdk-8u291-linux-x64.tar.gz
[root@localhost tomcat]#vim Dockerfile
FROM centos:7
MAINTAINER this is tomcat images <hg>
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-8.5.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]
4.创建
[root@localhost docker-compose_nginx]#docker-compose -f docker-compose.yml up -d
5.查看容器及镜像
[root@localhost docker-compose_nginx]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c89e55c7c012 docker-compose_nginx_tomcat "/usr/local/tomcat/b…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp web2
2efe6549806d docker-compose_nginx_nginx "/usr/local/nginx/sb…" About a minute ago Up About a minute 0.0.0.0:1234->80/tcp, :::1234->80/tcp, 0.0.0.0:4321->443/tcp, :::4321->443/tcp web1
[root@localhost docker-compose_nginx]#docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------------
web1 /usr/local/nginx/sbin/ngin ... Up 0.0.0.0:4321->443/tcp,:::4321->443/tcp,
0.0.0.0:1234->80/tcp,:::1234->80/tcp
web2 /usr/local/tomcat/bin/cata ... Up 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
[root@localhost docker-compose_nginx]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-compose_nginx_tomcat latest 30212342cf39 2 minutes ago 950MB
docker-compose_nginx_nginx latest 9ac7efd323ca 2 minutes ago 569MB
php lnmp 3f352863e19b 23 hours ago 1.4GB
mysql lnmp d446e4998a17 25 hours ago 10.1GB
nginx lnmp 97a40e10689a 27 hours ago 569MB
nginx latest 7383c266ef25 6 days ago 188MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
6.查看地址
[root@localhost docker-compose_nginx]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c89e55c7c012 docker-compose_nginx_tomcat "/usr/local/tomcat/b…" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp web2
2efe6549806d docker-compose_nginx_nginx "/usr/local/nginx/sb…" 4 minutes ago Up 4 minutes 0.0.0.0:1234->80/tcp, :::1234->80/tcp, 0.0.0.0:4321->443/tcp, :::4321->443/tcp web1
[root@localhost docker-compose_nginx]#docker inspect c89e55c7c012 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.19.0.2",
7.删除容器、网络、数据卷和镜像
[root@localhost docker-compose_nginx]#docker-compose -f docker-compose.yml down
Stopping web2 ... done
Stopping web1 ... done
Removing web2 ... done
Removing web1 ... done
Removing network docker-compose_nginx_lnmp
[root@localhost docker-compose_nginx]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost docker-compose_nginx]#docker network list
NETWORK ID NAME DRIVER SCOPE
213c0b6bc77b bridge bridge local
74a43c49b8c6 host host local
adf31dc63e2f mynetwork bridge local
71f04f9ad5e1 none null local
[root@localhost docker-compose_nginx]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-compose_nginx_tomcat latest 30212342cf39 8 minutes ago 950MB
docker-compose_nginx_nginx latest 9ac7efd323ca 8 minutes ago 569MB
php lnmp 3f352863e19b 24 hours ago 1.4GB
mysql lnmp d446e4998a17 25 hours ago 10.1GB
nginx lnmp 97a40e10689a 27 hours ago 569MB
nginx latest 7383c266ef25 6 days ago 188MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
[root@localhost docker-compose_nginx]#
总结:
一、什么是Docker-compose
docker-cpmpose是实现在单机上完成容器集群编排的管理 单机容器编排
docker-compose。yml compose模板文件
工程(项目) project LNMP
服务 nginx mysql php
容器 container 容器名 --name 主机名 -h 镜像 image:tag 端口 -p 网络 --network 数据卷 -v .......
使用 docker-compose 可以完成 多个 docker run 的所有操作
二、使用Docker-compose注意事项:
大小写敏感
通过缩进表示层级关系
不支持制表符 tab 键缩进,只能使用空格缩进
缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
用 # 号注释
符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思
三、Docker-compose 配置的字段
字段 描述
build 指定 Dockerfile 文件名,
要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile 构建镜像上下文路径
context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image 指定镜像
command: 执行命令,覆盖容器启动后默认执行的命令
container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment 添加环境变量
networks 加入网络,引用顶级networks下条目
network_mode 设置容器的网络模式,如 host,bridge,...
ports 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname 容器主机名
sysctls 在容器内设置内核参数
links 连接到另外一个容器,- 服务名称[:服务别名]
privileged 用来给容器root权限,注意是不安全的,true | false
restart 设置重启策略,no,always,nounless-st-failure,oped
no,默认策略,在容器退出时不重启容器。
on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
on-failure:3,在容器非正常退出时重启容器,最多重启3次。
always,在容器退出时总是重启容器。
unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
四、docker-compose 基本命令
字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务
五、案例执行操作
1、nginx
2、nginx+tomcat
等等