赞
踩
我们前面的文章学习了 docker ,为什么还要 Compose 呢?Compose到底是个啥玩意?
Docker Compose 可以来轻松的高效的管理容器,定义运行多个容器
咱们一起来看看官方的介绍 docs
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 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.
三个步骤:
docker-compose binary
启动项目总结上述官方说明:
Docker Compose 用于批量容器编排
如果一个项目中的多个微服务(几十个或者几百个),我们都一个一个的使用docker run
是不是很傻?而且对于运维来说也是一个非常不友好的事情,优化这样的问题,我们有了 Docker Compose
Docker 中默认是没有 Compose 的,Compose 是 Docker 官方的开源项目,我们使用 Compose ,是需要自己另外安装的
一起来看看官方文档的 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: {}
指定服务
指定挂载卷
通过官方文档的上述说明,我们可以知道 Compose 有这么 2 个重要的概念:
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
咱们安装好了 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
# 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 文件中的含义是:
apk add --no-cache gcc musl-dev linux-headers
指令requirements.txt
到容器中docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
这个 compose 文件定义了 2 个服务
运行指令前,我们来查看一下我们的 compose 测试目录都有些啥了:
开始构建
docker-compose up
#docker-compose up
可以看到执行指令 docker-compose up
之后, Compose 也是在一层一层的执行,并且我们可以看到 compose 是最先建立了一个自定义网络
Creating network "composetest_default" with the default driver
看到这里,我们发现 Compose 会自动帮我们创建 redis 容器和 web 容器
Creating composetest_web_1 ... done
Creating composetest_redis_1 ... done
最后,我们看到 Compose 帮我们将 redis 和 web 启动起来了,程序正常运行,
咱们在宿主机使用 curl 命令,来请求一下这个 web 服务
curl localhost:5000
果然 ok,官方的 compose 体验 no problem ,nice
查看一下镜像
使用 docker images 查看一下镜像,发现多了 composetest_web,python,redis alpine 版本 ,这些也都是 compose 自动为我们做的,非常方便
查看一下网络
docker network ls
compose 构建的时候,一开始就会为我们创建一个网络
细心的朋友发现了,我们的容器名字为什么是 composetest_web_1 , 和 composetest_redis_1
这个是 Docker Compose 里面的一种规则,便于标识对应的副本
例如,compose 里面对于容器会是这样的命名:
文件名_服务名_num
多个服务器集群的时候,这个 num 的作用就体现出来的,num 标识第几个副本
多个容器只要是在一个局域网内,就可以互相 ping 通,相互通信,通过域名访问
例如 mysql 集群里面的服务,我们就可以访问 mysql:3306 , compose 就会给我们访问到 mysql:3306 这个服务
我们可以查看上面的 docker compose 给我们新建的自定义网络
docker network ls
# 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 服务,是在同一个网络下的,所有可以相互通信
咱们可以使用 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
参考资料:
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。