我认为本质就是,从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存放位置,如果是当前目录,则用 .(点)表示
#ADD
#格式:
ADD
ADD ["
#解释:
# 将宿主机文件拷贝到容器目录中
# 如果宿主机文件是可识别的压缩包, 会进行解压缩 -> tar
ADD 宿主机文件 容器目录/文件
# ADD ["宿主机文件", "容器目录"]
- 宿主机文件一般放到Dockerfile对应的目录中
- 容器目录, 有可能存在, 有可能不存在
- 存在: 直接拷贝到容器目录
- 不存在: 先在容器中创建一个, 再拷贝
ADD ["a.txt", "/home/go/a.txt"]
- 第二个参数如果指定的是一个文件名
- 这个文件存在: 直接覆盖
- 不存在: 直接拷贝
#ADD实践:
#拷贝普通文件
:~/docker/images/nginx$ vim Dockerfile
#Dockerfile文件内容
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda [email protected]
# 执行命令
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 ["
#解释:
#COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
#单纯复制文件场景,Docker 推荐使用COPY
#COPY实践
#修改Dockerfile文件内容:
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda [email protected]
# 执行命令
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 文件内容:
hello world
hello docker
hello nginx
#构建镜像
:~/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 ["/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
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 /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 daemon
#解释:
#指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
#如果不输入任何信息,表示默认使用root 用户
#ARG
#格式:
ARG
#解释:
#ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg
#如果构建的时候不指定就会报错。
#格式:
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 [email protected]
# 执行命令
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 [email protected]
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位置]