Docker自定制镜像之Dockerfile

Posted zyk01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker自定制镜像之Dockerfile相关的知识,希望对你有一定的参考价值。

镜像的定制,就是定制每一层所添加的配置、文件,如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本中,用脚本来构建、定制镜像,这个脚本就是Dockerfile

Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容就是没每一层应当如何构建的.

Dockerfile ---------??


FROM
指定基于哪个镜像文件来构建新的镜像,尽量使用官方的bash image
示例:
FROM 镜像名/镜像ID[:tag]


LABEL
容器元消息,帮助信息,Metadata,类似于代码注释
示例:
LABEL version="1.0" 版本标示
LABEL maintainer="name @163.com" 声明制作人


RUN
创建镜像时执行的命令


WORKDIR
切换工作目录


COPY
把本机的文件添加到容器中
示例:
COPY flask_web.py /app/ 把本机的flask_web.py文件复制到容器中的/app目录下,会自动创建/app目录


ADD
除了COPY的功能外还有解压功能,应优先使用COPY命令


ENV
设置环境变量,尽可能的使用ENV来设置环境变量,以增加可维护性
示例:
ENV mysql_VERSION 5.6 设置一个MySQL常量
RUN yum install -y mysql-server="${MYSQL_VERSION}" 调用MySQL常量


CMD
设置容器启动后默认执行的命令和参数
??如果定义多个CMD,则只有最后一个会执行
??如果 docker run 时指定了其它命令(例如:/bin/bash、python flask_web.py),则CMD命令会被忽略



EXPOSE
网络设置
示例:
EXPOST 8080 暴露容器的8080端口


VOLUME
存储设置


ENTRYPOINT
设置容器启动时运行的命令
让容器以应用程序或服务的形式运行,不会被忽略,一定会执行

关于Shell格式和Exec格式


对于相对的命令,Shell格式与Exec格式的对比如下.


Shell格式

RUN yum -y install vim
CMD echo "Hello Docker"
ENTRYPOINT echo "Hello Docker"


Exec格式

RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "Hello Docker"]
ENTRYPOINT["/bin/echo","Hello Docker"]

需要注意的是:
通过Shell格式运行的命令可以读取设置的变量,而Exec格式则不可以读取,Exec格式仅仅是执行一个命令.

下面将使用Dockerfile来制作一个Flask Web服务


首先,准备一个用于调用Flask web服务的脚本:

"""flask_web.py文件代码如下"""
from flask import Flask
app=Flask(__name__)
@app.route(‘/‘)
def run():
    return ‘is ok‘
if __name__ == ‘__main__‘:
    app.run(host=‘0.0.0.0‘, port=8080)  # 我们这里使用的是8080端口


然后,开始写Dockerfile:

# 指定基于哪个基础镜像来构建
FROM python:2.7

# 制作人
LABEL maintainer=‘zyk [email protected]‘

# 安装flask第三方库
RUN easy_install flask

# 将本机的flask_web.py文件复制到容器的/app目录下,会自动生成/app目录
COPY flask_web.py /app/

# 进入/app目录
WORKDIR /app

# 暴露容器的8080端口
EXPOSE 8080

# 设置容器启动后默认执行的命令和参数,以Exec格式执行,注意:要用双引号
CMD ["python", "flask_web.py"]


最后,制作镜像:

# ?? Dockerfile与flask_web.py文件在同级目录
[[email protected] docker]# ls
Dockerfile  flask_web.py

# 开始制作镜像
[[email protected] docker]# docker build -t zyk/flask .


制作完成后,查看镜像并启动:

# 查一下镜像ID
[[email protected] docker]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
zyk/flask                   latest              c4e156f3222a        50 seconds ago      911 MB

# 启动镜像
[[email protected] docker]# docker run -d -p 9000:8080 c4e156f3222a


好了,打开浏览器访问测试:
技术分享图片









































































以上是关于Docker自定制镜像之Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

Docker自定制镜像之Dockerfile--2019-08-06 15:20:55

自定义通过Dockerfile创建httpd镜像

Docker基础命令使用

docker学习:DockerFile微服务实战及docker端口映射

docker-编写dockerfile最佳实践

Docker 中Dockerfile的语法梳理