Docker基础之Dockerfile(2)

dockerfile 多个volume dockerfile run两条_dockerfile 多个volume


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执行,指定终端,分别如下:

  1. linux命令方式
# 将RUN理解为linux的$命令提示符是不是好理解一点
    RUN <command> 
    # 举例
    RUN yum install net-tools
  1. 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