🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏linux(个人社区)欢迎您的加入!
目录
数据流处理三剑客: 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
👑👑👑结束语👑👑👑