docker(十四)docker-compose(三)docker-compose基本语法与实例

85 阅读6分钟

前边我们学习了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
      # 绑定目录
      - typebind
        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       # 后台运行

 

有好的建议,请在下方输入你的评论。