Dockerfile构建镜像:

  1. Dockerfile的创建

Dockerfile的每一句命令都会生成一层镜像。比如说下面的四条命令,会生成四层镜像。
Dockerfile参考文档:https://docs.docker.com/engine/reference/builder/

直接建一个名字为Dockerfile的文件.写入下面的命令:
FROM python:3.6.1-alpine
RUN pip install flask
CMD [“python”,“app.py”]
COPY app.py /app.py

FROM python:3.6.1-alpine:
Dockerfile的起点。 每个Dockerfile通常以FROM行开头,这是在其之上构建层的起始映像(也就是镜像的第一层)。 在这种情况下,您选择的是python:3.6.1-alpine基本层,因为它已经具有运行应用程序所需的Python和pip版本。alpine版本意味着它使用alpine发行版,该发行版比Linux的替代版本小得多。 较小的映像意味着它将更快地下载(部署),并且由于其受攻击面较小,因此也更加安全。

RUN pip install flask:
RUN命令执行为应用程序设置映像所需的命令,例如安装软件包,编辑文件或更改文件权限。 在这种情况下,您将安装Flask。 RUN命令在build image的时候执行,会生成一层新的镜像,加在FROM生成的基础镜像的上面。

CMD [“python”,“app.py”]
容器在启动的时候,会运行CMD指定的命令。(注意,CMD指定的命令不会在构建镜像的时候执行,但是会生成一层镜像)
There can be only one CMD per Dockerfile. If you specify more than one CMD, then the last CMD will take effect.

COPY app.py /app.py
这行代码将本地目录(运行docker image build的时候所在的目录)中的app.py文件复制到映像的新层。 该指令是Dockerfile中的最后一行。 频繁更改的层(例如将源代码复制到映像中)应放置在Dockerfile文件底部附近,以充分利用Docker层缓存。 这样可以避免重建可能会缓存的image层。 例如,如果FROM指令发生更改,它将使该image的所有后续层的缓存均无效。

  1. 通过Dockerfile build一个镜像
    docker image build -t python-hello-world . ==> docker build -t python-hello-world .
    -t:指定生成的镜像的名字
    用法: docker build [OPTIONS] PATH | URL | - ==>后面必须带有一个PATH参数或者URL参数,指定docker file所在的位置

  2. docker images ==> docker image ls
    查看镜像列表(查看有多少镜像)

  3. 运行镜像
    docker run -p 5001:5000 -d python-hello-world
    -p解释: The -p flag maps a port running inside the container to your host. In this case, you’re mapping the Python app running on port 5000 inside the container to port 5001 on your host. Note that if port 5001 is already being used by another application on your host, you might need to replace 5001 with another value, such as 5002.
    -d: 后台运行容器

  4. 查看容器的logs
    使用docker ps查看正在运行的容器的id
    docker logs [container id] ==> 指定id查看对应的容器的log

  5. Dockerfile用于为应用程序创建可复制的build。 常见的工作流程是让您的CI/CD自动化运行docker映像构建,这是其构建过程的一部分。生成映像后,会将它们发送到central registry(存储镜像的地方),所有需要运行该应用程序的环境(例如测试环境)都可以访问它们。

上传镜像到Docker Hub:

  1. 登录docker hub的账号 ==> docker login

  2. tag自己的镜像
    Docker Hub的命名约定是使用[dockerhub用户名]/[镜像名称]标记image。
    命令:
    docker tag python-hello-world [dockerhub username]/python-hello-world

  3. 上传镜像
    docker push [dockerhub用户名]/python-hello-world

  4. 镜像被上传到docker hub之后,其他的人可以通过git pull拉取你的镜像使用。
    Docker映像包含在映像中运行应用程序所需的所有依赖项。运行应用程序的时候也不需要担心环境的差异,不需要配置。直接就能起来一个应用。很方便。

当应用更新之后,需要重新build image。

  1. 更新你的应用程序。

  2. 重新build image
    命令:
    docker image build -t [dockerhub用户名]/python-hello-world .
    重新build的时候,会利用已经build好的layer的缓存,而不会重新build。

  3. 重新上传
    docker push [dockerhub用户名]/python-hello-world
    在上传到docker hub的时候,没有被更新的layer也是不会被上传上去的,这样可以节省很多的时间。

  4. 当更改了镜像的某一层layer的时候,重新build的时候,在这层layer之上的layer都会被重新build。
    Dockerfile中的每一行都会构建一个新层,该层建立在从之前的行创建的层上。所以Dockerfile中的指定的命令的顺序很重要。 在创建Dockerfile的时候,要注意优化,将经常需要改动的层放在最上面。

总结:

  1. 使用Dockerfile为应用程序创建可复制的build,并将应用程序与Docker集成到CI / CD中。可以通过central registry使Docker映像可用于所有环境。 Docker Hub是registry的一个示例,但是可以在自己控制的服务器上部署自己的注registry。
  2. Docker映像包含在映像中运行应用程序所需的所有依赖项。这很有用,因为当依靠部署在每个环境上的依赖项安装时,不再需要处理版本差异。
  3. Docker使用联合文件系统和“copy-on-write”来重用映像层。这样可以减少存储图像的空间,并显着提高启动容器的性能。layer层由Docker构建和推送系统缓存。无需重新build已经存在的layer层。
  4. Dockerfile中的每一行都会创建一个新层,由于层缓存的原因,更改频率更高的行(例如,将源代码添加到映像)应在文件底部附近列出。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐