0%

Docker之docker-compose

docker-compose技术,就是通过一个 .yml 配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。

查看docker-compose版本

1
2
3
4
[root@lucky ~]# which docker-compose
/usr/local/bin/docker-compose
[root@lucky ~]# docker-compose -version
docker-compose version 1.25.5, build unknown

2.1:yml文件简介

  • yml文件默认的名字为:docker-compose.yml
  • yml包含三大概念:Services、Networks、Volumes
    一个service代表一个container(这个container可以从docker hub上拉取的image创建也可以用Dockerfile build出来的image创建)
  • service的启动类似docker run,我们可以给其指定network和volume

2.2:docker-compose.yml配置文件实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: "3"
services:
nginx:
container_name: web-nginx
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- ./webserver:/webserver
- ./nginx/nginx.conf:/etc/nginx/nginx.conf


#下面将配置文件做个简单的解释说明
docker-compose的配置文件是一个.yml格式的文件
第一部分
version: "3" #指定语法的版本

第二部分
services: #定义服务
nginx: #服务的名称,-p参数后接服务名称
container_name: web-nginx #容器的名称
image: nginx:latest #镜像
restart: always
ports: #端口映射
- 80:80

第三部分
volumes: #物理机与容器的磁盘映射关系
- ./webserver:/webserver
- ./nginx/nginx.conf:/etc/nginx/nginx.conf

3.1 Docker-Compose的安装

1
2
3
[root@lucky ~]# pip install docker-compose
[root@lucky ~]# docker-compose -v
docker-compose version 1.25.5, build unknown

3.2 Docker-Compose启动容器

docker-compose up需要有docker-compose.yml文件,若为其他 xxx.yml,启动命令则需要改成

1
docker-compose -f xxx.yml up

3.3 Docker-Compose的基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#帮助信息
[root@localhost ~]# docker-compose --help


#用来创建或重新创建服务使用的镜像
[root@localhost ~]# docker-compose build
例如:docker-compose build service_a #创建一个镜像名叫service_a

#用于通过容器发送SIGKILL信号强行停止服务
[root@localhost ~]# docker-compose kill

#显示service的日志信息
[root@localhost ~]# docker-compose logs


#暂停和恢复服务
[root@localhost ~]# docker-compose pause/unpause
docker-compose pause #暂停服务
docker-compose unpause #恢复被暂停的服务

#用于查看服务中的端口与物理机的映射关系
[root@localhost ~]# docker-compose port
例如:docker-compose port nginx_web 80 #查看服务中80端口映射到物理机上的那个端口

#用于显示当前项目下的容器
[root@localhost ~]# dokcer-compose ps
注意,此命令与docker ps不同作用,此命令会显示停止后的容器(状态为Exited),只针对某个项目。

#用于拉取服务依赖的镜像
[root@localhost ~]# docker-compose pull


#用于重启某个服务中的所有容器
[root@localhost ~]# docker-compose restart
例如:docker-compose restart service_name #只有正在运行的服务可以使用重启命令,停止的服务是不可以重启

#删除停止的服务(服务里的容器)
[root@localhost ~]# docker-compose rm
-f #强制删除
-v #删除与容器相关的卷(volumes)


#用于在服务中运行一个一次性的命令
[root@localhost ~]# docker-compose run

这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处
1、run指定的命令会直接覆盖掉service配置中指定的命令
2、run命令启动的容器不会创建在service配置中指定的端口,如果需要指定使用--service-ports指定


#启动/停止运行某个服务的所有容器
[root@localhost ~]# docker-compose start/stop
docker-compose start 启动运行某个服务的所有容器
docker-compose stop 停止运行某个服务的所有容器

#指定某个服务启动的容器个数
[root@localhost ~]# docker-compose scale
[root@localhost ~]# docker-compose scale --help


备注:
docker-compose 运行时是需要指定service名称,可以同时指定多个,也可以不指定。不指定时默认就是对配置文件中所有的service执行命令。
-f #用于指定配置文件
-p #用于指定项目名称

flask demo 代码

1
2
3
4
5
6
7
[root@lucky test_flask]# tree
.
├── app.py
├── docker-compose.yml
└── Dockerfile

0 directories, 3 files

生成镜像并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@lucky test_flask]# docker-compose up -d
Building web
Step 1/6 : FRoM python:3.6
---> 13efce2de907
Step 2/6 : COPY . /app
---> 6956a9d2c2e4
Step 3/6 : WORKDIR /app
---> Running in 5486d4108d76
Removing intermediate container 5486d4108d76
---> bbcda2fa513d
Step 4/6 : RUN pip install flask redis
---> Running in b36e39e7cba5
Collecting flask
Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting redis
Downloading redis-3.5.3-py2.py3-none-any.whl (72 kB)

查看运行的容器

1
2
3
4
5
[root@lucky test_flask]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
test_flask_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
test_flask_web_1 python app.py Up 0.0.0.0:8008->5000/tcp

演示结果

1
2
3
4
5
6
[root@lucky test_flask]# curl 0.0.0.0:8008
Hello Container World! I have been seen b'1' times and my hostname is 48a2e539fe61.
[root@lucky test_flask]# curl 0.0.0.0:8008
Hello Container World! I have been seen b'2' times and my hostname is 48a2e539fe61.
[root@lucky test_flask]# curl 0.0.0.0:8008
Hello Container World! I have been seen b'3' times and my hostname is 48a2e539fe61.