Docker Compose
简介
- 之前使用docker时,写完一个项目之后需要定义一个docker file,再通过docker build生成一个镜像,并通过docker run执行;都是通过手动操作,用于单个容器,非常麻烦,现在想要的效果是:有100个微服务,存在依赖关系,通过docker 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。
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.
介绍总结:
定义、运行多个容器。
YAML file 配置文件。
single command。 命令有哪些?
- 三步骤:
Using Compose is basically a three-step process:
1.Define your app’s environment with a dockerfile
so it can be reproduced anywhere.
Dockerfile 保证我们的项目在任何地方可以运行。
2.Define the services that make up your app in docker-compose.yml
so they can be run together in an isolated environment.
services 什么是服务。
docker-compose.yml 这个文件怎么写!
3.Run docker-compose up
and Compose starts and runs your entire app.
启动项目
- 作用:批量容器编排
补充理解
Compose 是Docker官方的开源项目。需要安装!
Dockerfile
让程序在任何地方运行。 web服务。 redis、mysql、nginx ... 多个容器。需要run很多次
Compose
则因此而生
# A docker-compose.yml looks like this:(yml文件示例)
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
-.:/code
-logvolume01:/var/log
links:
-redis
redis:
image: redis
volumes:
logvolume01: {}
Compose重要的概念:
1.服务services,说白了就是容器,应用(web、redis、mysql.)这些应用可以使用compose进行编排
2.就生成一个项目project,是一组关联的容器。跑起来 博客。web、mysql。
Compose 和 Swarm区别
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是:
- Docker Compose 是一个在单个服务器或主机上创建多个容器的工具
- Docker Swarm 则可以在多个服务器或主机上创建容器集群服务
因此,对于微服务的部署,显然 Docker Swarm 会更加适合
安装
1,下载
# 不建议
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 这个可能快点!
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2,授权
cd /usr/local/bin
ll
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
# 看到版本号则安装成功
思路
- 1,创建一个应用,例:app.py
- 2,写一个dockerfile,将应用打包成镜像
- 3,写Docker-compose yaml文件(文件定义整个服务,需要的环境 | web、redis)完整的上线服务
- 4,启动 compose 项目(docker-compose up)
流程
1、创建网络
2、执行 Docker-compose yaml
3、启动服务。
Docker-compose yaml
实践步骤
通过Docker Compose上构建一个简单的python web应用程序,该应用程序使用Flask框架并在redis中维护一个计数器,用来记录该web应用被访问的次数。
官方步骤地址:https://docs.docker.com/compose/gettingstarted/
1,准备工作
yum -y install python-pip # pip是python包管理工具
yum -y install epel-release # 报错的话执行
2,为项目创建目录
mkdir composetest
cd composetest
3,在项目目录中创建一个名为app.py的文件,内容如下:
vim 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 容器的主机名。我们使用 Redis 的默认端口6379
4,在项目目录中创建另一个名为requirements.txt的文件,内容如下:
vim requirements.txt
# 写入:
flask
redis
5,在项目目录中,创建名为 Dockerfile的文件:
vim 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 ["python", "app.py"]
# 这告诉 Docker:
# 从 Python 3.7 映像开始构建映像。
# 将工作目录设置为 。/code
# 设置命令使用的环境变量。flask
# 安装 gcc 和其他依赖项
# 复制并安装 Python 依赖项。requirements.txt
# 将元数据添加到映像,以描述容器正在侦听端口 5000
# 将项目中的当前目录复制到映像中的工作目录。..
# 将容器的默认命令设置为 。flask run
6,在项目目录中创建一个名为docker-compose.yml的文件:
vim docker-compose.yml
# 写入:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
# 此撰写文件定义了两个服务:web和redis
7,从项目目录中,通过运行 启动应用程序
docker-compose up
Compose 会拉取 Redis 映像,为代码构建映像,然后启动定义的服务。在这种情况下,代码在生成时静态复制到映像中
8,在浏览器中输入 http://localhost:8000/ 以查看正在运行的应用程序
curl local:8000
# 多次curl或者刷新页面会增加次数
Hello World!I have been seen 2 times.
如果你在 Linux、Docker Desktop for Mac 或 Docker Desktop for Windows 上本机使用 Docker,那么 Web 应用现在应该在 Docker 守护程序主机上的端口 8000 上侦听。
将 Web 浏览器指向 http://localhost:8000 以查找邮件。如果无法解决此问题,您也可以尝试 http://127.0.0.1:8000。Hello World
docker-compose
以前都是单个docker run启动容器
docker-compose 通过docker-compose编写yaml配置文件,可以通过compose一键启动所有服务或停止。
docker小结
1,Docker镜像 run => 容器
2,DockerFile构建镜像(服务打包)
3,Docker-compose启动项目(编排,多个微服务/环境)
4,Docker网络
Compose配置编写规则
yaml规则
可查看官网示例: https://docs.docker.com/compose/compose-file/#specifying-durations
# 三层
# 1
version: '' #版本
# 2
services: #服务
服务1: web
# 服务配置
images
build
network
......
服务2: redis
......
服务3: redis
......
# 3
#其他配置 网络/卷,全局规则
volumes:
networks:
config: