【云原生 | 09】Docker之多容器管理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker 三剑客:docker-compose 容器编排工具;docker-swarm 可以将容器通过多物理机的方案组建成集群;全覆盖网络:不同物理机之间的容器可以通过网络直接联通。docker-machine 将容器伪装成虚拟机给用户提供访问.........

🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅

✒️个人主页:小鹏linux

💊个人社区:小鹏linux(个人社区)欢迎您的加入!

目录

1. Yaml 语法

1.1 基本语

1.2 数据类型

1.3 YAML 对象

1.4 YAML 数组

2. Docker-compose 用法

2.1用法及示例

3. Docker-compose 基本语法

4. Docker-compose案例

 👑👑👑结束语👑👑👑


数据流处理三剑客:

                                sed

                                awk

                                grep

Docker 三剑客:

                                docker-compose 容器编排工具

                                docker-swarm 可以将容器通过多物理机的方案组建成集群

                                                        全覆盖网络:不同物理机之间的容器可以通过网络直接联通。

                                                        扁平化网络

                                docker-machine 将容器伪装成虚拟机给用户提供访问

1. Yaml 语法

编程免不了要写配置文件,怎么写配置也是一门学问。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。

YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。

1.1 基本语

基本语法规则

        - 大小写敏感

        - 使用缩进表示层级关系

        - 缩进是不使用 tab 键,只允许使用空格

        - 缩进的空格数目不重要,只要相同层级左侧的元素对其即可

        - " # " 表示注释,从这个字符一直到行尾都会被解释器忽略

1.2 数据类型

YAML 支持以下几种数据类型:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

1.3 YAML 对象

对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。

也可以使用 key:{key1: value1, key2: value2, ...}

还可以使用缩进表示层级关系;

key: 
    child-key: value
    child-key2: value2

image.gif

较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:
?  
    - complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

image.gif

意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]

1.4 YAML 数组

以 - 开头的行表示构成一个数组:
- A
- B
- C

image.gif

YAML 支持多维数组,可以使用行内表示:
key: [value1, value2, ...]

image.gif

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
-
 - A
 - B
 - C

image.gif

一个相对复杂的例子:
companies:
    -
        id: 1
        name: company1
        price: 200W
    -
        id: 2
        name: company2
        price: 500W

image.gif

意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。

数组也可以使用流式(flow)的方式表示:

companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]

image.gif

2. Docker-compose 用法

容器编排工具,允许用户在一个模板( YAML 格式 )中定义一组相关联的容器,会根据 --link 等参数,对启动的优先级进行排序

[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose         #docker-compose下载
[root@localhost ~]# cd /usr/local/bin/
[root@localhost bin]# chmod a+x docker-compose          #添加权限
[root@localhost bin]# docker-compose version        #查看版本
[root@localhost bin]# mkdir /usr/local/wordpress    #创建项目目录
[root@localhost bin]# cd /usr/local/wordpress/
[root@localhost wordpress]# vim docker-compose.yaml   #创建项目文件,添加如下内容:
version: '2'
services:
   db:
     image: mariadb:latest
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     restart: always
     ports:
       - "8000:80"
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
[root@localhost wordpress]# docker-compose up -d    #启动docker-compose
[root@localhost wordpress]# docker ps -a          #查看创建并启动的项目

image.gif

浏览器也可以访问192.168.232.165:8000

2.1用法及示例

docker-compose version             #查看版本信息

                                                    #-f      指定使用的 yaml 文件位置

#docker-compose  -f                   #路径 其他命令(如ps,up -d,start等)

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml start

image.gif

up -d              # 启动容器项目(新的项目)

ps                  # 显示所有容器信息

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml ps

image.gif

pause             # 暂停容器                

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml pause

image.gif

restart            # 重新启动容器           

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml restart

image.gif

unpause        #恢复暂停          

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml uppause

image.gif

logs               # 查看日志信息 (将当前项目中所有容器的日志合并展示)           

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml logs

image.gif

rm                # 删除容器          

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml rm -s

image.gif

config -q      #验证 yaml 配置文件是否正确(只能检测语法结构,不能检测内容是否正确)            

[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml config -q

image.gif

stop         #停止容器

start         #启动容

3. Docker-compose 基本语法

image镜像

services:
  web:
image: hello-world                                # 镜像可用格式
image: redis                        #镜像名
image: ubuntu:14.04                     #镜像名:版本
image: tutum/influxdb                 #个人用户名/镜像名
image: example-registry.com:4000/postgresql     #私人仓库/镜像名
image: a4bc65fd                       #id号

image.gif

build做镜像

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器

build: /path/to/build/dir

也可以是相对路径,只要上下文确定就可以读取到 Dockerfile            

build: ./dir
build:
  context: ../
  dockerfile: path/of/Dockerfile
   args:          #在做出来的镜像中注入以下两个环境变量
    buildno: 1
    password: secret      
image: webapp:tag     #做出镜像名为webapp:tag。没有image时做出的镜像没有镜像名,只有id号

image.gif

command

# == 
command: [bundle, exec, thin, -p, 3000]   #选项和命令通过逗号隔开

image.gif

container_name:<项目名称><服务名称><序号>

container_name: app

image.gif

depends_on定义依赖关联

version: '2'      #定义版本号为2版
services:         #定义一组项目
  web:              #服务名web
    build: .        #在当前目录下找Dockerfile文件做成镜像
    depends_on:         #定义依赖,依赖于下方的db和redis
      - db
      - redis
  redis:          #服务名redis
    image: redis
  db:           #服务名db
image: postgres

image.gif

会自动排序,会先启动db,再启动redis,最后启动web。               

dns

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

image.gif

tmpfs临时卷

tmpfs: /run   #当临时空间使用
tmpfs:
  - /run
  - /tmp

image.gif

entrypoint修改启动命令的

entrypoint: /code/entrypoint.sh

image.gif

env_file批量化的向当前容器注入环境变量

env_file: .env
aa=123
name=zhangsan
addr=beijing
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

image.gif

environment:镜像变量

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET: 123

image.gif

expose只是需要暴露的端口

expose:
 - "3000"
 - "8000"

image.gif

external_links:链接外部容器

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

image.gif

extra_hosts添加额外主机

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

image.gif

labels

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""
labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

image.gif

与 Docker client 的 --link 一样效果,会连接到其它服务中的容器

web:
  links:
   - db:database
   - redis

image.gif

logging定义当前日志的获取方式

 默认json-file,可以用docker info命令查看

logging:
  driver: syslog    # 此容器可以把日志推送到syslog服务上
  options:
    syslog-address: "tcp://192.168.0.42:123"    #日志服务的地址

image.gif

pid指定当前项目的id号

pid: "host"

image.gif

port

ports:
 - "3000"   #在当前物理机开启一个随机端口与当前容器内部的3000端口映射
 - "8000:8000"  #将物理机的8000端口与容器内部的8000端口进行映射
 - "49100:22"
 - "127.0.0.1:8001:8001"

image.gif

security_opt

为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER

security_opt:
  - label:user:USER
  - label:role:ROLE

image.gif

stop_signal关闭信号

信号:系统向进程发送的信息

#默认时15级别信号。kill -9级别工作中禁用。(-9级别不向系统发送信号)

volumes

volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

image.gif

volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

image.gif

cap_add, cap_drop

yaml
cap_add:    #加入权限
  - ALL   
cap_drop:   #移除权限
  - NET_ADMIN   #在当前容器内部进行网络管理员操作时会被拒绝
  - SYS_ADMIN   #在当前容器内部进行系统管理员权操作会被拒绝

image.gif

extends添加额外文件

extends:
  file: common.yml
  service: webapp

image.gif

network_mode

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

image.gif

networks

services:
  some-service:
    networks:
     - some-network
     - other-network

image.gif

4. Docker-compose案例

version: '2'                    #定义版本为2版本
services:                       #定义一组服务
   db:                            #容器一为db
     image: mysql:5.7                 #db容器内的镜像为mysql,版本为5.7
     restart: always                #开机自启
     environment:                   #注入环境变量
       MYSQL_ROOT_PASSWORD: somewordpress       #只要定义了MYSQL_ROOT_PASSWORD会自动创建默认密码somewordpress
       MYSQL_DATABASE: wordpress          #只要定义了MYSQL_DATABASE会自动创建wordpress数据库
       MYSQL_USER: wordpress            #只要定义了MYSQL_USER会自动创建用户wordpress
       MYSQL_PASSWORD: wordpress          #只要定义了MYSQL_PASSWORD会自动创建用户密码wordpress
   wordpress:                     #项目二为wordpress
     depends_on:                    #定义关系,要想启动wordpress容器需要先启动db容器
       - db   
     image: wordpress:latest            #定义镜像名和版本号为wordpress:latest
     restart: always                #开机自启
     ports:                         #定义强制暴露端口
       - "8000:80"                    #开启物理虚拟机的8000端口映射到容器内的80端口
     environment:                   #注入环境变量
       WORDPRESS_DB_HOST: db:3306       
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

image.gif

 👑👑👑结束语👑👑👑

image.gif

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1天前
|
存储 运维 Kubernetes
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
|
1天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
2天前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令
10 1
|
7天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
13 0
|
16天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
13 0
|
1月前
|
人工智能 监控 Cloud Native
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
|
2月前
阿里云云原生恭祝大家新年快乐!
阿里云云原生恭祝大家新年快乐!
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云瑶池助力九州通B2B电商平台,完成100%云原生架构升级
九州通数字化转型,通过引入阿里云云原生数据库PolarDB,云原生内存数据库Tair等产品,完美支撑了医药电商平台数据库100%云原生化,实现了统一、高效、标准化和可跟踪的B2B医药平台。
385 4
|
2月前
|
人工智能 监控 Cloud Native
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态

相关产品

  • 容器服务Kubernetes版