前言:
如果我们的项目是分布式的微服务而且我们还用了docker容器,那么我们每启动一个实例都需要自己去docker bulid run
这样的操作,如果一个服务器要在100台服务器上部署,麻烦就来了。
docker-compose 就帮我解决了这一个问题。
通过编写 Dockerfile文件跟compose文件就可以实现一键部署
参考官方文档:
https://docs.docker.com/compose/install/
注意:使用docker-compose 需要基础的docker 服务 所以一定要先安装docker服务
docker-compose 安装
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
[root@localhost ~]# 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
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 638 100 638 0 0 331 0 0:00:01 0:00:01 --:--:-- 331
100 11.6M 100 11.6M 0 0 264k 0 0:00:45 0:00:45 --:--:-- 534k
#查看安装的版本
[root@localhost home]# docker-compose -version
docker-compose version 1.26.2, build eefe0d31
编排我们的一个服务
这个服务就是官方提供的。
改服务器中使用到了python 跟redis 但是我们不用下载安装到本地机器。docker容器中会安装。
第一步、准备我们的程序
#创建一个目录
[root@localhost home]# mkdir composetest
#创建一个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)
#再创建一个文件
[root@localhost ~]# mkdir requirements.txt
#里边内容是
flask
redis
第二步、编写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"]
第三步 编写我们的compose文件
docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
第四步,编译运行我们的Compose
#这里发现报了一个错,是因为我们没有启动我们的docker服务,启动我们docker服务就可以了
[root@localhost composetest]# docker-compose up
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
#启动我们的docker 服务
[root@localhost composetest]# service docker start
[root@localhost composetest]# docker-compose up
Building web
Step 1/10 : FROM python:3.7-alpine
---> ae3ec9b0407e
Step 2/10 : WORKDIR /code
---> Using cache
---> 70ecbbb37bf5
Step 3/10 : ENV FLASK_APP app.py
---> Using cache
---> 9ef08ea0e2b7
Step 4/10 : ENV FLASK_RUN_HOST 0.0.0.0
---> Using cache
---> 967e0c411602
Step 5/10 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Running in d4b270d752ee
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/13) Installing libgcc (9.3.0-r2)
(2/13) Installing libstdc++ (9.3.0-r2)
(3/13) Installing binutils (2.34-r1)
(4/13) Installing gmp (6.2.0-r0)
(5/13) Installing isl (0.18-r0)
(6/13) Installing libgomp (9.3.0-r2)
...
redis_1 | 1:M 05 Aug 2020 10:53:48.408 * Ready to accept connections
web_1 | * Serving Flask app "app.py"