docker-compose详解
docker-compose详解
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
基本使用步骤
- 使用 Dockerfile 定义应用程序的环境。
 - 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
 - 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
 
docker、docker compose的安装参见百度,Dockerfile的书写见上文。
yml 配置指令参考
version
指定本 yml 依从的 compose 哪个版本制定的。
build
使用Dockerfile构建镜像并运行,指定构建镜像的路径。
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
1  | version: "3.7"  | 
image
指定容器运行的镜像。以下格式都可以:
1  | image: redis  | 
command
覆盖容器启动的默认命令。等价于Dockerfile的
CMD。
1  | command: ["go", "run", "./main.go"]  | 
container_name
指定自定义容器名称,而不是生成的默认名称。
1  | container_name: my-web-container  | 
depends_on
设置依赖关系。
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
 - docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
 - docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
 
1  | version: "3.7"  | 
注意:web 服务不会等待 redis db 完全启动 之后才启动。
volumes
将主机的数据卷或着文件挂载到容器里。等价于Dockerfile的
VOLUME。
1  | version: "3.7"  | 
dns
自定义 DNS 服务器,可以是单个值或列表的多个值。
1  | dns: 8.8.8.8  | 
entrypoint
覆盖容器默认的 entrypoint。
1  | entrypoint: /code/entrypoint.sh  | 
environment
添加环境变量。
1  | environment:  | 
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
1  | expose:  | 
extra_hosts
添加主机名映射。类似 docker client —add-host
1  | extra_hosts:  | 
tmpfs
在容器内安装一个临时文件系统。
1  | tmpfs: /run  | 
networks
配置容器连接的网络,引用顶级 networks 下的条目 。
默认使用
myapp_default网络,每个services下的服务以自己名字命名自己的网络加入其中。
自定义网络
1  | version: "3"  | 
ports
设置容器隐射的端口。等价于 -p 8080:8080
1  | services:  | 
更多信息参考:https://docs.docker.com/compose/gettingstarted/
实例实践
使用docker compose构建一个gin web及其mysql环境。
创建文件夹
设计 gin web
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47package main
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
func main() {
// 引入GORM
dsn := "root:123456@tcp(db:3306)/myDB?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&User{})
// Create
db.Create(&User{UserName: "kid1999", Age: 22})
// gin 逻辑
r := gin.Default()
r.GET("/user/:id", func(c *gin.Context){
id := c.Param("id")
user := User{}
db.First(&user, id)
c.JSON(200, user)
})
r.POST("/user", func(c *gin.Context){
var u User
c.Bind(&u)
db.Create(&u)
c.JSON(200, u)
})
r.Run(":8080")
}
type User struct {
gorm.Model
UserName string
Age int64
}go 依赖初始化
1
go mod init docker-compose
设计web的Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22From golang:latest
# 创建文件夹
RUN mkdir /app
# 当前工作目录
WORKDIR /app
# 将当前文件夹的所有文件复制到容器中
COPY . /app
# 设置go代理
ENV GO111MODULE=on GOPROXY=https://goproxy.io,direct
# 下载go的依赖
RUN go mod tidy
# 暴露端口
EXPOSE 8080
# 运行
CMD go run main.go设计docker compose文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23version: "3"
services:
db:
image: "mysql:5.7"
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "myDB"
networks:
- mynetwork
ports:
- "3306:3306"
web:
build: .
ports:
- "8080:8080"
networks:
- mynetwork
restart: always
networks:
mynetwork:注意此处有一个大坑,
restart: always必须写上,不然会出现mysql创建较慢,导致web连接错误退出的事故!!!
运行docker compose
1
docker-compose up
关闭所有容器
1
docker-compose down





