docker-compose
1. docker run 启动服务
之前我学习docker启动服务是, 都是docker run 命令一条到底, 单机运行, 如果我一个项目有多个微服务, 那么一个一个docker run 是很费时间的
比如这样一个例子 :
我有一个项目, 他需要依赖于redis环境 以及我们自身的web环境
那么就需要写2条命令, 前提是我们有这两个镜像才能运行
当然webapp的镜像需要我们自己构建, 自己去写Dockerfile(卷挂载已写入其中), 通过docker build 命令来构造
-
- docker run -d -P --name myRedis redis:latest
-
- docker run -d -p 8080:80 --name mywebapp webapp
那么我们使用docker-compose的话, 是如何快速高效的解决这个问题呢?
- docker run -d -p 8080:80 --name mywebapp webapp
2. docker-compose启动服务
先来看看官网对于docker compose的描述 :
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务。
简单来说, 就是使用一个yaml配置文件, 将我们一个项目所需要的依赖全部写入, 这样当微服务很多时就不用我们一个一个的docker run
下面来说说简单的步骤
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere. - Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment. - 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
来定义我们的app所需要的环境, 然后写一个docker-compose.yml
的配置文件, 来定义构成我们的应用程序的服务, 最后就是使用docker compose up
的命令启动即可啦
下面是一个docker-compose.yml配置文件的模样
version: "3.9" # optional since v1.27.0
services: # services服务
web:
build: . # 通过Dockerfile来构建
ports:
- "8000:5000" # 暴露的端口号
volumes:
- .:/code # 将全部文件挂载到/code目录下
- logvolume01:/var/log #
links:
- redis # 依赖的镜像redis
redis:
image: redis
volumes:
logvolume01: {}
3. docker-compose 小demo
在此页面上,您将构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。该应用程序使用 Flask 框架并在 Redis 中维护一个命中计数器。虽然示例使用 Python,但即使您不熟悉此处演示的概念,也应该可以理解。
3. 1 step1 : Setup
- 为项目创建目录
mkdir composetest
cd composetest
2. 在我们的项目目录里面创建一个app.py, 然后把下面的内容粘贴到app.py中, 看不懂python代码没有关系
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)
- 然后再创建一个依赖文件
vim requirements.txt
# 并且写上
flask
redis
3.2 step2 : Create a Dockerfile
在此步骤中,您将编写一个构建 Docker 映像的 Dockerfile。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。
在您的项目目录中,创建一个名为Dockerfile并粘贴以下内容的文件:
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告诉了docker下面的操作 :
- 从 Python 3.7 映像开始构建映像。
- 将工作目录设置为
/code
- 设置flask的环境变量
- 安装我们所需要的一些依赖比如 gcc, musl-dev
- 将我们容器外部写的
requirements.txt
文件搞到容器内部, 然后pip运行安装里面的依赖 - 暴露5000端口
- copy当前目录到容器的工作目录下
- 运行命令 flask run
如果想要了解更多的dockerfile命令请查看这个官网链接
3. 3 step3 : Create a docker-compose 文件
在您的项目目录中创建一个名为的文件docker-compose.yml并粘贴以下内容:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
这个yaml文件定义了两个服务一个是我们的web通过dockerfile来构建, 一个是redis
3.4 step4 启动
最后我们在当前目前运行命令即可
docker-compose up
这样就算运行成功了, 我们访问一下这个地址
nice, 我们就成功的发布一个项目啦, 而且是很快速的发布