Docker Compose 容器编排基础使用
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。简而言之就是,一个容器的运行可能需要依赖其他容器,例如 一个springboot项目可能要用到 redis mysql 等其他容器。使用Docker Compose对多个容器进行编排,定义
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
简而言之就是,一个容器的运行可能需要依赖其他容器,例如 一个springboot项目可能要用到 redis mysql 等其他容器。使用Docker Compose对多个容器进行编排,定义多个容器之间的依赖关系,顺利运行多个容器。
而 Docker Compose 的用途仅限于对多个容器的编排,无法完成资源分配等其他功能。
Docker Compose 使用的基本步骤
- 使用 Dockerfile 定义应用程序的环境
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序
docker-compose.yml 的配置案例如下:
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
01 Dockerfile 基础使用
什么是 Dockerfile?Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
1.1 使用Dockerfile构建镜像
构建镜像之前为其单独创建一个目录
编辑 Dockerfile 文件
例如构建一个 nginx 镜像的 dockerfile 文件内容如下
FROM centos # 基础镜像
MAINTAINER qh # 镜像维护者
RUN yum install wget -y # 指向命令下载 wget
RUN yum install nginx -y # 指向命令下载 nginx
COPY index.html /usr/share/nginx/html/ # 从上下文目录中复制文件到容器指定路径
EXPOSE 80 # 声明端口
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] # 指定命令行参数
使用 build 命令构建镜像
docker build -t="qh/nginx:v1" .
-t=
用于指定镜像名称和版本 .
指定是当前目录下的dockerfile(也可以指定其他目录)
查看镜像是否构建成功
docker images
启动构建的镜像
docker run -d -p 80 --name html2 qh/nginx:v1
docker ps
curl <host.ip>:<port>
1.2 Dockerfile 指令
FROM 和 MAINTAINER
FROM 和 MAINTAINER 是构建镜像的两个基础指令
FROM 指定基础镜像,必须为第一个命令,指定的基础镜像必须是可以从dockerhub中下载的
MAINTAINER 维护者信息
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
例如:
FROM mysql:5.6
MAINTAINER <name>
其中 tag或digest 是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
RUN
用于执行后面跟着的命令行命令。有以下俩种格式:
# shell 格式:
RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。、
RUN yum install wget -y
# exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
RUN ["./test.php", "dev", "offline"] # 等价于 RUN ./test.php dev offline
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同,RUN是在构建镜像时执行,而CMD是构建容器后调用,也就是在容器启动时才进行调用
CMD指令的主要作用是为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
格式:
CMD command param1 param2 (执行shell内部命令)
CMD ["可执行文件", "参数1", "参数2"] (执行可执行文件,优先)
CMD ["参数1", "参数2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
ENTRYPOINT指令可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
ENTRYPOINT ["可执行文件", "参数1", "参数2"]
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY <源路径1>... <目标路径>
COPY index.html /usr/share/nginx/html/
其中源路径可以是源文件或者源目录,也可以是通配符表达式;目标路径是容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD
ADD 指令和 COPY 的使用格类似,但是 ADD 指令可以在本地文件添加到容器时,将tar类型文件自动解压到目标路径(网络压缩资源不会被解压)。另外,ADD 指令可以访问网络资源,类似wget
ADD <源路径1>... <目标路径>
ADD abc.tar /usr/share/
EXPOSE
指定于外界交互的端口。但是,EXPOSE并不会让容器的端口访问到主机,要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
02 YML 配置文件
YAML 可以理解成一种配置管理语言,YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲。
YAML 的配置文件后缀为 .yml
2.1 YAML 基本语法
- 大小写敏感:区分字母大小写
- 使用缩进表示层级关系:缩进不允许使用tab,只允许空格;缩进的空格数不重要,只要相同层级的元素左对齐即可
- 使用井号表示注释:
#
2.2 YAML 数据类型
YAML 支持对象、数组和纯量三种数据类型
对象
对象是键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
对象键值对使用冒号结构表示 key: value
,冒号后面要加一个空格。
也可以使用 key:{key1: value1, key2: value2, ...}
。
还可以使用缩进表示层级关系;
key:
child-key: value
child-key2: value2
数组
数组是一组按次序排列的值,又称为序列(sequence) / 列表(list)
以 -
开头的行表示构成一个数组,两个对象数组如下所示:
-
A: 1
B: 2
C: 3
-
a: 1
b: 2
c: 3
纯量
纯量是最基本的,不可再分的值,包括:字符串、布尔值、整数、浮点数、空值NULL、时间、日期
使用一个例子来快速了解纯量的基本使用:
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
2.3 YAML 引用
YAML中引用的概念和C++中的引用类似,就是某个对象的一个别名
&
用来建立锚点,<<
表示合并到当前数据,*
用来引用锚点。例如:
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
等价于:
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
03 Docker Compose 简介与安装
3.1 Docker Compose 简介
Docker Compose 作用是定义和运行多个 Docker 容器,同时可以对多个容器进行编排
Compose 的两个核心概念:
- 服务 service : 一个应用的容器。服务往往可以存在多个
- 项目 project : 由一组关联的应用容器组成的一个完整业务单元,在
docker-compose.yml
文件中定义
3.2 Docker Compose 安装
使用二进制包安装 Docker Compose
# 下载二进制包
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
# 测试是否安装成功
docker-compose --version
Docker Compose 使用Python编写的,所以除了使用二进制包安装,也可以通过 pip 命令安装
# 安装下载 pip
apt install python3-pip -y
pip3 install pip -U
# 更新库
apt-get update
# 升级 pip
pip install --upgrade pip
# 安装docker-compose
pip install docker-compose
# 检查是否安装成功
docker-compose -version
04 Docker Compose 使用
4.1 准备测试环境
创建一个测试目录:
mkdir composetest
cd composetest
在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。
在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:
flask
redis
4.2 创建 Dockerfile 文件
在 composetest 目录中,创建一个名为 Dockerfile 的文件,内容如下:
FROM python:3.7-alpine # 从 Python 3.7 映像开始构建镜像
WORKDIR /code # 将工作目录设置为 /code
# 设置 flask 命令使用的环境变量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers # 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速
# 复制 requirements.txt 并安装 Python 依赖项
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . . # 将 . 项目中的当前目录复制到 . 镜像中的工作目录
CMD ["flask", "run"] # 容器提供默认的执行命令为:flask run
4.3 创建 docker-compose.yml
在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
- web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
- redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。
4.4 使用 compose 命令构建并运行应用程序
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
在后台执行该服务可以加上 -d 参数
docker-compose up -d
参考资料
更多推荐
所有评论(0)