假如,你有一个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
和 volumes
networks:
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 还可以删除容器使用过程中所使用的数据卷