假如,你有一个java镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。
先简单理解 docker 的使用过程,它分为镜像构建与容器启动。
镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。
容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。
而如果涉及多个容器的运行(如服务编排)就可以通过docker-compose来实现,它可以轻松的将多个容器作为 service 来运行(当然也可仅运行其中的某个),并且提供了 scale (服务扩容) 的功能。
Docker Compose 的 YAML 文件包含 4 个一级 key:
version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。
services 用于定义不同的应用服务,Docker Compose 会将每个服务部署在各自的容器中。
networks 用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。 这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不 同的网络类型。
volumes 用于指引 Docker 来创建新的卷。
version: '3'
services:
mysql:
build:
context: ./mysql
environment:
MYSQL_ROOT_PASSWORD: admin
restart: always
container_name: mysql
volumes:
- /data/edu-bom/mysql/test:/var/lib/mysql
image: mysql/mysql:5.7
ports:
- 3306:3306
networks:
net:
eureka:
build:
context: ./edu-eureka-boot
restart: always
ports:
- 8761:8761
container_name: edu-eureka-boot
hostname: edu-eureka-boot
image: edu/edu-eureka-boot:1.0
depends_on:
- mysql
networks:
net:
networks:
net:
volumes:
vol:
假设你的 docker-compose.yml 文件在项目根目录下,目录结构大概长这样:
your-project/
├── docker-compose.yml
└── mysql/
├── Dockerfile
├── my.cnf # 可选:MySQL 配置文件
└── init.sql # 可选:初始化 SQL 脚本
mysql 服务mysql:
build:
context: ./mysql
./mysql 目录构建一个自定义 MySQL 镜像。./mysql/Dockerfile 文件。image: mysql/mysql:5.7
mysql/mysql:5.7。 environment:
MYSQL_ROOT_PASSWORD: admin
volumes:
- /data/edu-bom/mysql/test:/var/lib/mysql
/data/edu-bom/mysql/test 挂载到容器的 /var/lib/mysql,用于持久化数据库数据。ports:
- 3306:3306
networks:
net:
net 网络,与 eureka 服务互通。eureka 服务eureka:
build:
context: ./edu-eureka-boot
image: edu/edu-eureka-boot:1.0
./edu-eureka-boot 目录构建镜像;edu/edu-eureka-boot:1.0,也是本地镜像,不会拉远程版本。ports:
- 8761:8761
depends_on:
- mysql
eureka 依赖 mysql,Docker Compose 会确保 mysql 先启动。networks 和 volumesnetworks:
net:
net 的用户自定义网络,让服务之间可以通过名称互通。volumes:
vol:
vol,但目前没有被使用到,可以删掉或者后续扩展使用。mysql/mysql:5.7 镜像;./mysql 构建出的自定义镜像,被你自己标记成了 mysql/mysql:5.7;./mysql/Dockerfile 决定)!./edu-eureka-boot 构建出的镜像,标记为 edu/edu-eureka-boot:1.0;如果你想避免误认为用了官方镜像,可以改成这样:
mysql:
build:
context: ./mysql
image: my-local-mysql:5.7
docker-compose up运行编写的命令docker-compose run 命令允许你为你的应用程序运行一次性命令docker-compose stop 运行完成后停止服务docker-compose down --volumes 停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除容器使用过程中所使用的数据卷