Dockerfile用于构建自定义镜像,Docker Compose用于容器管理。
一、Compose简介
1、Compose的作用
编写docker-compose.yml文件,将docker run命令的各项参数写到该文件中,方便运行,并且,还可以批量管理容器。
2、安装Compose
对于Windows用户和MacOS用户,安装Docker Desktop后,就已经自带Docker Compose,不用额外安装。
对于Linux用户,安装Compose,请参考Compose官方说明:https://github.com/docker/compose。
3、验证安装
打开命令提示符(或终端),输入docker-compose命令,如下所示,表示已安装Compose。
4、官方文档
官方指南https://docs.docker.com/compose/compose-file/。
二、Compose用法
以Nginx为例,介绍Compose用法。
1、命令回顾
回顾下,基础篇中Nginx容器相关命令:
# 创建并运行容器
docker run -d -p 8888:80 ^
-v D:/tmp/nginx/config:/etc/nginx ^
-v D:/tmp/nginx/logs:/var/log/nginx ^
-v D:/tmp/nginx/html:/usr/share/nginx/html ^
--name nginx nginx:latest
# 启动容器
docker start nginx
# 重启容器
docker restart nginx
# 停止容器
docker stop nginx
# 删除容器
docker rm nginx
创建容器前,还需要拉取Nginx镜像:
docker pull nginx
2、编写docker-compose.yml
在空白文件夹下,如D:/tmp/nginx/,之前使用的数据卷就在这个目录,创建一个文件,命名为docker-compose.yml,将docker run的各项内容填充其中:
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- 8888:80
volumes:
- D:/tmp/nginx/config:/etc/nginx
- D:/tmp/nginx/logs:/var/log/nginx
- D:/tmp/nginx/html:/usr/share/nginx/html
说明:
- 第一行,services:固定写法,表示docker-compose.yml下的服务集合
- 第二行,nginx:服务名,表示其下定义的是nginx服务
- 第三行开始:
- image:指定基础镜像
- container_name:指定容器名称
- restart:指定服务重启规则,always表示该服务随Docker一起启动
- ports:指定映射端口
- volumes:指定数据卷
3、启动容器
在docker-compose.yml同级目录下,执行启动命令:
docker-compose up -d
以上提示,表示Nginx容器创建好了,访问http://localhost:8888/:
非常舒适,不用输入docker run中冗长的参数,避免了人为失误,增强了命令的可维护性。
4、查看容器
docker-compose ps
5、删除容器
docker-compose down
运行中的容器,不需要先停止再删除,直接一步到位,Compose的便捷性就体现出来了。
三、补充
1、关于version
在docker-compose.yml中,没有version: "3.8"。
这个跟安装的Docker Engine版本有关,输入docker version可查阅。反正,现在的版本不用写,具体可参阅https://docs.docker.com/compose/compose-file/compose-versioning/。
2、关于restart
总共有4种,always是其中一种:
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
参阅https://docs.docker.com/compose/compose-file/#restart。
3、数据卷路径
数据卷还可以使用相对路径,上述Nginx的配置,还可以修改为:
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- 8888:80
volumes:
- ./config:/etc/nginx
- ./logs:/var/log/nginx
- ./html:/usr/share/nginx/html
4、关于MySQL
与Nginx相比,MySQL在docker run命令中指定了ROOT账号的密码,可以这样处理,完整写法如下:
services:
mysql:
image: mysql:latest
container_name: mysql
restart: always
ports:
- 3366:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./conf:/etc/mysql
- ./logs:/var/log/mysql
- ./data:/var/lib/mysql