美文网首页
docker-compse hello world

docker-compse hello world

作者: 小艾咪 | 来源:发表于2021-07-31 23:04 被阅读0次

前言

最近根据公司安排部署了一些服务,一火车的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环境变量等多种配置方式其优先级顺序如下

  1. Compose file
  2. Shell environment variables
  3. Environment file
  4. Dockerfile
  5. 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


最后 大幻梦森罗万象狂气断罪眼\ (•◡•) /

相关文章

网友评论

      本文标题:docker-compse hello world

      本文链接:https://www.haomeiwen.com/subject/ftxdvltx.html