Dockerfile语法

 

我认为本质就是,从FROM开始,基于from后面的image,q启动一个容器,然后按照后面的各种命令,在容器内设置参数,最后打包成一个新的image,就等于基于旧运行的容器创建镜像,等同于docker commit,特别之处是,可以指定create容器时候运行的cmd,以及运行容器时候启动的指令-entrypoint

add与copy区别,add会把tar解压,copy原样拷贝

add copy的工作路径是当前路径

cmd/run/entrypoint  的工作路径是WORKDIR


目录

FROM​

MAINTAINER

RUN

EXPOSE

CMD

ENTRYPOINT

ADD

COPY

VOLUME

ENV

WORKDIR

USER

ARG

ONBUILD


 

FROM​/MAINTAINER:头命令,都有

RUN/EXPOSE/ADD/COPY/VOLUME/ENV/WORKDIR:制作镜像的过程使用的命令

CMD/ENTRYPOINT:这俩命令是镜像制作好之后,使用镜像时候执行的命令

USER/ARG

ONBUILD:这个命令是使用制作好的镜像再制作新镜像时候触发的命令


Dockerfile是创建镜像的脚本,运行这个脚本文件可以创建脚本。

注意事项:

  • 文件名首字母大写

  • 存储Dockerfile的目录, 尽量是空目录

  • 制作的镜像功能尽量单一

  • 制作步骤要尽可能精简

dockerfile的组成

dockerfile中的注释使用: #

  • 基础镜像信息:FROM

    • 要制作的新的镜像, 基于那个镜像来制作的

    • 通过 docker images 查看

  • 维护者信息:MAINTAINER

    • 这个dockerfile是谁写的

  • 镜像操作指令:RUN / EXPOSE || ADD/ COPY /ENV || WORKDIR-针对的cmd/run/entrypoint

    • 基于原始进行进行的操作

  • 容器启动指令:CMD /ENTRYPOINT  || ONBUILD--针对基于此image在制作image时候触发

    • 基于第三步得到了新镜像

    • 新的镜像启动之后, 在容器中默认执行的指令

Dockerfile使用命令:

#构建镜像命令格式:
docker build -t [镜像名]:[版本号][Dockerfile所在目录]
#构建样例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
#参数详解:
    -t                          指定构建后的镜像信息,
    /opt/dockerfile/nginx/      则代表Dockerfile存放位置,如果是当前目录,则用 .(点)表示

 

FROM

MAINTAINER

RUN

EXPOSE

CMD

ENTRYPOINT

ADD

#ADD
#格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"]
#解释:
    # 将宿主机文件拷贝到容器目录中
      # 如果宿主机文件是可识别的压缩包, 会进行解压缩 -> tar
      ADD 宿主机文件 容器目录/文件
      
#    ADD ["宿主机文件", "容器目录"]
   - 宿主机文件一般放到Dockerfile对应的目录中
   - 容器目录, 有可能存在, 有可能不存在
        - 存在: 直接拷贝到容器目录
      - 不存在: 先在容器中创建一个, 再拷贝
  ADD ["a.txt", "/home/go/a.txt"]
   - 第二个参数如果指定的是一个文件名
     - 这个文件存在: 直接覆盖
     - 不存在: 直接拷贝
#ADD实践:
    #拷贝普通文件
    :~/docker/images/nginx$ vim Dockerfile 
    
    #Dockerfile文件内容
    
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
    ADD ["sources.list","/etc/apt/sources.list"]
    RUN apt-get clean
    RUN apt-get update
    RUN apt-get install nginx -y
    # 对外端口
    EXPOSE 80
 
    #构建镜像
    :~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.6 .
    
    #根据镜像创建容器,创建时候,不添加执行命令进入容器查看效果
    docker run  --name nginx-8 -it ubuntu-nginx:v0.6
    
    #拷贝压缩文件
    tar zcvf this.tar.gz ./*
    #Dockerfile文件内容
    ...
    # 执行命令
    ...
    # 增加文件
    ADD ["linshi.tar.gz","/nihao/"]
    ...
    #构建镜像
    :~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.7 .
    #根据镜像创建容器,创建时候,不添加执行命令进入容器查看效果
    docker run --name nginx-9 -it ubuntu-nginx:v0.7
    :~/docker/images/nginx$ docker run --name nginx-9 -it ubuntu-nginx:v0.7


COPY

#COPY
    #格式:
    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"]
    #解释:
    #COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
    #单纯复制文件场景,Docker 推荐使用COPY
#COPY实践
    #修改Dockerfile文件内容:
    # 构建一个基于ubuntu的docker定制镜像
    # 基础镜像
    FROM ubuntu
    # 镜像作者
    MAINTAINER panda kstwoak47@163.com
    # 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
COPY ["index.html","/var/www/html/"]
# 对外端口
EXPOSE 80
#运行时默认命令 
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
index.html 文件内容:
<h1>hello world </h1>
<h1>hello docker </h1>
<h1>hello nginx</h1>
 
#构建镜像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.8 .
#根据镜像创建容器,创建时候,不添加执行命令
:~/docker/images/nginx$ docker run  --name nginx-10 -itd ubuntu-nginx:v0.8
#查看nginx-10信息
:~/docker/images/nginx$docker inspect  nginx-10
#浏览器访问nginx查看效果    


VOLUME

#VOLUME
    #格式:
    VOLUME ["/data"]
    #解释:
    #VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
    #通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
    #举例:
    VOLUME ["/var/lib/tomcat7/webapps/"]

#VOLUME实践
#修改Dockerfile文件内容:
#将COPY替换成为VOLUME
:~/docker/images/nginx$vim Dockerfile
VOLUME ["/helloworld/"]
...
#构建镜像
:~/docker/images/nginx$docker build -t ubuntu-nginx:v0.9 .
#创建数据卷容器
:~/docker/images/nginx$docker run -itd --name nginx-11 ubuntu-nginx:v0.9
#查看镜像信息
:~/docker/images/nginx$docker inspect nginx-11
#验证操作
:~/docker/images/nginx$docker run -itd --name vc-nginx-1 --volumes-from nginx-11 nginx
:~/docker/images/nginx$docker run -itd --name vc-nginx-2 --volumes-from nginx-11 nginx
#进入容器1
:~/docker/images/nginx$docker exec -it vc-nginx-1 /bin/bash
:/# echo 'nihao itcast' > helloworld/nihao.txt
#进入容器2
:~/docker/images/nginx$ docker exec -it vc-nginx-2 /bin/bash
:/# cat helloworld/nihao.txt


ENV

#ENV
    #格式:
    ENV <key> <value>                    (一次设置一个环节变量)
    ENV <key>=<value> ...                (一次设置一个或多个环节变量)
    ENV HELLO 12345
      ENV HELLO=12345
      ENV HELLO=12345 WORLD=12345 NIHAO=12345
#解释:
#设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定

#ENV实践:
    #命令行创建ENV的容器
    :~$ docker run -e NIHAO="helloworld" -itd --name ubuntu-111 ubuntu /bin/bash
    #进入容器ubuntu-111
    :~$ docker exec -it ubuntu-111 /bin/bash
    :/# echo $NIHAO
    
    #修改Dockerfile文件内容:
    #在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个ENV
    ENV NIHAO=helloworld
    ...
    #构建镜像
    docker build -t ubuntu-nginx:v0.10 .
    
    #根据镜像创建容器,创建时候,不添加执行命令
    docker run  --name nginx-12 -itd ubuntu-nginx:v0.10
    docker exec -it nginx-12 /bin/bash
    echo $NIHAO

WORKDIR

#WORKDIR
    #格式:
    WORKDIR /path/to/workdir (shell 模式)
    #解释:
    #切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd
    #可以多次切换(相当于cd 命令),
    #也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
    #举例:
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    #则最终路径为/a/b/c

#WORKDIR实践:
    #修改Dockerfile文件内容:
    # 在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个WORKDIR
    WORKDIR /nihao/itcast/
    RUN ["touch","itcast1.txt"]
    WORKDIR /nihao
    RUN ["touch","itcast2.txt"]
    WORKDIR itcast
    RUN ["touch","itcast3.txt"]
    ...
    #构建镜像
    :~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.11 .
    #根据镜像创建容器,创建时候,不添加执行命令
    docker run  --name nginx-13 -itd ubuntu-nginx:v0.11
    #进入镜像
    docker exec -it nginx-13 /bin/bash


USER

#USER
    #格式:
    USER daemon
    #解释:
    #指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
    #如果不输入任何信息,表示默认使用root 用户

ARG

#ARG
    #格式:
    ARG <name>[=<default value>]
    #解释:
    #ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过
    #如果构建的时候不指定就会报错。


ONBUILD


#格式:
    ONBUILD [command]
#解释:
    #当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,
    #新镜像B在构建的时候,会插入触发器中的指令。
    #使用场景对于版本控制和方便传输,适用于其他用户。
    
  # 原始镜像 -> 纯净版
      -> 修改 ONBUILD ["echo", "hello,linux"]
         
  # 基于原始镜像制作新镜像 -> 镜像A
      -> 启动镜像A -> 不会输出hello, linux
      
  # 基于镜像A制作了镜像B
      -> 启动镜像B -> 会输出 hello, linux

 

#编辑Dockerfile
:~/docker/images/nginx$ vim Dockerfile 
#内容如下:
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"] 
RUN apt-get clean
RUN apt-get update 
RUN apt-get install nginx -y 
#触发器
ONBUILD COPY ["index.html","/var/www/html/"]
# 对外端口
EXPOSE 80
#运行时默认命令 
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
 
#构建镜像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.12 .
 
#根据镜像创建容器,
:~/docker/images/nginx$docker run -p 80 --name nginx-14 -itd ubuntu-nginx:v0.12
:~/docker/images/nginx$docker ps
#查看镜像信息
:~/docker/images/nginx$ docker inspect ubuntu-nginx:v0.12  
#访问容器页面,是否被更改
:~/docker/images/nginx$ docker inspect nginx-14
#构建子镜像Dockerfile文件
FROM ubuntu-nginx:v0.12
MAINTAINER panda kstwoak47@163.com
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
 
#构建子镜像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.13 .
#根据镜像创建容器,
docker run -p 80 --name nginx-15 -itd ubuntu-nginx:v0.13
#查看镜像信息
:~/docker/images/nginx$ docker inspect ubuntu-nginx:v0.13
docker ps
#访问容器页面,是否被更改


#取消缓存:
docker build --no-cache -t [镜像名]:[镜像版本][Dockerfile位置]


 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值