目录
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 支持以下几种数据类型:
|
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