Docker基础之Dockerfile(2)
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义镜像。
Dockerfile基础语法
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行,Dockerfile分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
接下来将根据一条条指令的学习过程中,为我的服务(一个简单的flask项目,开发端口8888和主线端口18888)写一个Dockfile文件,并构建Dockerfile镜像、然后放到我远程注册服务上。
第一行必须指定基础镜像
Dockerfile的第一行必须指定基础镜像,同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
# 格式
FROM <image> 或FROM <image>:<tag>
# 举例
FROM oraclelinux:8-slim
个人服务使用基础镜像为python最新版本
FROM python:latest
维护者信息
MAINTAINER 7wencaixu 7wencaixu@email.com
镜像操作指令
1. RUN
每运行一条RUN指令,镜像添加新的一层,并提交。主要有两种方式,一种类似于linux命令方式,第二种可以exec执行,指定终端,分别如下:
- linux命令方式
# 将RUN理解为linux的$命令提示符是不是好理解一点
RUN <command>
# 举例
RUN yum install net-tools
- exec执行指定终端
RUN <"executable","param1","param2">
# 举例
RUN['/bin/bash','-c','echo hello']
注意:因为如上所说,每使用RUN指令都会创建一个层,为了减少层的创建,可以使用&&去优化。案例如下:
RUN mkdir /webtest.d && \
pip install flask -i https://pypi.douban.com/simple
容器启动时执行指令
CMD
每个Dockerfile只能有一条CMD命令,如果指定多条,只有最后一条执行,主要作用是:为启动程序指定默认的运行程序,类似于linux的开机自启。格式主要有两种:
CMD <command>
CMD ["command | excuable file","<param1>",...]
CMD ["<param1>","<param2>",...]
# 案例
CMD python start.py
EXPOSE
告诉Docker服务端容器暴露的端口号列表,告诉运维或开发者该容器暴露了哪些端口。
# 格式
EXPOSE <port1> <port2>
# 案例
EXPOSE 8888 18888
ENV
指定一个环境变量,会被后续RUN指令或其他指令使用,并在容器中运行时保持
# 格式
ENV <key> <value>
# 案例
ENV SERVER_NAME="webtest"
ENV LOG_PATH=/usr/local/logs/$SERVER_NAME/runtime.log
ADD
该命令将复制指定 到容器中的 其中可以是Dockerfile所在目录的相对路径也可以是一个URL。如果是压缩包,则会自动解压。
# 格式
ADD <src> <dest>
# 案例
ADD ./project.d webtest.d/ # 会将project.d文件拷贝到webtest.d下
COPY
COPY 复制主机的为容器中的.目标路径不存在时会自动创建
# 格式
COPY src dest
VOLUME
格式VOLUME["/data"] 创建一个可以从本地主机或其他容器挂在的挂载点,一般用来存放数据库和需要保持的数据等
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
构建镜像命令
docker build -t 7wencaixu/webtest .
完整构建代码(个人服务暂不开源)
服务代码
from flask import Flask
import datetime
server=Flask(__name__)
@server.route('/time',methods=['post','get'])
def get_time():
now=str(datetime.datetime.now())
return "current time YYYY-MM-DD HH:mm:SS :%s"%now
server.run(port=8888)
完整Dockerfile
#
# NOTE:THIS DOCKERFILE IS CREATE BY wencai.xu
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM python:latest
LABEL maintainer="7wencaixu" email="wencai.xu@gmail.com"
ENV SERVER_NAME="webtest"
ENV LOG_PATH=/usr/local/logs/$SERVER_NAME/runtime.log
RUN touch $LOG_PATH && \
mkdir /webtest.d && \
pip install flask -i https://pypi.douban.com/simple && \
pip install datetime -i https://pypi.douban.com/simple
ADD ./project.d webtest.d/
WORKDIR /webtest.d/project.d
EXPOSE 8888 18888
CMD python start.py > $LOG_PATH
测试
curl ip:8888/time