我们前面的文章学习了 docker ,为什么还要 Compose 呢?Compose到底是个啥玩意?
Docker Compose 可以来轻松的高效的管理容器,定义运行多个容器
咱们一起来看看官方的介绍 docs
Compose 是什么
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
讲了三个点:
- Compose 可以定义和运行多个容器
- 需要使用给到 YAML 配置文件
- 单个命令就可以创建和启动所有的服务
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Docker Compose 可以运行在所有的环境中
Using Compose is basically a three-step process:
1、Define your app’s environment with a Dockerfile
so it can be reproduced anywhere.
2、Define the services
that make up your app in docker-compose.yml
so they can be run together in an isolated environment.
3、Run docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
三个步骤:
- 需要定义好 Dockerfile ,保证它在任何环境都能运行
- 在 docker-compose.yml 文件中定义好 services,那么这个 yml 文件如何写呢?services 咋定义呢
- 使用
docker-compose binary
启动项目
总结上述官方说明:
Docker Compose 用于批量容器编排
如果一个项目中的多个微服务(几十个或者几百个),我们都一个一个的使用docker run
是不是很傻?而且对于运维来说也是一个非常不友好的事情,优化这样的问题,我们有了 Docker Compose
Compose 在 Docker 中默认就有吗?
Docker 中默认是没有 Compose 的,Compose 是 Docker 官方的开源项目,我们使用 Compose ,是需要自己另外安装的
Compose 的 yml 文件如何编写?
一起来看看官方文档的 yml 是怎样的结构:
A docker-compose.yml
looks like this:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
- services
指定服务
- volumes
指定挂载卷
通过官方文档的上述说明,我们可以知道 Compose 有这么 2 个重要的概念:
- services 服务,就是容器和相关的应用
- 项目,就是一组关联的容器
Compose 安装
1、咱们选择在 linux 下面安装 Docker Compose ,运行如下指令进行安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
安装成功后在我们的 linux 目录/usr/local/bin/
会有 docker-compose 程序
2、 给程序 docker-compose 加上可执行的权限
sudo chmod +x /usr/local/bin/docker-compose
3、安装成功,查看 docker-compose 的版本,看到如下信息即为成功
# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
Compose 官方案例体验
咱们安装好了 docker-compose ,我们一起来体验一下官方的 例子,先会使用,再来研究
准备环境和代码
1、创建 compose 测试目录,自己可以在任意目录下执行如下指令
mkdir composetest
cd composetest
2、编写 app.py 文件
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)
该 py 文件的功能就是,注册了一个路由为 /
,我们访问服务器的/
时,程序会去读取 redis 的计数器,来确认这个网站是访问了第几次了
3、创建一个文件 requirements.txt,用于之后的安装
requirements.txt
flask
redis
创建 DockerFile 文件
写 Dockerfile 文件
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
Dockerfile 文件中的含义是:
- 基于 python:3.7-alpine 构建镜像
- 设置工作目录为 /code
- 设置 FLASK_APP 环境变量
- 设置 FLASK_RUN_HOST 环境变量
- 运行
apk add --no-cache gcc musl-dev linux-headers
指令 - 拷贝文件
requirements.txt
到容器中 - 运行 pip 安装 requirements.txt 中的组件
- 暴露 5000 端口
- 拷贝 . 到 .
- 执行 flask run 命令
定义 Compose 文件(yml文件)
docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
这个 compose 文件定义了 2 个服务
- web 服务,暴露的是 5000 端口
- redis
构建和运行我们的 Compose
运行指令前,我们来查看一下我们的 compose 测试目录都有些啥了:
image开始构建
docker-compose up
#docker-compose up
image
可以看到执行指令 docker-compose up
之后, Compose 也是在一层一层的执行,并且我们可以看到 compose 是最先建立了一个自定义网络
Creating network "composetest_default" with the default driver
image
看到这里,我们发现 Compose 会自动帮我们创建 redis 容器和 web 容器
Creating composetest_web_1 ... done
Creating composetest_redis_1 ... done
image
最后,我们看到 Compose 帮我们将 redis 和 web 启动起来了,程序正常运行,
咱们在宿主机使用 curl 命令,来请求一下这个 web 服务
curl localhost:5000
image
果然 ok,官方的 compose 体验 no problem ,nice
查看一下镜像
使用 docker images 查看一下镜像,发现多了 composetest_web,python,redis alpine 版本 ,这些也都是 compose 自动为我们做的,非常方便
查看一下网络
docker network ls
compose 构建的时候,一开始就会为我们创建一个网络
image疑问?
细心的朋友发现了,我们的容器名字为什么是 composetest_web_1 , 和 composetest_redis_1
这个是 Docker Compose 里面的一种规则,便于标识对应的副本
例如,compose 里面对于容器会是这样的命名:
文件名_服务名_num
多个服务器集群的时候,这个 num 的作用就体现出来的,num 标识第几个副本
网络规则
多个容器只要是在一个局域网内,就可以互相 ping 通,相互通信,通过域名访问
例如 mysql 集群里面的服务,我们就可以访问 mysql:3306 , compose 就会给我们访问到 mysql:3306 这个服务
我们可以查看上面的 docker compose 给我们新建的自定义网络
docker network ls
image
# docker network inspect composetest_default
...
"Containers": {
"25b5814cfded10e00d2e59a8e17fcba670232bce135fdabd558b7c0530d011a4": {
"Name": "composetest_web_1",
"EndpointID": "cb131464ea9112403f851b14a37fa5c67b023f2ce28a1e85c409e3f284f78db4",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"e7fedce77d3759fefde5bef84c759a5c59e033a6f48850e5930825bfc8a8444c": {
"Name": "composetest_redis_1",
"EndpointID": "3af891f7d52cba7ec75eb01533af1d5dae4dcd0d8bf4c55e6b342075f971be22",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
...
发现上面的例子, web 服务和 redis 服务,是在同一个网络下的,所有可以相互通信
停止 compose
咱们可以使用 ctrl + c 停止 compose
也可以通过 docker-compose down
停止 compose
停止 compose ,那么 compose 里面涉及的服务,全部都会停止掉
# docker-compose down
Stopping composetest_web_1 ... done
Stopping composetest_redis_1 ... done
Removing composetest_web_1 ... done
Removing composetest_redis_1 ... done
Removing network composetest_default
- 停止 composetest_web_1
- 停止 composetest_redis_1
- 删除 composetest_web_1
- 删除 composetest_redis_1
- 移除自定义网络 composetest_default
小结
- 咱们使用 docker 镜像,通过 docker run 命令可以创建并启动容器
- DockerFile 可以构建镜像,也就是将服务打包
- docker-compose 可以启动项目,进行多个微服务的编排和在环境里面一键部署
- Docker 网络,自定义网络
参考资料:
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
image好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~
网友评论