YML配置文件的常用属性

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本实验介绍了Docker Compose中YML配置文件的常用属性

YML配置文件的常用属性

1. 创建资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。

说明:资源创建过程需要3~5分钟视资源不同开通时间有所差异,ACK等资源开通时间较长。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。

实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息

2. YML配置文件简介

在上一个小节中我们学习了Docker compose 的基本用法,相比较使用docker run命令行和参数启动容器,使用yml配置文件大步幅简化命令输入。在本实验中我们再来看一下docker_compose.yml文件的常见配置信息

  1. 环境准备

为了接下来的实验,首先我们安装docker compose插件。在安装成功后使用vi创建docker-compose.yml文件,在docker-compose.yml文件中加入下列内容。注意使用vim编辑器时:

  1. 需要先按i键进入编辑模式。
  2. 编辑完成之后按esc退出编辑模式。
  3. 然后按大写的ZZ保存并退出vim。

配置文件编写完毕后,我们通过docker compose来启动容器。

yum install -y docker-compose-plugin
vi docker-compose.yml
version: "3.9"
services:
    web:
       container_name: web
       image: "httpd:latest"
       ports:
          - "5000:80"
          - "6000:8000"
    db:
       container_name: db
       image: "mysql"
       volumes:
          - "mysql-vol:/var/lib/mysql"
       environment:
          MYSQL_ROOT_PASSWORD: "[MYSQL密码]"
volumes:
    mysql-vol: {}
docker compose up -d

  1. 配置文件基本讲解

在通过docker compose up启动容器之后,我们来看一下docker_comose.yml的配置文件结构。在docker_compose中,一个project可以包含多个配置文件中的内容,如果没有设置所有的资源都会创建在root这个project中,在project中serviecs字段中的每一个key表示一个serviec,每个service下又可以由一个或多个container,在service中的基本配置选项如下表。

container_name

等同于--name

image

容器镜像

volumes

等价于-v,类型为数组

ports

等价于-p,类型为数组

environment

等价于ie,类型为对象

需要注意的是,默认情况下docker compose会为每个project自动创建一个network,接下来创建的所有的容器都会连接到这个network,我们来验证容器的配置。

docker network ls
docker port web
docker inspect -f "{{json .Mounts}}"  db | jq

  1. 容器状态查询

我们还可以通过docker compose命令对容器服务的状态查询。和使用docker原生命令相比,docker compose只会对配置文件中包含的容器生效。并不需要具体指定容器名,降低了操作复杂性。

这里我们演示docker compose ps,docker compose top,docker compose images三个命令

docker compose ps
docker compose top
docker compose images

  1. 容器的删除

当我们需要结束容器的使用,我们可以使用docker compose down来结束和删除配置文件中的容器。

需要注意的时,该命令会停止并且销毁配置文件中描述的容器。同时容器停止后相应的网络等组件都会被销毁,类似于使用docker rm -f加docker network rm

docker compose down

3. YML的常用配置项目

在上一个小节中我们演示了docker  compose的主要配置和常用命令,接下来我们再来看一下docker  compose配置文件中的其他配置项目。yml中的一部分配置选项可以和docker  run中的命令行对应,这些属性主要包括在下表中,在本小节中我们来实验这些属性。

command

容器的启动命令

stdin_open

设置为true等价于-i参数

tty

设置为true等价于-t参数

networ_mode

网络模式

networks

容器连接的网络,类型为数组

  1. 编写配置文件。

在docker compose中默认使用docker-compose.yml配置文件, 如果我们想使用不同名称的配置文件,可以在docker compose后面添加-f参数指定yml文件。我们使用vi创建一个web.yml文件以演示配置选项。

创建之后,我们启动project,在启动时我们可以通过-p参数指定资源所在的Project,以避免资源橙色图,这里我们指定project为web。

vi web.yml
version: "3.9"
services:
    busybox:
        container_name: sh
        image: "busybox:latest"
        tty: true
        stdin_open: true
        networks:
            - "custom"
    python:
        container_name: web
        image: "python"
        network_mode: "host"
        command: "python -m http.server 8000"
networks:
    custom:
        name: "custom"
docker compose -f web.yml -p web up -d

  1. 创建Project并验证

web.yml创建成功后,我们来创建Project,需要注意的是在创建Proejct时,-f[配置文件名]参数需要放在up命令之前。在Proejct 创建之后我们来验证自定网络的创建和容器参数的指定。

docker inspect -f '{"Tty":{{.Config.Tty}},"OpenStdin":{{.Config.OpenStdin}}}' sh | jq
docker inspect -f "{{json .NetworkSettings.Networks}}" sh | jq

  1. 查看配置信息

当Project创建成功后使用docker compose convert命令,可以显示service中某个容器的的配置信息。我们可以看到显示的配置信息中,包括yml中指定的选项,也包括yml中没有指定的默认选项。

docker compose -f web.yml -p web convert busybox
docker compose -f web.yml -p web convert python

4. YML的其他配置项目

在本小节中我们再来看三个并不是和docker run 命令参数有对应关系的docker compose属性值的用法。

deploy.replicas

可以选择Service中容器的部署个数。

depends_on

可以选择Service启动的先后顺序

restart

设置Service的重启策略

  1. 容器个数

首先我们来看deploy.replicas,之前我们提到过在docker   compose中的层次结构为,project->service->container,这里面的service指的是不同的容器配置,而container是指可以为相同的配置建立多个容器实例。配置容器实例个数的属性就是deploy.replicas。我们使用vi创建一个replicas.yml文件以演示配置选项。

在编写配置文件时,我们要注意由于我们需要在相同的配置下创建多个容器,因此我们不能在配置中用container_name属性为容器指定一个固定的名字。因此我们需要删除此字段,由启动自动分配名字。

vi replicas.yml
version: "3.9"
services:
    busybox:
        image: "busybox:latest"
        tty: true
        stdin_open: true
        deploy:
            replicas: 3
docker compose -f replicas.yml -p replicas up -d
docker compose -f replicas.yml -p replicas ps

  1. 启动顺序

在容器启动时,如果不同service在启动时有互相依赖关系,比如redis缓存要先于web服务启动,这种情况下就可以使用depends_on来管理service的启动顺序。我们使用vi创建一个dependson.yml文件以演示启动顺序选项。会发现servie严格按照先后顺序进行了启动

vi dependson.yml
version: "3.9"
services:
    busybox-before:
        image: "busybox"
        tty: true
        stdin_open: true
    busybox-after:
        image: "busybox"
        tty: true
        stdin_open: true
        depends_on:
            - "busybox-before"
            - "busybox"
    busybox:
        image: "busybox"
        tty: true
        stdin_open: true
        depends_on:
            - "busybox-before"
docker compose -f dependson.yml -p dependson up -d

  1. 重启策略

在生产环境中,容器中服务难免会因为各种问题出现异常,错误,从而导致服务进程崩溃。一旦这种情况发生就会导致局部服务不可用,如果是关键服务出现问题,甚至会影响整个应用得稳定性。

因此在生产环境中,我们一般会配置使用restart属性。该属性可以根据值得不同设定容器得自动重启策略。常用得属性值包括:no不自动重启,always总是自动重启,on-failure错误退出时重启。

接下来我们启动一个busybox容器,在容器启动时执行sleep 10。这个命令表示命令行会在10秒后退出,以模拟容器服务出现错误。在project启动后等待超过10秒,然后再查看状态,会发现由于设置了always策略,容器会在退出后重新启动。

vi restart.yml
version: "3.9"
services:
    busybox-auto:
        container_name: busybox-auto
        image: "busybox"
        command: sleep 10
        restart: "always"
docker compose -f restart.yml -p restart up -d
[等待超过10秒]
docker compose -f restart.yml -p restart ps

5. Flask的build联动案例

在实际开发应用得过程中,我们往往不会直接使用原生容器进行部署,而是需要使用开发者自行build的镜像。这种情况下开发者部署应用时,需要先执行docker build构建镜像,然后再执行docker compose up来运行镜像。

除了这种方式之外,我们还可以在YML配置文件中使用build属性值,这种情况下docker compose在创建project之前会先执行docker build生成镜像,然后再创建容器。简化了开发者的部署工作。

本小节中我们就来通过一个Python语言得Flask框架来演示在开发过程中如何联动镜像得打包和部署。

  1. 环境准备

首先我们需要构建三个文件,分别是应用开发的源代码文件main.py制作镜像的打包文件Dockfile,和容器联动得配置文件build.yml。首先我们来构建main.py和Dockfile。

在main.py中我们通过Flask框架实现了一个简单得Http服务器。具体代码原理可以参考源码中得注释,在此不做过多得讲解。

mkdir app
vi app/main.py
# 导入Flask类
from flask import Flask 
# 创建app对象
app = Flask(__name__)
# 将对路径"/"得访问路由到函数index上
@app.route('/')
def index():
    return '网页首页\n'
# 将对路径"/Host"得访问路由到函数index上
@app.route('/host')
def host():
    return '访问Host路径\n'
# 启动app对象中得服务,并指导服务端口为8000
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

接下来我们来编写Dockerfile,这里我们主要做几件事:首先通过pip安装Flask框架,然后将main.py源码文件复制到/app/目录下,接下来设置/app为工作目录,最后使用CMD设置容器得启动命令。

vi app/Dockerfile
FROM python
RUN pip install Flask
ADD main.py /app/main.py
WORKDIR /app/
CMD python main.py

  1. 编写配置文件

源代码文件和打包文件编辑完毕后,我们继续通过vi来编写配置文件build.yml。在配置文件中,我们使用build属性值代替image。如果在执行docker build时使用的是默认的打包配置文件,那么将build的属性值设置为Dockerfile文件所在目录即可。

如果需要指定打包文件名,则需要将build的属性值设置为对象。对象中包含contextdockerfile两个属性值,分别表示配置文件所在路径和配置文件名。

vi build.yml
version: "3.9"
services:
    app:
        build: app/
#       build: 
#           context: app/
#           dockerfile: Dockerfile
        ports: 
            - "8080:8000"
        restart: "always"
  1. 验证部署结果

文件编写完成后我们即可进行编译打包和project部署的联动,proejct部署成功后。我们通过docker compose ps命令进行查看,发现容器使用了自动打包的镜像build-app

最后我们使用curl访问8080端口映射,验证服务部署成功。

docker compose -f build.yml -p build up -d
docker compose -f build.yml -p build ps
curl 127.0.0.1:8080
curl 127.0.0.1:8080/host

实验地址:https://developer.aliyun.com/adc/scenario/97df5c50cb854dc89f5f64c1aa9c2eeb

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12月前
突然yml文件不显示绿叶子问题
记一次解决突然yml文件不显示绿叶子问题,原来好好的,今天打开突然就坏了,奇了怪了。。。
145 0
|
9月前
|
Java 数据库 Spring
properties文件和yaml文件的区别~
properties文件和yaml文件的区别~
Springboot中配置文件application.yaml的位置
Springboot中配置文件application.yaml的位置
|
Java Spring
properties和yaml配置文件
properties和yaml配置文件
116 0
|
Java 测试技术
|
JSON Java 数据格式
【SpringBoot】配置文件的加载与属性值的绑定
【SpringBoot】配置文件的加载与属性值的绑定
【SpringBoot】配置文件的加载与属性值的绑定
|
数据格式
如何优雅的读取yml配置文件?
如何优雅的读取yml配置文件?
195 0