了解yaml和Docker-compose

了解yaml

在平时的开发过程中,我们经常需要写配置,讲道理,写配置也是个麻烦事。yaml 是一种可读性比较强,简洁又强大的格式。

语法规则

  • 可以写注释。#表示注释(这一点无比重要,小声说一句垃圾 json
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用 Tab 键,只允许使用空格。
  • 缩进的空格数目不重要,只要同一个层级的元素左侧对齐即可

推荐看一下阮一峰的教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%YAML 1.2
---
YAML: YAML Ain't Markup Language

What It Is: YAML is a human friendly data serialization
standard for all programming languages.

YAML Resources:
YAML 1.2 (3rd Edition): http://yaml.org/spec/1.2/spec.html
YAML 1.1 (2nd Edition): http://yaml.org/spec/1.1/
YAML 1.0 (1st Edition): http://yaml.org/spec/1.0/
YAML Issues Page: https://github.com/yaml/yaml/issues
YAML Mailing List: yaml-core@lists.sourceforge.net
YAML IRC Channel: "#yaml on irc.freenode.net"
YAML Cookbook (Ruby): http://yaml4r.sourceforge.net/cookbook/ (local)
YAML Reference Parser: http://ben-kiki.org/ypaste/

了解 Docker-composer

了解学习 Docker-composer

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」

我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 模板文件 是使用 Compose 的核心,格式为 YAML 格式
docker-compose.yml 可以读取同目录下的 .env 中的配置

这是一个典型的 dnmp 结构的 docker-compose.yml 文件

nginx+php+mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
version: '3.7'
services:
nginx:
image: nginx:alpine #引用官方镜像
container_name: nginx
ports:
- "${NGINX_HTTP_PORT}:80"
- "${NGINX_HTTPS_PORT}:443"
restart: always
volumes:
- webroot:/var/www/html
- ./nginx/configs/:/etc/nginx/configs/:ro
- ./nginx/sites/:/etc/nginx/sites/:ro
- ./nginx/logs/:/var/log/nginx/:rw
networks:
- webnet
environment:
TZ: ${TZ}
php7:
image: php:7.2-alpine #引用官方镜像
container_name: php7
restart: always
volumes:
- webroot:/var/www/html/:rw
- ./php7/logs:/var/log/php:rw
- ./php7/conf/php.ini:/usr/local/etc/php/php.ini
networks:
- webnet
environment:
TZ: ${TZ}
mysql:
build:
context: ./mysql #在同级目录中的mysql下编写你的Dockerfile
ports:
- "${MYSQL_PORT}:3306"
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PWD}
SET_CONTAINER_TIMEZONE: "TRUE"
CONTAINER_TIMEZONE: ${TZ}
networks:
- webnet
volumes:
- ./mysql/conf/my.cnf:/etc/mysql/my.cnf:ro
- ${DATA_PATH}:/var/lib/mysql/:rw
- ./mysql/logs/:/var/log/mysql/:rw
networks:
webnet:
volumes:
webroot:
driver: local
driver_opts:
type: none
device: ${WEB_ROOT}
o: bind

模板文件中的变量配置到 .env

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# nginx http port
NGINX_HTTP_PORT=80
# nginx https port
NGINX_HTTPS_PORT=443
# mysql port
MYSQL_PORT=3306
# database path
DATA_PATH=./mysql/data/
# mysql root password
MYSQL_ROOT_PWD=root
# web root path
WEB_ROOT=/webroot
# time zone
TZ=Asia/Shanghai
文章不错,你都不请我喝杯茶,就是说你呀!
0%
upyun