Docker入门与应用系列(五)Dockerfile

Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image。

Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。

指令是不区分大小写的,但是通常我们都大写。

指令

描述

格式

FROM

构建的新镜像基于那个镜像

FROM centos:6

MAINTAINER

镜像维护者信息

MAINTAINER syavingc

RUN

构建镜像运行的shell命令、

命令较长使可以使用\来换行

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

RUN yum install nginx

CMD

运行容器时执行的shell命令

解释:

   CMD指定容器启动是执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

CMD ["-c", "start.sh"]

CMD ["/usr/sbin/sshd", "-D"]

CMD /usr/sbin.sshd -D

EXPOSE

生成容器运行的服务端口

EXPOSE 80 443

ENV

设置容器内环境变量

ENV MYSQL_ROOT_PASSWORD123456

ADD

拷贝文件或者目录到镜像,如果是URL或压缩包会自动下载或者自动解压

ADD <src>…<dest> 将指定的<src>复制到容器文件系统中的<dest>

ADD ["<src>",... "<dest>"]

ADD http.tar.gz /var/www/html

COPY

拷贝文件或目录到镜像

同上

VOLUME

指定容器挂载点到宿主机自动生成的目录或其他容器

VOLUME ["/usr/local/mysql"]

USER

指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户。

USER syavingc

USER <user>[:<group>] or USER <uid>[:<GID>]

WORKDIR

为RUN、CMD、COPY、ADD设置工作目录

WORKDIR /data/

ENTRYPOINT

运行容器时执行的shell命令

ENTRYPOINT ["/bin/bash", "-c", "/start.sh"]

ENTRYPOINT /bin/bash -c '/start.sh'

HEALTHCHECK

健康检查

HEALTHCHECK --interval=5m --timeout=3s\

CMD curl -f http://localhost/ || exit 1

ARG

ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错

ARG<name>[=<default value>]

 

 RUN、CMD和ENTRYPOINT指令区别

1、RUN在building时运行,可以写多条

2、CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效。

3、CMD在RUN时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定-ENTRYPOINT覆盖

1.1 Build镜像命令

使用Dockerfile文件构建镜像

docker 同一个目录挂载到2个容器中 多个dockerfile_Docker


docker build [options] path|url|-
options:
-t --tag list    #镜像名称
-f --file string #指定Dockerfile文件位置
#实例
docker build .        #默认找当前目录以Dockerfile为命名的文件
docker build -t data/app -t /path/Dockerfile /path
docker build -t data/app - < Dockerfile
docker build -t data/app - < test.tar.gz
docker build -t data/app http://www.syaving.com/Dockerfile
docker build -t data/app http://www.syaving.com/test.tar.gz


docker 同一个目录挂载到2个容器中 多个dockerfile_Docker

基于SSH的dockerfile

docker 同一个目录挂载到2个容器中 多个dockerfile_Docker


FROM centos:6
MAINTAINER syavingc

ENV ROOT_PASSWORD 123456

RUN yum install -y openssh-server
RUN echo $ROOT_PASSWORD |passwd --stdin root

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

CMD ["/usr/sbin/sshd","-D"]

EXPOSE 22


docker 同一个目录挂载到2个容器中 多个dockerfile_Docker

查看build完成后的镜像


root@linux-node3:/data# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ssh                 v1                  81a48fb65356        54 seconds ago      309MB
wordpress           v1                  4ba156b9e30d        15 minutes ago      405MB
centos              6                   df3764b1d215        2 weeks ago         194MB


创建新的容器

root@linux-node3:/data# docker run -itd --name ssh -p 2222:22 ssh:v1
d8f2b5460f2b89f9281dd4276626ca7ac595668bd5a66e75cabc2bfb5eba3b63
root@linux-node3:/data# docker ps -l
CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS                  NAMES
d8f2b5460f2b        ssh:v1              "/usr/sbin/sshd -D"   About a minute ago   Up About a minute   0.0.0.0:2222->22/tcp   ssh


现在可以通过IP+端口登陆docker新建的容器里面了