• 【Docker系列教程之五】如何构建Dockerfile


    在上一篇文章中,我们讲述了 Dockerfile 的组成以及指令的编写过程,在本篇文章中详细讲解如何构建 Dockerfile 。

    Dockerfile常用的指令

    那么在讲如何构建 Dockerfile 之前,我们回顾一下上一篇的编写过程:

    • 1、从 DockerHub 上 pull 下指定的基础镜像

    • 2、显示维护者的信息

    • 3、 copy 当前目录到容器中的指定目录下 复制本地主机的 <src> ( Dockerfile 所在目录的相对路径)到容器里 <dest>

    • 4、指定工作路径

    • 5、安装依赖包

    • 6、暴露端口

    • 7、启动容器

    我们已经差不多知道了 Dockerfile 的组成以及指令的编写过程,我们再来理解一下这些常用命令就会得心应手了。

    由于 Dockerfile 中所有的命令都是以下格式: INSTRUCTION argument ,指令 (INSTRUCTION) 不分大小写,但是推荐大写,和sql语句是不是很相似呢?下面我们正式来讲解一下这些指令集吧。

    FROM

    FROM 是用于指定基础的 images ,一般格式为 FROM<image> or FORM<image>:<tag> ,所有的 Dockerfile 都用该以 FROM 开头, FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础, FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。比如我们要指定 python2.7 的基础镜像,我们可以像如下写法一样:

    1. FROM python:2.7

    MAINTAINER

    MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER<name> 。这里我设置成我的 ID 和邮箱:

    1. MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>

    COPY

    COPY 是用于复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径)到容器中的 <dest>

    当使用本地目录为源目录时,推荐使用 COPY 。一般格式为 COPY<src><dest> 。例如我们要拷贝当前目录到容器中的 /app 目录下,我们可以这样操作:

    1. COPY . /app

    WORKDIR

    WORKDIR 用于配合 RUN, CMD, ENTRYPOINT 命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为 /。一般格式为 WORKDIR/path/to/work/dir 。例如我们设置 /app 路径,我们可以进行如下操作:

    1. WORKDIR /app

    RUN

    RUN 用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN<command> 。例如我们要安装 python 依赖包,我们做法如下:

    RUN pip install -r requirements.txt

    EXPOSE

    EXPOSE 命令用来指定对外开放的端口。一般格式为 EXPOSE<port>[<port>...]

    例如上面那个例子,开放5000端口:

    1. EXPOSE 5000

    ENTRYPOINT

    ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

    ENTRYPOINT 命令也有两种格式:

    ENTRYPOINT["executable","param1","param2"] :推荐使用的 exec形式
    
    ENTRYPOINT command param1 param2 : shell 形式

    例如下面这个,我们要将 python 镜像变成可执行的程序,我们可以这样去做:

    1. ENTRYPOINT ["python"]

    CMD

    CMD 命令用于启动容器时默认执行的命令, CMD 命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为 ENTRYPOINT的参数。

    CMD 命令有三种格式:

    CMD["executable","param1","param2"]:推荐使用的 exec 形式。
    
    CMD["param1","param2"]:无可执行程序形式
    
    CMD command param1 param2:shell 形式。

    一个 Dockerfile 中只能有一个 CMD,如果有多个,则最后一个生效。而 CMD 的 shell 形式默认调用 /bin/sh-c 执行命令。

    CMD 命令会被 Docker 命令行传入的参数覆盖: docker run busybox/bin/echoHello Docker 会把 CMD 里的命令覆盖。

    例如我们要启动 /app ,我们可以用如下命令实现:

    1. CMD ["app.py"]

    当然还有一些其他的命令,我们在用到的时候再去一一讲解一下。

    构建Dockerfile

    我们大体已经把Dockerfile的写法讲述完毕,我们可以自己动手写一个例子:

    ~~~shell mkdir staticweb cd staticweb touch Dockerfile 然后 vi Dockerfile 开始编辑该文件 输入 i 开始编辑

    以下是我们构建的Dockerfile内容

    FROM nginx
    
    MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
    
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    
    ```````

    编辑完后 按 esc 退出编辑 然后 :wq 写入 退出 ~~~

    我们在 Dockerfile 文件所在目录执行:

    1. docker build -t angelkitty/nginx_web:v1 .

    我们解释一下, -t 是为新镜像设置仓库和名称,其中 angelkitty 为仓库名, nginx_web 为镜像名, :v1 为标签(不添加为默认 latest )

    我们构建完成之后,使用 docker images 命令查看所有镜像,如果存在 REPOSITORY 为 nginx 和 TAG 是 v1 的信息,就表示构建成功。

    接下来使用 docker run 命令来启动容器

    docker run --name nginx_web -d -p 8080:80    angelkitty/nginx_web:v1

    这条命令会用 nginx 镜像启动一个容器,命名为 nginx_web ,并且映射了 8080 端口,这样我们可以用浏览器去访问这个 nginx 服务器: http://localhost:8080/ 或者 http://本机的IP地址:8080/,页面返回信息:

    这样一个简单使用 Dockerfile 构建镜像,运行容器的示例就完成了!

    总结

    到此为止,Docker的基础部分已经说的差不多了,在后续的文章中,我会带大家了解一些Docker底层实现的原理以及Linux内核部分。由于Docker是用Golang语言开发的,这时候我们可能需要Golang语言的基础,不过不必担心,只要你有C语言的基础就行,我们在后续的文章中讲解一点Golang语言相关的基础知识。

    努力提高自己的技术,不忘初心
  • 相关阅读:
    (3)Smali系列学习之Smali语法详解
    (2.1)Smali系列学习之基础语法
    (2.0)Smali系列学习之Smali语法
    Why NHibernate updates DB on commit of read-only transaction
    用LinqPad查看Nhibernate生成的sql语句
    Oracle中Clob类型处理解析
    时间线插件
    深入理解OAuth2.0协议
    项目经理问:为什么总是只有我在加班–挂包袱现象
    Nhibernate Case SUM
  • 原文地址:https://www.cnblogs.com/blackCatFish/p/9826893.html
Copyright © 2020-2023  润新知