开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16天,点击查看活动详情
简介
微服务盛行的时代,大多数项目或产品都是通过多个更小的微服务相互协作来组成一个完整可用的项目或应用的。例如:我之前学习Spring Cloud全家桶体系时接触的注册中心、配置中心、网关服务、鉴权服务、应用服务等组合在一起构成了我们的完整应用。在Docker还没出来之前,我们都是通过手工的形式部署和管理的,当需要部署的服务渐渐变多的时候,部署和管理这些服务就会变得非常困难。而Docker Compose的出现完美的帮我们解决了这个问题。Docker Compose采取了声明式的配置文件的形式来描述整个应用,从而一条命令完成部署。甚至配置文件还可以存储在版本控制系统中!
步序
我们按照如下的步序来渐进式学习,这里默认各位小伙伴已经提前安装了Docker了。
- 安装 Docker Compose
- 看懂 Compose 文件
- 部署应用
- 管理应用
1、安装 Docker Compose
安装 Docker Compose有两种方式
方法一:curl方式
这里我们以Linux环境为例安装Docker Compose,首先通过 curl 命令下载文件
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
然后通过如下命令赋予其可执行权限
sudo chmod +x /usr/local/bin/docker-compose
如需卸载,请执行以下命令
sudo rm /usr/local/bin/docker-compose
方法二:pipe方式
sudo pip install -U docker-compose
如需卸载,请执行以下命令
pip uninstall docker-compose
验证安装结果
docker-compose --version
2、看懂 Compose 文件
如果你是一个Java开发工程师,那么我相信你一定对Compose文件感到似曾相识,因为它和我们SpringBoot项目的YAML文件格式简直一模一样,我们看一个简单的 docker-compose.yml 示例:
version: "3.5"
services:
web:
build: .
command: python test.py
port:
- target: 5000
published: 5000
networks:
- counter-net
volumes:
- type: volume
source: test-vol
target: /code
redis:
image: "redis:alpine"
networks:
test-net:
networks:
test-net:
volumes:
test-vol:
可能大家看到这个文件,能猜到一些意思,这里面主要有4个一级key:version、services、networks、volumes。都分别代表着特殊的含义:
- version:必须指定项,且必须位于首行。它定义了整个文件的格式。建议保持最新版本。
- services:用于定义不同的服务,如上我们定义了两个服务分别是web和redis。Docker Compose会将他们分别部署在各自的容器内。
- networks:用来创建一个网络,如果不写的话,Docker Compose会默认创建bridge网络,但这是单机网络,只能实现同一主机上容器的连接。
- volumes:用于创建新的卷。主要是实现数据持久化的。
通过上面的文件,我们知道了 Compose文件使用的是V3.5版本的格式。定义了两个服务web和redis
web服务配置解读
web服务中包含如下指令:
- build:”.“ 表示基于当前目录下Dockerfile中定义的指令来构建一个新镜像。
- command:python test.py是指定在Docker容器中执行test.py的Python脚本。所以镜像中得存在test.py文件和Python
- ports:用于指定端口映射得,将容器内(target这一行)5000端口映射到主机的(published这一行)5000端口。这样访问主机5000端口的流量都会被转到容器内的5000端口。
- networks:告知Docker将服务连接到指定的网络,这个网络要么是存在的,要么是networks中一级key指定的网络。
- volumes:用于指定Docker将test-vol卷挂载到容器内的/code。test-vol卷不存在的话,会用volumes下面一级key定义的。
redis服务配置解读
redis服务定义比较简单
- image:用于告诉Docker基于”redis:alpine“镜像启动一个名为redis的容器。Docker会自动从Docker Hub上拉取这个镜像
- networks:告知Docker将redis容器连接到 counter-net网络。
3、部署应用
将以下四个文件拷贝到Linux主机上的某个目录下:
- test.py:一个python应用
- docker-compose.yml:Compose文件,定义了如何部署应用
- Dockerfile:描述了如何构建web服务所使用的镜像
- requirements.txt:列出应用依赖的python包
docker-compose.yml文件大家可以用上面的,这里贴出test.py、requirements.txt、Dockerfile文件配置
test.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 "Hi! You've visited me {} times.\n".format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
requirements.txt 内容如下
flask
redis
Dockerfile 内容如下
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "test.py"]
注意:在执行以下命令之前先使用python -V验证一下Linux操作系统的python版本号,如果是2.7.5版本,则需要升级至3+以上,如何升级网上有很多教程,这里就不写了大伙可以自行百度:
docker compose up & #使用&是将终端窗口返回
如果你们的Compose文件名不是默认的docker-compose.yml的话,则需要指定文件名,可以使用如下命令:
docker compose -f xxxx.yml up -d & 这里的xxx代表你的文件名,-d表示后台启动
可以看到如下的自动部署过程:
执行完毕后,可以访问页面 http://192.168.188.23:5000/ 就可以看到如下页面了。
4、管理应用
启动应用
输入以下命令即可快速启动Compose文件中所有服务。
启动:docker compose up
重启:docker compose restart
停止应用
输入以下命令会停止并删除运行中的Compose应用,会删除容器和网络但不会删除卷和镜像资源。
docker compose down
删除应用
对于已经停止的Compose应用,可以使用如下命令来删除。
docker compose down
查看应用
可以使用如下命令查看应用状态
docker compose ps
修改代码
通常我们部署的应用都会映射在宿主机的某个地方,那么如何定位我们的应用放在哪呢?我们可以按照如下步骤来查找
由于我们的Compose文件中添加了卷映射,所以我们可以用如下命令查看当前有哪些卷
docker volume ls
然后输入如下命令查询该卷的映射位置
docker volume inspect test_counter-vol | grep Mount
进入到该目录下,就可以发现我们应用文件都在这了
cd /var/lib/docker/volumes/test_counter-vol/_data/
这个时候我们可以利用vim编辑一下我们的python文件,修改一下显示的内容,然后保存退出编辑,再刷新页面就能立马看到变化了!
END~
到此结束,码字不易,希望小伙伴们能给我一个免费的赞!