docker-compose是什么?
假如,你有一个java镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml
文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up
命令就ok了。
先简单理解 docker
的使用过程,它分为镜像构建与容器启动。
镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。
容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。
而如果涉及多个容器的运行(如服务编排)就可以通过docker-compose
来实现,它可以轻松的将多个容器作为 service 来运行(当然也可仅运行其中的某个),并且提供了 scale (服务扩容) 的功能。
yaml 文件级
Docker Compose 的 YAML 文件包含 4 个一级 key:
- version
- services
- networks
- volumes
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
- Docker 会从
./mysql
目录构建一个自定义 MySQL 镜像。 - 构建时会查找
./mysql/Dockerfile
文件。
image: mysql/mysql:5.7
- 构建完成后,这个本地镜像会被打上标签为
mysql/mysql:5.7
。 - 注意:不是拉官方镜像,而是你本地构建的镜像起了个“官方名字”,可能导致误解。
environment:
MYSQL_ROOT_PASSWORD: admin
- 设置 MySQL root 用户密码。
volumes:
- /data/edu-bom/mysql/test:/var/lib/mysql
- 把宿主机的
/data/edu-bom/mysql/test
挂载到容器的/var/lib/mysql
,用于持久化数据库数据。
ports:
- 3306: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
- Eureka 服务暴露端口 8761。
depends_on:
- mysql
- 指定在启动顺序上,
eureka
依赖mysql
,Docker Compose 会确保 mysql 先启动。
networks
和 volumes
networks:
net:
- 定义了一个名为
net
的用户自定义网络,让服务之间可以通过名称互通。
volumes:
vol:
- 虽然声明了
vol
,但目前没有被使用到,可以删掉或者后续扩展使用。
注意点:你这个配置中的镜像版本到底是什么?
mysql 服务
- 不是官方的
mysql/mysql:5.7
镜像; - 而是你从
./mysql
构建出的自定义镜像,被你自己标记成了mysql/mysql:5.7
; - 所以运行时用的是你本地构建的版本(内容由
./mysql/Dockerfile
决定)!
eureka 服务
- 同理,也是你从
./edu-eureka-boot
构建出的镜像,标记为edu/edu-eureka-boot:1.0
; - 并没有从 Docker Hub 拉取任何已有镜像。
推荐改法(避免混淆)
如果你想避免误认为用了官方镜像,可以改成这样:
mysql:
build:
context: ./mysql
image: my-local-mysql:5.7
运行以及常见的docker-compose的命令
docker-compose up
运行编写的命令docker-compose run
命令允许你为你的应用程序运行一次性命令docker-compose stop
运行完成后停止服务docker-compose down --volumes
停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除容器使用过程中所使用的数据卷