YML配置文件的常用属性
1. 创建资源
开始实验之前,您需要先创建实验相关资源。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。
说明:资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。
实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息
2. YML配置文件简介
在上一个小节中我们学习了Docker compose 的基本用法,相比较使用docker run命令行和参数启动容器,使用yml配置文件大步幅简化命令输入。在本实验中我们再来看一下docker_compose.yml文件的常见配置信息
- 环境准备
为了接下来的实验,首先我们安装docker compose插件。在安装成功后使用vi创建docker-compose.yml文件,在docker-compose.yml文件中加入下列内容。注意使用vim编辑器时:
- 需要先按i键进入编辑模式。
- 编辑完成之后按esc退出编辑模式。
- 然后按大写的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
- 配置文件基本讲解
在通过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
- 容器状态查询
我们还可以通过docker compose命令对容器服务的状态查询。和使用docker原生命令相比,docker compose只会对配置文件中包含的容器生效。并不需要具体指定容器名,降低了操作复杂性。
这里我们演示docker compose ps,docker compose top,docker compose images三个命令
docker compose ps docker compose top docker compose images
- 容器的删除
当我们需要结束容器的使用,我们可以使用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 |
容器连接的网络,类型为数组 |
- 编写配置文件。
在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
- 创建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
- 查看配置信息
当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的重启策略 |
- 容器个数
首先我们来看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
- 启动顺序
在容器启动时,如果不同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
- 重启策略
在生产环境中,容器中服务难免会因为各种问题出现异常,错误,从而导致服务进程崩溃。一旦这种情况发生就会导致局部服务不可用,如果是关键服务出现问题,甚至会影响整个应用得稳定性。
因此在生产环境中,我们一般会配置使用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框架来演示在开发过程中如何联动镜像得打包和部署。
- 环境准备
首先我们需要构建三个文件,分别是应用开发的源代码文件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
- 编写配置文件
源代码文件和打包文件编辑完毕后,我们继续通过vi来编写配置文件build.yml。在配置文件中,我们使用build属性值代替image。如果在执行docker build时使用的是默认的打包配置文件,那么将build的属性值设置为Dockerfile文件所在目录即可。
如果需要指定打包文件名,则需要将build的属性值设置为对象。对象中包含context和dockerfile两个属性值,分别表示配置文件所在路径和配置文件名。
vi build.yml
version: "3.9" services: app: build: app/ # build: # context: app/ # dockerfile: Dockerfile ports: - "8080:8000" restart: "always"
- 验证部署结果
文件编写完成后我们即可进行编译打包和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