一、docker Compose简介
Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/compose 上。
我们知道使用Dockerfile模板文件可以让用户很方便的定义一个单独的应用容器,其实在工作中,经常会碰到需要多个容器相互配合来完成的某项任务情况,例如工作中的web服务容器本身,往往会在后端加上数据库容器,甚至会有负责均衡器,比如LNMP服务。
Compose 就是来做这个事情的,它允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。
- 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,很不方便。
- docker compose是一种编排服务,基于python语言实现,是一个用于在docker上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
- 用户可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建,
- 解决了容器与容器之间如何管理编排的问题。
docker Compose中有两个重要的概念:
- 服务(service):一个应用的容器,实际上可以包括若干运行的相同镜像的容器实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义。
二、docker compose实践
Docker compose方式安装:
方式1:curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #官方推荐,但是慢
chmod +x /usr/local/bin/docker-compose
方式2 :wget http://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64
下载好后放到/usr/local/bin/路径下,改名为docker-compose
赋予执行权限:chmod +x /usr/local/bin/docker-compose
1.创建一个空目录
[root@node2 bin]# mkdir -p ~/compose
[root@node2 bin]# cd ~/compose/
[root@node2 compose]# ls
2.编辑一个.yml文件
- docker-compose.yml属性:
- image: 指定镜像名称或镜像id,如果本地镜像不存在,compose将会尝试拉取这个镜像。
- build:指定dockfile所在文件夹的路径,compose将会利用它自动构建这个镜像,然后使用这个镜像。
- command:覆盖容器启动后默认执行的命令。
- links:链接到其他服务中的容器。
- ports:端口映射
- expose:暴露端口信息
- volumes:卷挂载路径设置
[root@node2 compose]# vim docker-compose.yml
[root@node2 compose]# cat docker-compose.yml
web1:
image: nginx
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx
volumes:
- ./web2:/usr/share/nginx/html
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
expose:
- 80
ports:
- "80:80"
links:
- web1
- web2
镜像的拉取:
[root@node2 compose]# docker pull haproxy
Using default tag: latest
latest: Pulling from library/haproxy
bc51dd8edc1b: Already exists
ec04e5fc10ca: Pull complete
0c1dae5c47d0: Pull complete
Digest: sha256:6f921726b32ac07177885c8ed180d07d0da322aecc11b1ade75c4aa31ee686a8
Status: Downloaded newer image for haproxy:latest
3.在compose目录下建立所需其他目录
[root@node2 compose]# mkdir haproxy web1 web2
[root@node2 compose]# ls
docker-compose.yml haproxy web1 web2
[root@node2 compose]# echo web1 > web1/index.html
[root@node2 compose]# echo web2 > web2/index.html
[root@node2 compose]# cd haproxy/
[root@node2 haproxy]# ls
[root@node2 haproxy]# vim haproxy.cfg
[root@node2 haproxy]# cat haproxy.cfg
global
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
#chroot /var/empty
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind *:80
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin
server n1 web1:80 check inter 1000
server n2 web2:80 check inter 1000
查看一下compose目录下的结构
[root@node2 compose]# tree .
.
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
├── web1
│ └── index.html
└── web2
└── index.html
4.创建并开启服务
查看帮助:
[root@node2 compose]# docker-compose up -d #创建并开启服务
Creating compose_web1_1 ... done
Creating compose_web2_1 ... done
Creating compose_haproxy_1 ... done
[root@node2 compose]# docker-compose logs
Attaching to compose_haproxy_1, compose_web1_1, compose_web2_1
haproxy_1 | [NOTICE] 042/083346 (1) : New worker #1 (6) forked
[root@node2 compose]# docker ps #查看状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bff276502db4 haproxy "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp compose_haproxy_1
9835df7260c8 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp compose_web1_1
3433a0456a05 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp compose_web2_1
5.测试:
6.优化
先把原来的服务停下来:
[root@node2 compose]# docker-compose down
Stopping compose_haproxy_1 ... done
Stopping compose_web1_1 ... done
Stopping compose_web2_1 ... done
Removing compose_haproxy_1 ... done
Removing compose_web1_1 ... done
Removing compose_web2_1 ... done
文件修改
[root@node2 compose]# vim docker-compose.yml
[root@node2 compose]# cat docker-compose.yml
version: '3'
services:
web1:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
networks:
- my_net
web2:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
networks:
- my_net
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
expose:
- 80
ports:
- "80:80"
networks:
- my_net
volumes:
web-data:
networks:
my_net:
再次创建并开启服务:
[root@node2 compose]# docker-compose up -d
Creating network "compose_my_net" with the default driver
Creating volume "compose_web-data" with default driver
Creating compose_haproxy_1 ... done
Creating compose_web1_1 ... done
Creating compose_web2_1 ... done
查看:
[root@node2 compose]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr ... Up 0.0.0.0:80->80/tcp
compose_web1_1 nginx -g daemon off; Up 80/tcp
compose_web2_1 nginx -g daemon off; Up 80/tcp
[root@node2 compose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
90816287c3f2 bridge bridge local
1ace4cfd4af2 compose_my_net bridge local
972e5e6c0508 host host local
8eeae59b9f3d none null local
[root@node2 compose]# docker volume ls
DRIVER VOLUME NAME
local compose_web-data
查看数据卷并修改默认发布页面:
[root@node2 compose]# docker inspect webdata
[
{
"CreatedAt": "2020-02-10T22:04:18+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/webdata/_data",
"Name": "webdata",
"Options": {},
"Scope": "local"
}
]
[root@node2 compose]# cd /var/lib/docker/volumes/compose_web-data/_data
[root@node2 _data]# ls
50x.html index.html
[root@node2 _data]# rm -rf index.html
[root@node2 _data]# vim index.html
[root@node2 _data]# curl localhost
hahaha
[root@node2 _data]# curl localhost
hahaha
[root@node2 _data]# curl localhost
hahaha
附:docker compose常用命令
build | 构建或重新构建服务 |
---|---|
kill | 强制停止服务容器 |
logs | 查看服务的输出 |
port | 打印绑定的公共端口 |
ps | 列出所有容器 |
pull | 拉取服务所需镜像 |
rm | 删除停止的服务器 |
up | 构建并启动容器 |