docker-compose服务编排使⽤docker-compose部署Redis集
前⾔:
如果我们的项⽬是分布式的微服务⽽且我们还⽤了docker容器,那么我们每启动⼀个实例都需要⾃⼰去docker bulid run
这样的操作,如果⼀个服务器要在100台服务器上部署,⿇烦就来了。
docker-compose 就帮我解决了这⼀个问题。
通过编写 Dockerfile⽂件跟compose⽂件就可以实现⼀键部署
注意:使⽤docker-compose 需要基础的docker 服务所以⼀定要先安装docker服务
docker-compose 安装
sudo curl -L "github/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose [root@localhost ~]# sudo curl -L "github/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bi
n/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')
ptions.ConnectionError as exc:
if retries ==0:
raise exc
retries -=1
time.sleep(0.5)
@ute('/')
def hello():
count = get_hit_count()
return'Hello World! I have been seen {} times.\n'.format(count) #再创建⼀个⽂件
[root@localhost ~]#
#⾥边内容是
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-headersdocker进入容器
RUN pip install -
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
第三步编写我们的compose⽂件
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 /alpine/v3.12/main/x86_64/
fetch /alpine/v3.12/community/x86_64/
(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"
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment. web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on 0.0.0.0:5000/ (Press CTRL+C to quit)
启动该浏览器查看
查看我们的镜像
#这⾥发现了componse给我⽣跟下载的镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
composetest_web    latest              acb922109420        6 minutes ago      196MB
python              3.7-alpine          ae3ec9b0407e        30 hours ago        41.7MB
redis              alpine              c7b388ce3d39        2 weeks ago        32.1MB
#查看正在运⾏的容器
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS              PORTS                    NAMES
dc9992b04caf        composetest_web    "flask run"              8 minutes ago      Up 3 minutes        0.0.0.0:5000->5000/tcp  composetest_web_1
70358a6b7dcf        redis:alpine        "docker-entrypoint.s…"  8 minutes ago      Up 3 minutes        6379/tcp                composetest_redis_1
如果想停⽌compose 使⽤
$ docker-compose down
重新编辑我们的compose⽂件然后重新编译
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
#增加当前⽬录(也可以指定⽬录)挂载⽬录到我们的 web容器中
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
#重新编译执⾏
[root@localhost composetest]# docker-compose up
Starting composetest_redis_1 ... done
Recreating composetest_web_1 ... done
....
web_1    |  * Serving Flask app "app.py"
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on 0.0.0.0:5000/ (Press CTRL+C to quit)
#进⼊容器内部查看有我们的挂载⽬录
[root@localhost ~]# docker exec -it b7ded709ef70 /bin/bash
OCI runtime exec failed: exec failed: :349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
[root@localhost ~]# docker exec -it b7ded709ef70 /bin/sh
/code # ll
/bin/sh: ll: not found
/code # ls
Dockerfile          __pycache__        app.py              l 
/code #
修改程序重新部署
#修改我们app.py return的内容,让我们看出变化就⾏
#因为我们将⽬录之间挂载到了容器内部所以我不⽤重新编译
按理说修改py⽂件不需要重新编译就可以⽣效,但是我这⾥不⾏,重新部署以后才⽣效(docker-compose up)
其他命令
docker-compose up -d
后台启动运⾏
docker-compose run web env
单独运⾏某⼀个容器
docker-compose stop
如果你启动的时候⽤的后台启动,那么停⽌的时候需要⽤到这个命令
也可以停⽌的时候将挂载的卷也停⽌
docker-compose down --volumes
使⽤这个命令的时候要在运⾏ compose的⽬录下边才可以
docker-compose rm
如果我们想删除不再使⽤的容器,可以⽤这个命令
compose中的⽹络
使⽤compose 他会⾃动给我创建⼀个他的⽹络
[root@localhost composetest]# docker network ls
NETWORK ID          NAME                  DRIVER              SCOPE
97b350eb250b        bridge                bridge              local
93420c0b315f        composetest_default  bridge              local
6548c36a41d1        host                  host                local
49146853ccd2        none                  null                local
bf4e79dbc031        redis                bridge              local
app.py⾥边连接redis 没有配置ip 就是应为这个原因。默认通过容器名称就可以ping通l
官⽅⽂档地址:
docs.docker/compose/compose-file/
规则介绍:
1、Dockerfile⾥边可以使⽤的命令这⾥都可以使⽤
2、l⾥边必须包含两个 version 跟services
version:这个根据官⽅来写,这个版本号跟docker容器相关

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。