Docker 构建镜像
环境
Docker: Docker version 19.03.4, build 9013bf583a
System: CentOS Linux release 8.0.1905 (Core)
Python: Python 3.6.8
Flask: Flask 1.0.3
Gunicorn: gunicorn 19.9.0
Dockerfile 指令详解
- FROM
or FROM :
FROM 指令用于指定其后构建新镜像所使用的基础镜像。FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像。
- COPY <源路径> <目标路径>
指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:
COPY package.json /app
- ADD <源路径> <目标路径>
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL
- CMD <命令> or CMD ["可执行文件", "参数1", "参数2"...]
CMD用于指定在容器启动时所要执行的命令
- ENV
or ENV = = ...
主要用于设置程序运行时需要的参数
- EXPOSE <端口1> [<端口2>...]
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明
- WORKDIR <工作目录路径>
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
- USER <用户名>[:<用户组>]
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。
- RUN <命令行命令> or RUN ["可执行文件", "参数1", "参数2"]
用于执行后面跟着的命令行命令.
- VOLUME <路径> or VOLUME ["<路径1>", "<路径2>"...]
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,可以避免重要的数据,因容器重启而丢失。
构建 Docker 镜像
Dockerfile
# 基于 Python:3.6 基础镜像
FROM python:3.6
# Docker 的工作目录
WORKDIR /app
# 复制文件到工作目录
ADD . /app
# 安装 Python 的依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 设置运行的必要参数
ENV env=dev
# 程序启动的命令
CMD ["gunicorn", "manager:app", "-c", "run.ini"]
application.py
# coding:utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/index')
def index():
return 'Hello docker'
if __name__ == '__main__':
app.run(debug=True)
run.ini
workers = 5
threads = 4
daemon = 'false'
worker_class = "gevent"
bind = "0.0.0.0:8000"
requirements.txt
gunicorn
gevent
flask
构建镜像
# docker build -t <tag>:<version> <dir>
docker build -t gunicron:v1.0.0 .
创建 Docker 容器
docker run -d --name gunicron-flask -p 8084:8084 gunicron
Docker 容器操作
docker [start | stop | restart] gunicorn-flask