携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏linux(个人社区)欢迎您的加入!
sed
awk
grep
Docker 三剑客:
docker-compose 容器编排工具
docker-swarm 可以将容器通过多物理机的方案组建成集群
全覆盖网络:不同物理机之间的容器可以通过网络直接联通。
扁平化网络
docker-machine 将容器伪装成虚拟机给用户提供访问 |
1. Yaml 语法
|
|---|
| 编程免不了要写配置文件,怎么写配置也是一门学问。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。 |
1.1 基本语
- 大小写敏感
-
-
-
- 缩进的空格数目不重要,只要相同层级左侧的元素对其即可
-
- " # " 表示注释,从这个字符一直到行尾都会被解释器忽略 |
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
![点击并拖拽以移动]()
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 ~]
[root@localhost ~]
[root@localhost bin]
[root@localhost bin]
[root@localhost bin]
[root@localhost bin]
[root@localhost wordpress]
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]
[root@localhost wordpress]
![点击并拖拽以移动]()
|
|---|
| 浏览器也可以访问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
![点击并拖拽以移动]()
[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml pause
![点击并拖拽以移动]()
[root@localhost wordpress]# docker-compose -f /usr/local/wordpress/docker-compose.yaml restart
![点击并拖拽以移动]()
[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
![点击并拖拽以移动]()
[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
![点击并拖拽以移动]()
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
![点击并拖拽以移动]()
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
![点击并拖拽以移动]()
command
command: [bundle, exec, thin, -p, 3000]
![点击并拖拽以移动]()
container_name:<项目名称><服务名称><序号>
container_name: app
![点击并拖拽以移动]()
depends_on ****定义依赖关联
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
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
options:
syslog-address: "tcp://192.168.0.42:123"
![点击并拖拽以移动]()
pid ****指定当前项目的id号
pid: "host"
![点击并拖拽以移动]()
port
ports:
- "3000"
- "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'
services:
db:
image: mysql:5.7
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
![点击并拖拽以移动]()
👑👑👑结束语👑👑👑

![点击并拖拽以移动]()