前言
最近根据公司安排部署了一些服务,一火车的jar包手动部署就......懂得都懂。并且服务器还是Windows Server 就直接原地爆炸。好在还可以使用批处理。于是就有了如下批处理脚本。
@echo off
start cmd /c "java -jar register.jar"
choice /t 20 /d y /n >nul
start cmd /c "jar -jar gateway.jar"
choice /t 15 /d y /n >nul
for %%i in (*.jar) do (
if not %%i==register (
if not %%i==gateway (
start cmd /c "title %%i && java -jar %%i"
)
)
)
pause
此时我就想起当年用docker时也顺便看了点docker-compose,一颗热爱学习的心霎时间就按耐不住了。不如就再看一遍吧,万一以后用到了呢
安装
执行一下命令下载docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
给下载的docker-compose赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
Docker-compse Hello world
创建任意一个文件夹存放,docker-compose.yml
(docker-compose 使用yml作为配置文件格式) Dockerfile
.env
以及其他文件。
使用官方示例的一个flask+redis 应用,首先准备web服务器代码
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)
准备依赖文件,这里可选修改Dockerfile文件的pip安装指令以去除该文件。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
#这里如果不使用requirements.txt,使用两个RUN
#RUN pip install flask
#RUN pip install redis
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
编写docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
以上步骤都没问题后使用docker-compse up
【构建】启动所有容器,首次启动会很慢,可能会下载并安装包括但不限于ssl,gcc等依赖。尤其是gcc安装较慢,耐心等待。
出现如下界面则表示启动成功
# ....为省略非关键内容,实际日志行数远大于以下内容
Recreating docker-compose_web_1 ... done
Starting docker-compose_redis_1 ... done
....
redis_1 | 1:M 03 Apr 2021 13:38:27.747 * Running mode=standalone, port=6379.
....
redis_1 | 1:M 03 Apr 2021 13:38:27.748 * Ready to accept connections
....
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
启动成功后访问http://ip:5000会出现一下内容
Hello World! I have been seen 2 (注释:访问几次页面就是几) times.
绑定挂载点
修改docker-compose.yml
增加挂载点
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
#将宿主机当前目录与容器内/code目录绑定,功能与docker run的-vc参数一致
- .:/code
environment:
# 设置容器内环境变量,功能与Dockerfile ENV指令以及docker run的-e参数一致
FLASK_ENV: development
redis:
image: "redis:alpine"
我对Flask框架并不熟悉,不过从官方文章中表示Flask应该会根据FLASK_ENV: development
这个环境变量选择开启开发模式(类似于热跟新的功能)
然后在当前目录修改app.py
中的内容。因为有- .:/code
所以直接在宿主机修改
return 'Hello from Docker-compose! I have been seen {} times.\n'.format(count)
保存后再浏览http://ip:5000会发现网页内容已经发生变化
Hello Docker-compose! I have been seen 6 times.
profiles
profiles声明
docker-compose 中包含许多服务,我们可以通过使用profiles属性来控制是否启动某项服务。profiles属性的值是数组形式的,例如我将为redis属性增加一个名为alming的profile
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
#将宿主机当前目录与容器内/code目录绑定,功能与docker run的-vc参数一致
- .:/code
environment:
# 设置容器内环境变量,功能与Dockerfile ENV指令以及docker run的-e参数一致
FLASK_ENV: development
redis:
image: "redis:alpine"
profiles: alming
然后再启动它,会发现redis服务并未启动
~/docker/compose$ docker-compose -f docker-compose-profiles.yml up
Starting compose_web_1 ... done
Attaching to compose_web_1
web_1 | * Serving Flask app 'app.py' (lazy loading)
web_1 | * Environment: development
web_1 | * Debug mode: on
web_1 | * Running on all addresses.
web_1 | WARNING: This is a development server. Do not use it in a production deployment.
web_1 | * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
web_1 | * Debugger is active!
web_1 | * Debugger PIN: 132-905-791
这里涉及另一个关于docker-compse CLI 的知识点,即通过指定compose文件启动 使用-f
参数
激活profiles
想要启动带有profile的服务有多种方法,第一种就是使用--profile
参数,启动命令如下
docker-compose --profile alming -f docker-compose-profiles.yml up
第二种方式是配置COMPOSE_PROFILES
环境变量,例如执行以下命令添加环境便令
export COMPOSE_PROFILES=alming
随后执行docker-compose -f docker-compose-profiles.yml up
即使不指定profile参数,也会启动标有alming profiles的服务
tips
如果profiles是数组那么,仅需满足其中一个profile服务即可生效
环境变量
.env文件
docker-compse 默认会读取.env
文件中声明的环境变量。.env
文件以KEY=VALUE的格式存储环境变量。
例如有如下.env
环境变量文件
MY_PROFILE=al
然后在compose文件中引用
redis:
image: "redis:alpine"
profiles: ["${MY_PROFILE}"]
这样${MY_PROFILE}在运行时就会被替换为al,可以使用 docker-compose config 验证一下,该指令用于查看和验证compse文件。结果如下
~/docker/compose$ docker-compose -f docker-compose-env.yml config
services:
redis:
image: redis:alpine
profiles:
- al
web:
build:
context: /home/ubuntu/docker/compose
environment:
FLASK_ENV: development
ports:
- published: 5000
target: 5000
volumes:
- /home/ubuntu/docker/compose:/code:rw
version: '3.9'
同样 -f
用于指定compse文件
优先级问题
compse文件同样识别命令行环境变量参数和 shell环境变量等多种配置方式其优先级顺序如下
- Compose file
- Shell environment variables
- Environment file
- Dockerfile
- Variable is not defined
指定env文件
docker-compse 默认识别当前目录下.env文件,如env文件不在当前目录或名称非.env那么可以通过--env-file
参数指定 env 文件
docker-compose -f docker-compose-env.yml --env-file al-env config
多compose文件
docker-compse可指定多compose 文件启动。其中各属性既有叠加又有覆盖。使用时再说把QAQ
最后 大幻梦森罗万象狂气断罪眼\ (•◡•) /
网友评论