【04】循序渐进学 docker:Dockerfile

写在前面的话

前面我们简单的了解了镜像,也使用了镜像来运行了容器,那么问题来了,如果我们自己想生成容器怎么办?本章节的 Dockerfile 就主要讲这么制作容器,当然,这里并不会讲 Dockerfile 讲完,其中网络和存储卷我们会放在后面,因为那个相当重要。

将现有容器制作成镜像

制作镜像的方法主要有两种,但是我们这第一种基于现有镜像制作的方法其实不是很推荐,之所以提到的目的是为了给大家多一个选择,闲话少说,现在开始~

【1】运行一个想修改的镜像:

docker run -it --name b2 busybox /bin/sh

在容器中新建 data 目录,并在目录下创建 13.txt 文件,如图:

使用 Ctrl + p + q 退出容器~

【2】提交容器:

docker commit b2 busybox-new:v1.0

为了防止容器里面内容变化,我们在操作之前可以选择将容器暂停~

可以看到我们的新镜像 busybox-new:v1.0 已经制作完成,我们就可以使用它直接运行,这里就不做过多赘述,因为它不是我们的重点~

Dockerfile

这才是我们的重点内容,并且必须得会的内容,当然不要害怕,很简单,就是关键字的堆叠而已~

我先把本章节的关键字列出来,再给个示例大家就一清二楚了:

关键字 说明
FROM

必须存在的关键字,用于指明这个镜像的基于哪个镜像进行的操作,如:FROM centos:latest,

如果这个镜像就是基础镜像,不依赖于任何镜像,则使用:FROM scratch

LABEL

相当于脚本的说明,如:LABEL author="Dylan" email="[email protected]",

在老版本中这个关键字是 MAINTAINER

RUN

运行命令,也就是你要执行的操作,如果多个命令,建议使用 && 连接写成一个,

否则每多一个 RUN 镜像就得多一层,这是我们不能接受的,另外可以配置 \ 换行增强阅读性

WORKDIR 相当于我们执行 cd 命令,比如我们先 WORKDIR /test,再 WORKDIR demo,其实际就相当于 cd /test/demo
ADD

添加当前目录的文件或者文件夹到指定目录,如果文件时 tar 压缩文件,则会自动解压,

如果文件是下载 url,则不会解压

COPY 也是添加,但是相对于 ADD 就没有了解压功能
ENV 设置环境变量,能够被文件调用,并初始化到容器的系统环境变量中,如:ENV MYSQL_VERSION 5.7
CMD

这个需要结合 RUN 和后面的 ENTRYPOINT 看:

RUN 是在构建镜像的时候执行的,

CMD 则是在启动容器后默认的启动命令,

CMD 会在我们 docker run 的时候如果后面有跟命令就会忽略,多个 CMD 只执行最后一个

ENTRYPOINT 容器启动时的命令,一定执行
EXPOSE 服务的端口

这里我们暂时用到的就是这个,更多的可以参考学习很多官方镜像的 Dockerfile:

https://github.com/docker-library

说了一大堆,先来个实例练练手就会了~  

Dockerfile 实践 - 制作一个 Python Flask 项目镜像

这个项目的代码是从网上看到的,觉得很好,又简单只有一个文件所以拿过来了:app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "Hello Flask!"
if __name__=="__main__":
    app.run()

就是一个简单的 web 服务,访问页面显示 Hello Flask!

【1】首先我们建立相关的目录,并把 app.py 放在这个目录下:

mkdir python-flask-demo
cd python-flask-demo/
vim app.py

这是我们编写 Dockerfile 的规范,所以相关的东西都放在一个目录,便于管理~

【2】新建 Dockerfile 文件,注意 D 大写,内容如下:

FROM python:2.7
LABEL maintainer="Dylan <[email protected]>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app/
EXPOSE 5000
CMD ["python", "app.py"]

有几个值得注意的地方:

1. COPY 到指定目录的时候,后面的目录需要加上 /,都在会被认为是将文件重命名。

2. CMD 我们采用的是 exec 的形式,这也是我们推荐的方式,具体操作就是将命令的每一个参数拆分成列表的一个值就行。

【3】根据 Dockerfile 生成镜像: 

这个过程由于需要下载 Python 2.7 的镜像,所以速度稍微慢些~

docker build -t dylan/python-flask-demo:v1.0 .

注意最后的那个 . ,指代当前目录,docker 就会在当前目录寻找 Dockerfile。

由于第一次需要下载,输出内容太多,我这里用第二次构建的图:

可以看出,每一个命令标签就是一个 Step,这就意味着多了一层,这也是我为啥让别写太多层的原因。

此时我们可以看看创建的镜像:

【4】运行容器:

docker run -it --name flask-demo dylan/python-flask-demo:v1.0

 如图:

如果直接这样运行,会发现它运行在前台,不利于我们测试,所以我们需要加个 -d 参数,让容器后台运行。 

docker run -it --name flask-demo2 -d dylan/python-flask-demo:v1.0

查看结果:

【5】进入容器访问测试:

docker exec -it flask-demo2 /bin/sh

具体操作如图: 

至于如何让容器外部访问则是后面的内容~

小结 

Dockerfile 是使用 docker 必备的技能,所以这篇适合反复看,关键字常用的就那几个,一定要记得。最后,如果觉得可以,点个 推荐

猜你喜欢

转载自www.cnblogs.com/Dy1an/p/10600350.html