Docker的Dockerfile脚本基本使用指南 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    这篇文章主要介绍了Docker的Dockerfile脚本基本使用指南,Docker是当下最火爆的容器集群技术,需要的朋友可以参考下

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,

Docker的Dockerfile脚本基本使用指南

。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

    Dockerfile 语法

    在我们深入讨论Dockerfile之前,让我们快速过一下Dockerfile的语法和它们的意义。

    什么是语法?

    非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。

    Dockerfile 语法示例

    Dockerfile语法由两部分构成,注释和命令+参数

    一个简单的例子:

代码如下:

    # Print "Hello docker!"

    RUN echo "Hello docker!"

    Dockerfile 命令

    Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

    FROM 命令

   

代码如下:

    FROM

    或

代码如下:

    FROM :

    这个设置基本的镜像,为后续的命令使用,所以应该作为Dockerfile的第一条指令。

    比如:

代码如下:

    FROM ubuntu

    如果没有指定 tag ,则默认tag是latest,如果都没有则会报错。

    RUN 命令

    RUN命令会在上面FROM指定的镜像里执行任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到。

    两种格式:

代码如下:

    RUN (the command is run in a shell - `/bin/sh -c`)

    或:

代码如下:

    RUN ["executable", "param1", "param2" ... ] (exec form)

    RUN命令等价于:

代码如下:

    docker run image command

    docker commit container_id

    注释

    使用 # 作为注释

    如:

代码如下:

    # Memcached

    #

    # VERSION 1.0

# use the ubuntu base image provided by dotCloud

    FROM ubuntu

# make sure the package repository is up to date

    RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list

    RUN apt-get update

# install memcached

    RUN apt-get install -y memcached

    MAINTAINER 命令

    MAINTAINER

    MAINTAINER命令用来指定维护者的姓名和联系方式

    如:

代码如下:

    MAINTAINER Guillaume J. Charmes, guillaume@dotcloud.com

    ENTRYPOINT 命令

    有两种语法格式,一种就是上面的(shell方式):

代码如下:

    ENTRYPOINT cmd param1 param2 ...

    第二种是 exec 格式:

代码如下:

    ENTRYPOINT ["cmd", "param1", "param2"...]

    如:

代码如下:

    ENTRYPOINT ["echo", "Whale you be my container"]

    ENTRYPOINT 命令设置在容器启动时执行命令

代码如下:

    root@tankywoo-docker:~# cat Dockerfile

    FROM ubuntu

    ENTRYPOINT echo "Welcome!"

root@tankywoo-docker:~# docker run 62fda5e450d5

    Welcome!

    USER 命令

    比如指定 memcached 的运行用户,可以使用上面的 ENTRYPOINT 来实现:

代码如下:

    ENTRYPOINT ["memcached", "-u", "daemon"]

    更好的方式是:

代码如下:

    ENTRYPOINT ["memcached"]

    USER daemon

    EXPOSE 命令

    EXPOSE 命令可以设置一个端口在运行的镜像中暴露在外

代码如下:

    EXPOSE [...]

    比如memcached使用端口 11211,可以把这个端口暴露在外,这样容器外可以看到这个端口并与其通信。

代码如下:

    EXPOSE 11211

    一个完整的例子:

代码如下:

    # Memcached

    #

    # VERSION 2.2

# use the ubuntu base image provided by dotCloud

    FROM ubuntu

MAINTAINER Victor Coisne victor.coisne@dotcloud.com

# make sure the package repository is up to date

    RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list

    RUN apt-get update

# install memcached

    RUN apt-get install -y memcached

# Launch memcached when launching the container

    ENTRYPOINT ["memcached"]

# run memcached as the daemon user

    USER daemon

# expose memcached port

    EXPOSE 11211

    上面是官方例子,国内建议换成163或sohu的源,不然太慢了,

电脑资料

Docker的Dockerfile脚本基本使用指南》(https://www.unjs.com)。

代码如下:

    root@tankywoo-docker:~# docker build -t tankywoo - < dck [38/480]

    Uploading context 2.56 kB

    Uploading context

    Step 0 : FROM ubuntu

    ---> 99ec81b80c55

    Step 1 : MAINTAINER Victor Coisne victor.coisne@dotcloud.com

    ---> Using cache

    ---> 2b58110877f6

    Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list

    ---> Running in f55a4a8bb069

    ---> d48c6a965398

    Step 3 : RUN apt-get update

    ---> Running in da091a1dd6e7

    Ign http://mirrors.163.com precise InRelease

    Get:1 http://mirrors.163.com precise Release.gpg [198 B]

....

Processing triggers for libc-bin (2.19-0ubuntu6) ...

    Processing triggers for ureadahead (0.100.0-16) ...

    ---> 2886671b5b86

    Step 5 : ENTRYPOINT ["memcached"]

    ---> Running in e8aeeab92cb6

    ---> 7148293a4053

    Step 6 : USER daemon

    ---> Running in 288766b19606

    ---> 235e7f630ffa

    Step 7 : EXPOSE 11211

    ---> Running in c6f881b9d51f

    ---> 666c5d65f396

    Successfully built 666c5d65f396

    Removing intermediate container f55a4a8bb069

    Removing intermediate container da091a1dd6e7

    Removing intermediate container f23631d3d45a

    Removing intermediate container e8aeeab92cb6

    Removing intermediate container 288766b19606

    Removing intermediate container c6f881b9d51f

    ENV 命令

    用于设置环境变量

代码如下:

    ENV

    设置了后,后续的RUN命令都可以使用。

    使用此dockerfile生成的image新建container,可以通过 docker inspect 看到这个环境变量:

代码如下:

    root@tankywoo-docker:~# docker inspect 49bfc7a9817f

    ...

    "Env": [

    "name=tanky",

    "HOME=/",

    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

    ],

    ...

    里面的name=tanky就是设置的。

    也可以通过在docker run时设置或修改环境变量:

代码如下:

    docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash

    ADD 命令

    从src复制文件到container的dest路径:

代码如下:

    ADD

    是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url

    是container中的绝对路径

    VOLUME 命令

代码如下:

    VOLUME [""]

    如:

代码如下:

    VOLUME ["/data"]

    创建一个挂载点用于共享目录

    WORKDIR 命令

   

代码如下:

    WORKDIR /path/to/workdir

    配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径

    可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令

    比如:

代码如下:

    WORKDIR /a WORKDIR b WORKDIR c RUN pwd

    其实是在 /a/b/c 下执行 pwd

    CMD 命令

    有三种格式:

代码如下:

    CMD ["executable","param1","param2"] (like an exec, preferred form)

    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

    CMD command param1 param2 (as a shell)

    一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效。

最新文章