🍁博客主页:
👉@不会压弯的小飞侠
✨欢迎关注:
👉点赞
👍收藏
⭐留言
✒
✨系列专栏:
👉Docker学习专栏
✨学习社区:
👉不会压弯的小飞侠
✨知足上进,不负野心。
🔥欢迎大佬指正,一起学习!一起加油!
目录
- 🍁定义服务
- 🍁指定镜像
- 🍁依赖声明
- 🍁文件挂载
- 🍁使用数据卷
- 🍁配置网络
- 🍁端口映射
🍁定义服务
Docker Compose 文件:
version: "3"
services:
redis:
image: redis:3.2
networks:
- backend
volumes:
- ./redis/redis.conf:/etc/redis.conf:ro
ports:
- "6379:6379"
command: ["redis-server", "/etc/redis.conf"]
database:
image: mysql:5.7
networks:
- backend
volumes:
- ./mysql/my.cnf:/etc/mysql/my.cnf:ro
- mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
ports:
- "3306:3306"
webapp:
build: ./webapp
networks:
- frontend
- backend
volumes:
- ./webapp:/webapp
depends_on:
- redis
- database
nginx:
image: nginx:1.12
networks:
- frontend
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./webapp/html:/webapp/html
depends_on:
- webapp
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
volumes:
mysql-data:
在 Docker Compose 的配置文件里,对服务的定义与创建和启动容器中的选项非常相似,Docker Compose 就是从配置文件中读取出这些内容,替我们创建和管理这些容器的。
在使用时,首先要为每个服务定义一个名称,用以区别不同的服务。
🍁指定镜像
容器最基础的就是镜像了,所以每个服务必须指定镜像。在 Docker Compose 里,可以通过两种方式为服务指定所采用的镜像。一种是通过 image 这个配置,给出能在镜像仓库中找到镜像的名称即可。
另外一种指定镜像的方式就是直接采用 Dockerfile 来构建镜像,通过 build 这个配置我们能够定义构建的环境目录,这与 docker build 中的环境目录是同一个含义。
在 docker build 里还能通过选项定义许多内容,这些在 Docker Compose 里依然可以。
## ......
webapp:
build:
context: ./webapp
dockerfile: webapp-dockerfile
args:
- JAVA_VERSION=1.6
## ......
在配置文件里,还能用 Map 的形式来定义 build,在这种格式下,能够指定更多的镜像构建参数,例如 Dockerfile 的文件名,构建参数等等。
对于一些可以不通过重新构建镜像的方式便能修改的内容,还是不建议重新构建镜像,而是使用原有的镜像做简单的修改。
例如上面的配置里,希望修改 Redis 的启动命令,加入配置文件以便对 Redis 服务进行配置,那么可以直接通过 command 配置来修改。而在 MySQL 的定义,通过 environment 配置为 MySQL 设置了初始密码。
由于 Docker Compose 的配置已经固化下来,所以不需要担心忘记之前执行了哪些命令来启动容器,当每次需要开启或关闭环境时,只需要 docker-compose up -d 和 docker-compose down 命令,就能轻松完成操作。
🍁依赖声明
在 Docker Compose 的配置文件里定义服务,在书写上有由上至下的先后关系,但实际在容器启动中,由于各种因素的存在,其顺序还是无法保障的。
所以,如果服务间有非常强的依赖关系,就必须告知 Docker Compose 容器的先后启动顺序。只有当被依赖的容器完全启动后,Docker Compose 才会创建和启动这个容器。
定义依赖的方式很简单,也就是 depends_on 这个配置项,只需要通过它列出这个服务所有依赖的其他服务即可。在 Docker Compose 启动项目的时候,会检查所有依赖,形成正确的启动顺序并按这个顺序来依次启动容器
🍁文件挂载
在 Docker Compose 里定义文件挂载的方式与 Docker Engine 里也并没有太多的区别,使用 volumes 配置可以像 docker CLI 里的 -v 选项一样来指定外部挂载和数据卷挂载。能够直接挂载宿主机文件系统中的目录,也可以通过数据卷的形式挂载内容。
在使用外部文件挂载的时候,可以直接指定相对目录进行挂载,这里的相对目录是指相对于 docker-compose.yml 文件的目录。
由于有相对目录这样的机制,可以将 docker-compose.yml 和所有相关的挂载文件放置到同一个文件夹下,形成一个完整的项目文件夹。
直接将代码挂载到容器里,而不是通过镜像构建的方式打包成镜像。
同时,在开发过程中,对于程序的配置等内容,也建议直接使用文件挂载的形式挂载到容器里,避免经常修改所带来的麻烦。
🍁使用数据卷
如果要在项目中使用数据卷来存放特殊的数据,也可以让 Docker Compose 自动完成对数据卷的创建,而不需要单独进行操作。
如果想把属于 Docker Compose 项目以外的数据卷引入进来直接使用,可以将数据卷定义为外部引入,通过 external 这个配置就能完成这个定义。
## ......
volumes:
mysql-data:
external: true
## ......
🍁配置网络
网络也是容器间互相访问的桥梁,所以网络的配置对于多个容器组成的应用系统来说也是非常重要的。在 Docker Compose 里,可以为整个应用系统设置一个或多个网络。
声明网络的配置同样独立于 services 存在,是位于根配置下的 networks 配置。
除了简单的声明网络名称,让 Docker Compose 自动按默认形式完成网络配置外,我们还可以显式的指定网络的参数。
networks:
frontend:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.1.0/24
## ......
🍁端口映射
在 Docker Compose 的每个服务配置里,看到了 ports 这个配置项,它是用来定义端口映射的。
可以利用它进行宿主机与容器端口的映射,这个配置与 docker CLI 中 -p 选项的使用方法是近似的。
由于 YAML 格式对 xx:yy 这种格式的解析有特殊性,在设置小于 60 的值时,会被当成时间而不是字符串来处理,所以我们最好使用引号将端口映射的定义包裹起来,避免歧义