小娜老师的讲义-Docker基础知识-编写Dockerfile

来源:互联网 发布:linux能用ghost 编辑:程序博客网 时间:2024/05/03 18:14

使用dockerfile创建镜像:

Dockerfile是一个文本格式的配置文件,用户可以使用dockerfile快速创建自定义的镜像,首先将介绍dockerfile典型的基本结构及其支持的众多指令,并具体讲解通过这些指令来编写定制镜像的dockerfile。最后会介绍使用dockerfile创建镜像的过程。

一、基本结构:

dockerfile由一行行命令组成,并且支持以#开头的注释行;

dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时的指令。

如:

# This dockerfile uses the ubuntu image

# VERSION 2 - EDITION 1

# Author:docker_user

# Command format:Instruction [arguments / command]...

 

# 第一行必须指定基于的基础镜像

FROM ubuntu

 

# 维护者信息

MAINTAINER nana 

 

# 镜像的操作指令

RUN echo “deb http://archive.ubuntu.com/ubuntu/raring main universe” >> /etc/apt/sources.list

RUN apt-get update && apt-get install -y nginx

RUN echo “\ndaemon off;” >> /etc/nginx/nginx.conf

 

# 容器启动时执行指令

CMD /usr/sbin/nginx

其中,一开始必须指明所基于的镜像名称。接下来一般会说明维护者信息。

后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的指令。每运行一条RUN指令,镜像添加新的一层,并提交。最后是CMD指令,来制定运行容器时的操作命令。

下面是两个dockerhub上的dockerfile的例子:

第一个是在ubuntu父镜像基础上安装inotify-toolsnginxapache2openssh-server等软件。从而创建一个新的ngignx镜像:

#  Nginx

#

#  VERSION 0.0.1

FROM ubuntu

MAINTAINER nana 

RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

第二个也是基于ubuntu的父镜像,安装firefoxvnc软件,启动后,用户可以通过5900端口通过vnc方式使用firefox:

#  Firefox over VNC

#

#  VERSION 0.3

FROM ubuntu

# Install vnc,xvfb in order to create a ‘fake’ display and firefox

RUN apt-get update && apt-get install -y xllvnc firefox

RUN mkfir /.vnc

# Setup a password

RUN xllvnc -storepasswd 1234 ~/.vnc/passwd

# Autostart firefox (might not be the best way,but it does the trick)

RUN bash -c ‘echo”firefox” >> /.bashrc’

 

EXPOSE 5900

CMD [“xllvnc”,”-forever”,”-usepw”,”-create”]

 

二、指令:

    指令的一般格式INSTRUCTION arguments,指令包括FROMMAINTAINERRUN等。

FROM

格式FROM <image>FROM <image>:<tag>

第一条指令必须为FROM指令。并且,如果在同一个Dockerfile建多个,可以使用多个FROM指令(每个像一次)。

MAINTAINER

格式MAINTAINER <name>,指定维护者信息。

3.RUN

格式RUN <command>RUN ["executable", "param1", "param2"]

前者将在shell端中行命令,即/bin/sh -c ;后者使用exec行。指定使用其它端可以通第二种方式实现,例如RUN ["/bin/bash", "-c", "echo hello"]

每条RUN指令将在当前像基行指定命令,并提交新的像。当命令较长时可以使用\行。

4.CMD

支持三种格式

CMD ["executable","param1","param2"] 使用 exec 行,推荐方式;

CMD command param1 param2 /bin/sh行,提供需要交互的用;

CMD ["param1","param2"] 提供ENTRYPOINT的默参数;

指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被行。

如果用户启动容器候指定了行的命令,会覆盖掉CMD指定的命令。

5.EXPOSE

格式EXPOSE <port> [<port>...]

Docker端容器暴露的端口号,供互使用。在启动容器需要通-PDocker主机会自

分配一个端口转发到指定的端口。

6.ENV

格式ENV <key> <value>指定一个量,会被后RUN指令使用,并在容器保持。

7.ADD

格式ADD <src> <dest>

命令将复制指定的<src>到容器中的<dest>其中<src>可以是Dockerfile所在目的一个相路径;也可以是一个URL可以是一个tar文件(自压为)。

8.COPY

格式COPY <src> <dest>

复制本地主机的<src>Dockerfile所在目的相路径)到容器中的<dest>

当使用本地目录为源目录时,推荐使用COPY

9.ENTRYPOINT

种格式:

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2 shell行)。

配置容器启动行的命令,并且不可被docker run 提供的参数覆盖。

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个,只有最后一个效。

10.VOLUME

格式VOLUME ["/data"]

建一个可以从本地主机或其他容器挂的挂点,一般用来存放数据和需要保持的数据等。

11.USER

格式USER daemon

指定行容器的用名或UID,后RUN也会使用指定用

当服不需要管理员权,可以通过该命令指定行用。并且可以在之前建所需要的用,例

如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以

使用gosu,而不推荐sudo

12.WORKDIR

格式WORKDIR /path/to/workdir

RUNCMDENTRYPOINT指令配置工作目

可以使用多个WORKDIR指令,后命令如果参数是相路径,会基于之前命令指定的路径。例如

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

路径/a/b/c

13.ONBUILD

格式ONBUILD [INSTRUCTION]

配置当所建的像作其它新像的基础镜,所行的操作指令。

例如,Dockerfile使用如下的内容建了image-A

[...]

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

[...]

如果基于image-A建新的,新的Dockerfile中使用FROM image-A 指定基础镜,会自动执

ONBUILD 指令内容,等价于在后面添加了条指令。

FROM image-A

#Automatically run the following

ADD . /app/src

RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的像,推荐在标签中注明,例如ruby:1.9-onbuild

 

三、创建镜像:

   写完成Dockerfile之后,可以通docker build命令来像。

基本的格式docker build [选项]路径命令将取指定路径下(包括子目)的Dockerfile,并将

路径下所有内容Docker端,由服端来像。因此一般建放置Dockerfile的目录为

。也可以通.dockerignore文件(每一行添加一条匹配模式)来Docker忽略路径下的目和文

件。

要指定像的标签信息,可以通-t选项,例如

$ sudo docker build -t myrepo/myapp /tmp/test1 .

0 0
原创粉丝点击