文章目录
- Docker-compose
-
- 概念
- Docker-compose部署
- YAML文件格式和编写注意事项
- [Docker compose配置常用字段](#Docker compose配置常用字段)
- [docker compose常用命令](#docker compose常用命令)
- [Docker Compose 文件结构](#Docker Compose 文件结构)
-
- [docker compose部署apache](#docker compose部署apache)
- [docker compose 部署LNMP](#docker compose 部署LNMP)
Docker-compose
概念
-
Docker-Compose项目是基于Python开发的Docker官方开源项目,负责实现对Docker容器集群的快速编排。
-
Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
-
Docker-Compose是一个容器编排工具。
-
通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、容器端口映射等情况写在一个配置文件里,执行docker-compose up命令就像执行脚本一样,一个一个的安装并部署容器。
-
Docker compose 文件通常包含一个或多个服务,每个服务都由一个或多个容器组成。服条定义了容器应该执行的任务,以及容器之间的统赖关系。
-
Docker-Compose将所管理的容器分为三层,分别是 工程(project),服务(service)以及容器(container)。
-
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
-
一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。
-
Docker-compose总结
- 实现单机容器集群编排管理(使用YAML模板文件定义多个应用容器的启动参数和依赖关系,并使用Docker-compose来根据模板文件的配置来启动容器)
-
三大概念(包含关系)
- 项目/工程
- 默认使用目录名做项目名
- 支持 -p 或 --project-name 来指定项目名
- 在项目的目录中会包含一个docker-compose.yml 模板文件此文件为项目的默认配置文件(支持使用 -f 或 COMPOSE_FILE 来指定项目的配置模板文件)
- 在配置文件里面可以定义一个或多个服务,每个服务可以包含容器的名称、镜像、端口映射、依赖关系、环境变量、挂载点等配置参数
- 服务
- 容器
- 项目/工程
Docker-compose部署
##Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose
##下载
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
##安装
chmod +x /opt/docker-compose
mv /opt/docker-compose /usr/local/bin/docker-compose
##查看版本
docker-compose --version
##能查看到则,安装成功
YAML文件格式和编写注意事项
注意
YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。
类似于 json 数据描述语言,语法比 json 简单的很多。
YAML 数据结构通过缩进来表示,
连续的项目通过减号来表示,
键值对用冒号分隔,
数组用中括号 [] 括起来,
hash 用花括号 {} 括起来。
使用 YAML 时需要注意下面事项:
大小写敏感
通过缩进表示层级关系
不支持制表符 tab 键缩进,只能使用空格缩进
缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
用 # 号注释
符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
如果包含特殊字符用单引号('')引起来会作为普通字符串处理,
双引号(""): 特殊字符作为本身想表示的意思
数据结构
对象映射
对象映射: 键值对的字典
animal: dogs
序列属组
序列属组: 一组按次序排列的列表
##竖列表
pets:
- Cat
- Dog
- Pig
##横列表
pets: ["cat", "dog", "pig"]
布尔值
##布尔值
debug: true
debug: false
序列的映射
##序列的映射
pets:
- Cat
- Dog
- Pig
映射的映射
##映射的映射
websetting:
cpu: 2
memory: 1024M
swap: 2048M
disk: 60G
JSON格式
JSON
##JSON格式
{
pets: [
"cat",
"dog",
"pig"
],
websetting: {
cpu: ['2'],
memory: ['1024M'],
disk: ['60G']
}
}
文本换行
# 注意"|"与文本之间须另起一行
# 使用|标注的文本内容缩进表示的块,可以保留块中已有的回车换行
value: |
hello
world!
# 输出结果
# hello 换行 world!!
# 注意">"与文本之间的空格
# 使用>标注的文本内容缩进表示的块,将块中回车替换为空格最终连接成一行
value: > hello
world!
# 输出结果
# hello 空格 world!
锚点和引用
# 复制代码注意*引用部分不能追加内容
# 使用&定义数据锚点,即要复制的数据
# 使用*引用锚点数据,即数据的复制目的地
name: &a yaml
book: *a
books:
- java
- *a
- python
# 输出结果
book: yaml
books:[java, yaml, python]
Docker compose配置常用字段
字段 | 描述 |
---|---|
build | 指定 Dockerfile 文件名, 要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定 |
dockerfile | 构建镜像的目录下的文件 |
context | 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址 |
image | 指定镜像 |
command | 执行命令,覆盖容器启动后默认执行的命令 |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量 |
deploy | 指定部署和运行服务相关配置,只能在 Swarm 模式使用 |
environment | 添加环境变量 |
networks | 加入网络,引用顶级networks下条目 |
network_mode | 设置容器的网络模式,如 host,bridge,... |
ports | 暴露容器端口,与 -p 相同,但端口不能低于 60 |
volumes | 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称 |
volumes_from | 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持 |
hostname | 容器主机名 |
sysctls | 在容器内设置内核参数 |
links | 连接到另外一个容器,- 服务名称[:服务别名] |
privileged | 用来给容器root权限,注意是不安全的,true |
restart | 设置重启策略,no,always,no-failure,unless-stopped no,默认策略,在容器退出时不重启容器。 on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3,在容器非正常退出时重启容器,最多重启3次。 always,在容器退出时总是重启容器。 unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。 |
depends_on | 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 php: depends_on: - apache - mysql |
Dockercompose字段 | 相对的docker run命令 |
---|---|
image | 镜像:标签 |
command | 启动命令 |
container_name | --name |
environment | --env |
networks network_mode | --network |
ports | -p |
volumes | -v |
volumes_from | --volumes-from |
hostname | -h |
sysctls | -sysctl |
links | --link |
privileged | --privileged |
restart | --restart |
docker compose常用命令
字段 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 -d 后台启动 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
Docker Compose 文件结构
/opt/compose_nginx/
├── docker-compose.yml #创建模板脚本
├── nginx
│?? ├── Dockerfile #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz #复制源码包
│?? └── run.sh #启动服务脚本
└── wwwroot
└── index.html #站点网页
docker compose部署apache
mkdir -p /usr/local/compose/docker-compose-apache
cd /usr/local/compose/docker-compose-apache
vim docker-compose.yml
yaml
version: '3'
services:
apache:
image: httpd:latest
container_name: httpd-ggl
ports:
- 1314:80
volumes:
- ./html:/usr/local/apache2/htdocs
networks:
lamp:
ipv4_address: 172.20.0.10
networks:
lamp:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
docker compose 部署LNMP
mkdir /usr/local/compose/docker-compose-lnmp/
cd /usr/local/compose/docker-compose-lnmp/
##在目录中准备 Dockerfile 创建LNMP的相关的文件
vim docker-compose.yml
yaml
version: '3'
services:
nginx:
build:
context: ./nginx
dockerfile: Dockerfile
container_name: nginx
ports:
- 80:80
volumes:
- ./nginx/html:/usr/local/nginx/html
networks:
lnmp:
ipv4_address: 172.18.0.10
mysql:
image: mysql:centos7
container_name: mysql
ports:
- 3306:3306
volumes:
- db-data:/usr/local/mysql
networks:
lnmp:
ipv4_address: 172.18.0.20
php:
image: php:centos7
container_name: php
ports:
- 9000:9000
volumes:
- db-data:/usr/local/mysql
- ./nginx/html:/usr/local/nginx/html
networks:
lnmp:
ipv4_address: 172.18.0.30
depends_on:
- nginx
- mysql
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
volumes:
db-data:
##运行docker-compose
##在 docker-compose.yml 的文件的目录中运行
docker-compose up -d
docker-compose ps
##验证数据库是否连接成功
vim /usr/local/compose/docker-compose-lnmp/nginx/html/index.php
<?php
$link=mysqli_connect('192.168.242.66','admin','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
##进入到容器中
docker exec -it mysql bash
##修改mysql 的登录密码
mysqladmin -u root -p password "123"
mysql -uroot -p123
create database word;
#创建一个数据库
grant all ON word.* to 'admin'@'%' identified by 'admin123';
#把数据库里面所有表的权限授予给admin,并设置密码admin123
flush privileges;
#刷新数据库