docker 容灾双活 docker多容器_容器


目录

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


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

?  
    - complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2


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

1.4 YAML 数组

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

- A
- B
- C


YAML 支持多维数组,可以使用行内表示:

key: [value1, value2, ...]


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

-
 - A
 - B
 - C


一个相对复杂的例子:

companies:
    -
        id: 1
        name: company1
        price: 200W
    -
        id: 2
        name: company2
        price: 500W


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

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

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


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			    #查看创建并启动的项目


浏览器也可以访问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


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

ps                  # 显示所有容器信息

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


pause             # 暂停容器                

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


restart            # 重新启动容器           

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


unpause        #恢复暂停          

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


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

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


rm                # 删除容器          

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

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

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

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号

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号

command

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

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

container_name: app

depends_on 定义依赖关联

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

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

dns

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

tmpfs 临时卷

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

entrypoint 修改启动命令的

entrypoint: /code/entrypoint.sh

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

env_file: .env
aa=123
name=zhangsan
addr=beijing

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment:镜像变量

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

expose 只是需要暴露的端口

expose:
 - "3000"
 - "8000"

external_links:链接外部容器

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

extra_hosts 添加额外主机

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

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"

links

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

web:
  links:
   - db:database
   - redis

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

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

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

pid 指定当前项目的id号

pid: "host"

port

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

security_opt

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

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

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

volumes_from

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

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

cap_add, cap_drop

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

extends 添加额外文件

extends:
  file: common.yml
  service: webapp

network_mode

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

 networks

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

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

  👑👑👑结束语👑👑👑