咱们后面的文章学习了 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:
Dockerfile
servicesdocker-compose.yml
docker compose up
三个步骤:
docker-compose binary
总结上述官网阐明:
Docker Compose 用于批量容器编排
docker run
Compose 在 Docker 中默认就有吗?
Docker 中默认是没有 Compose 的,Compose 是 Docker 官网的开源我的项目,咱们应用 Compose ,是须要本人另外装置的
Compose 的 yml 文件如何编写?
一起来看看官网文档的 yml 是怎么的构造:
docker-compose.yml
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 装置
Docker Compose install
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
/usr/local/bin/
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 gettingstarted
咱们装置好了 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)
//
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 文件中的含意是:
apk add --no-cache gcc musl-dev linux-headersrequirements.txt
定义 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 测试目录都有些啥了:
开始构建
docker-compose up
#docker-compose up
docker-compose up
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 服务,是在同一个网络下的,所有能够互相通信
进行 compose
咱们能够应用 ctrl + c 进行 compose
docker-compose down
进行 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 网络,自定义网络
参考资料:
docker docs
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是小魔童哪吒,欢送点赞关注珍藏,下次见~