前边我们学习了docker-compose的基本使用。这里我们再来了解一下docker-compose得基本语法。
一:基本语法
docker-compose.yml文件有以下6个顶级元素:
**1. ** version (可选)
a) 描述:指定 Compose 文件的版本。这有助于确保 Compose 工具与您的文件格式兼容。
b) 用途:当工具或库进行更新时,版本号可以帮助确保您的 Compose 文件与新版本的工具或库兼容。
**2. ** services (必需)
a) 描述:定义应用程序的各个服务。每个服务是一个独立的 Docker 容器,包含运行应用程序所需的配置信息。
b) 用途:在 Compose 文件中,您可以为应用程序的不同部分定义多个服务。例如,一个 Web 服务器和一个数据库可以作为两个不同的服务来管理。
**3. ** networks (可选)
a) 描述:定义自定义网络,以便容器可以相互通信。
b) 用途:默认情况下,Compose 会为您的应用创建一个网络,但您也可以定义自己的网络,以便容器可以与外部世界或其他容器通信。
**4. ** volumes (可选)
a) 描述:定义数据卷,以便持久化存储数据或共享数据。
b) 用途:数据卷允许您在容器之间共享和持久化数据。这对于确保数据的一致性和持久性非常有用。
**5. ** configs (可选)
a) 描述:定义配置,这些配置可以在服务中使用,但不应该直接在 Compose 文件中硬编码。
b) 用途:这是一个相对较新的功能,允许您将敏感信息(如密码、API 密钥等)从 Compose 文件中移出,以增加安全性。这些配置可以在运行时注入到服务中。
**6. ** secrets (可选)
a) 描述:类似于 Configs,Secrets 也用于定义敏感信息,但它们是专为敏感数据设计的,并具有特定的管理功能。
b) 用途:Secrets 是专为存储敏感信息而设计的,例如密码、API 密钥等。它们可以与 Configs 结合使用,以提供更完整和安全的解决方案来管理敏感数据。
1:version
version 指定Docker Compose文件的版本。目前最新的版本是3。
2:Services
services 定义各个服务。每个服务都有一个唯一的名称,并且需要指定使用的镜像、端口映射、环境变量等信息。并包含以下属性
(1):image
指定服务所使用的Docker镜像。也可以是自定义镜像
image: redis
image: redis:5
(2):build
指定Dockerfile的路径,用于构建自定义镜像。
这里建议直接写Dockerfile,把你想做的操作都写到Dockerfile中,尽量不要在docker-compose中写复杂的操作。如果这样的话,那么build常用的参数就两个:
1)指定构建上下文(context):
构建上下文是一个目录,包含了用于构建镜像的所有文件。当使用 build 选项时,Docker 会将该目录下的所有文件和子目录复制到 Docker 守护进程中,并在那里构建镜像。
services:
myservice:
build:
context: .
在上面的例子中,当前目录(.)被用作构建上下文。这意味着 Docker 将复制当前目录下的所有文件和子目录到 Docker 守护进程中,并在那里构建镜像。
2)指定 Dockerfile:
dockerfile 参数用于指定 Dockerfile 的位置。Dockerfile 是一个文本文件,其中包含了一系列指令,用于定义如何构建 Docker 镜像。
services:
myservice:
build:
dockerfile: ./path/to/Dockerfile
(3):ports
这里一般使用列表来写:
ports:
- "7010:7001"
- "7011:7111"
(4)networks
定义服务容器所连接的网络,关联到顶级networks的配置。
services:
some-service:
networks:
- some-network
- other-network
(5):volumes
指定服务的卷挂载。
卷(volumes)定义了可由服务容器访问的主机路径或命名卷。您可以使用volumes来定义多种类型的挂载,如 volume, bind, tmpfs, 或 npipe。
如果挂载是主机路径并且仅由单个服务使用,则可以在服务定义中声明它。要在多个服务之间重复使用卷,必须在顶级 volumes 键中声明一个命名卷。
以下示例显示了由后端服务使用的命名卷(db-data),以及为单个服务定义的绑定挂载。
services:
backend:
# 指定镜像
image: example/backend
# 挂载数据卷
volumes:
# 绑定数据卷
- type: volume
source: db-data
target: /data
volume:
nocopy: true
# 绑定目录
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
# 指定数据卷,用于多个服务间共享
volumes:
db-data:
(6):environment
指定服务的环境变量。
1)Array 语法:
environment:
- VAR1=value1
- VAR2=value2
(7):deploy
定义服务的部署配置。可以设置副本数、更新策略等
参考 docs.docker.com/compose/com…
(8):command
command 会覆盖容器镜像声明的默认 command ,例如通过Dockerfile的CMD。
基本语法:
command: [ "bundle", "exec", "thin", "-p", "3000" ]
(9):restart
定义服务的重启策略。可以设置为"no"、“always”、“on-failure"或"unless-stopped”。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
3:networks 使用
networks 定义应用程序使用的网络。可以通过网络名称将不同的服务连接在一起。
Docker Compose Networks 可以不预先创建好网络,默认情况下,这个网络的名字是 “<project_name>_default”。如果 Compose 文件位于名为 “my_project” 的目录中,那么默认网络名称将是 “my_project_default”。
示例:
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my-network
db:
image: mysql:latest
ports:
- "3306:3306"
networks:
- my-network
networks:
my-network:
driver: bridge
二:docker-compose实例
这里放一个我自己使用的实例:
1:Dockerfile:
# 项目使用java11
FROM openjdk:11-jre
# 打标签 作者
LABEL authors="camellia"
# 复制 本地jar文件 改名成app.jar
COPY *.jar /app.jar
## 挂载目录
#VOLUME ["/usr/share/nginx/html:/usr/share/nginx/html"]
# 暴露端口
EXPOSE 7001
# 执行命令
ENTRYPOINT ["java","-Xms512M","-Xmx512M","-jar","/app.jar"]
2:Dockerfile.nginx
FROM nginx
# 打标签 作者
LABEL authors="camellia"
# 复制 文件到容器
COPY ./nginx.conf /etc/nginx
COPY ./dist /usr/share/nginx/html
# 暴露端口
EXPOSE 80
# 执行命令
# 启动Nginx,并且Nginx将持续运行
CMD ["nginx", "-g", "daemon off;"]
3:docker-compose.yml
version: '3'
services:
# 服务名称
javaone:
# 构建自定义镜像
build:
# 指定构建上下文
context: .
# 指定构建文件
dockerfile: Dockerfile
# 指定构建容器镜像
image: javaone:latest
# 指定端口
# 7001是服务端口,7010是宿主机端口
ports:
- "7010:7001"
# 服务名称
fontend:
# 构建自定义镜像
build:
# 指定构建上下文
context: .
# 指定构建文件
dockerfile: Dockerfile.nginx
# 指定构建容器镜像
image: fontend:latest
# 指定端口
# 80是服务端口,8801是宿主机端口
ports:
- "8801:80"
进入到docker-compose.yml同级目录,执行命令:
docker-compose up # 前台运行
docker-compose up -d # 后台运行
有好的建议,请在下方输入你的评论。