Dockerfile
自定义镜像----------通过dockerfile创建镜像。
1、创建镜像的方式
1.1 dockerfile 最基本的方式 最常用的方式
1.2 dockerpull 拉取的是最基础的镜像,只有基础功能,没有定制化的功能
1.3 基于基础镜像,创建好了容器之后再容器内部进行定制化的操作,然后导出成镜像,下次继续使用
2、基于dockerfile创建
UnionFS
:联合文件系统
这个是docker镜像的基础,镜像通过分层来进行集成,基于基础可以制作各种具体的应用镜像
特性:一次性同时加载多个文件系统,但是从外面看,只能看见一个文件系统,文件系统叠加。
镜像加载的原理:
一层一层的文件系统组成
rootfs
:根文件系统,包含一个完整的文件系统(操作系统)包括了所有的文件和目录,以及相关权限和用户等信息。运行容器时,整个的根文件系统就会整个被使用,作为应用的运行的环境
bootfs
:引导文件系统。启动根系统时需要加载的核心文件。
3、dockerfile定制化镜像
3.1 dockerfile
定制每一层需要添加的配置和文件。把每一层的修改、安装、构建和操作都写入到一个脚本。用脚本来进行创建镜像。这个脚本就是dockerfile
3.2 dockerfile分为四个部分
1.1 基础镜像信息:底层
1.2 维护者信息(可有可无)
1.3 镜像的操作指令和相关配置
1.4 容器启动时执行的命令
可以支持#开头作为注释
4、dockerfile的命令
4.1 命令
FROM:永远是整个脚本第一个语法,指定定制镜像的基础操作系统
MAINTAINER:维护者信息,可以不写 新版本用LABEL来代替了
RUN:在基础镜像上执行的命令,然后把运行结果整合到新镜像当中,RUN就是一个镜像的分层,RUN越多分层就越多,镜像就越大,为了控制镜像的大小,多个RUN尽可能得写在一个RUN里面
ENTRYPOINT
:指定容器在启动时执行的命令或者参数
CMD
:指定容器在启动时执行的命令或者参数
EXPOSE:指定容器对外暴露的端口号
ENV:用来设置基础操作系统的环境变量,以便RUN命令使用或者新镜像使用,就是给系统添加环境变量
ADD:支持URL从网络下载文件,也可以对压缩文件进行解压
COPY:只能复制本地文件(宿主机文件)到镜像的目标位置
VOLUME:创建一个容器内的挂载点,不是和宿主机进行挂载
USER:设置运行镜像时的用户
WORKDIR:指定容器的工作目录,相当于切换到这个目录,在这个目录下做指定的操作
ONBUILD:指定一个镜像作为另一个镜像构建的基础时需要运行的命令
ARG:用来传参,用户传递的参数,ENV是容器内部的参数
4.2 FROM的语法,以及CMD和ENTRYPOINT
bash
vim Dockerfile
FROM centos:7
ENTRYPOINT ["ls","/etc"]
ENTRYPOINT ["ls","/usr"]
CMD ["ls","/etc"]
CMD ["ls","/usr"]
wq!
docker build -t centos:test .
docker run -it --name test1 centos:test
# 看一下运行内容,文本内容可以变换,其中cmd会传参给entrypoint
4.3 CMD和ENTRYPOINT的区别
ENTRYPOINT:在有多个的情况下,只会运行最后一个
CMD:在有多个的情况下,也是运行最后一个
cmd和entrypoint同时存在,命令都执行,entrypoint会覆盖cmd的命令,并且cmd会把命令作为参数传给entrypoint,作为容器启动时执行命令的语句,一般情况下二者是通用的,但是在传参的情况下,需要加上cmd;如果没有特殊的操作(传参),写一个cmd或者entrypoint即可,二者不要同时存在
总结:cmd作为启动命令,运行容器时传了额外参数,cmd会被覆盖不会被执行;entrypoint不会被覆盖,容器运行时指定的命令相当于给entrypoint传参
4.4 run的作用
在基础镜像运行然后把结果传给新镜像。
bash
FROM centos:7
RUN ls /opt
RUN ls /etc
RUN ls /usr
wq!
docker build -t centos:test . # 运行速度慢
run的结构要合理
run优化
bash
FROM centos:7
RUN ls /opt && ls /etc && ls /usr
wq!
docker build -t centos:test . # 写在一层,运行速度快
bash
&& 前一个指令成功,才会执行下一个
; 不论前面是否成功,后面都会执行
|| 前面一个失败了,后面才会执行
\ 把一个命令分成多个行,提高可读性
4.5 COPY和ADD
ADD作用:解压,如 .tar .tar.gz .zip 根据URL进行文件下载、复制(官方解释:同样是复制。推荐使(copy)
AAD不能复制压缩文件,使用COPY
COPY:只能复制,复制本地文件到容器内
bash
echo 123 > xiaodai.txt
(1)vim Dockerfile
FROM centos:7
ADD wordpress-6.4.2-zh_CN.tar.gz /opt
# 只有和Dockerfile在同一目录下
COPY xiaodai.txt /opt/test
wq!
docker build -t centos:test .
docker run -it centos:test # 进入容器查看add和copy的结果
(2)vim Dockerfile
FROM centos:7
ADD http://mirrors.aliyun.com/repo/Centos-7.repo /opt/Centos-7.repo
wq!
docker build -t centos:test .
docker run -it centos:test # 进入容器查看add
4.6 工作目录和环境变量以及容器卷(挂载卷)
WORKDIR 工作目录:切换到容器内的指定目录
ENV 环境变量:添加一个PATH
VOLUME 挂载卷:
bash
(1)vim Dockerfile
COPY xiaodai.txt /opt/test
WORKDIR /opt
ENV PATH /opt/test:$PATH
wq!
docker build -t centos:test .
docker run -it centos:test
-----------------------------------------------------------------------
[root@3ef9d5910092 opt]# ls
test
[root@3ef9d5910092 opt]# echo $PATH
/opt/test:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
(2)vim Dockerfile
COPY xiaodai.txt /opt/test
WORKDIR /opt
ENV PATH /opt/test:$PATH
VOLUME ["/opt/test1"]
wq!
docker build -t centos:test .
docker run -itd --name test1 centos:test /bin/bash
docker ps # 启动
docker run -it --name test2 --volumes-from test1 centos:7
# 容器和容器挂载,可以查看挂载结果
docker run -it --name test3 -v /opt/test:/opt/test1 centos:test
# 容器和宿主机/opt/test挂载,可以查看内容
EXPOSE 指定端口:
bash
5、实战:使用yum安装定制一个nginx
bash
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/Centos-7.repo
RUN yum -y install epel-release && \
yum -y install nginx
EXPOSE 80
WORKDIR /var/log/nginx/
VOLUME ["/usr/share/nginx/html"]
wq!
docker build -t centos:test .
docker run -itd --name nginx1 centos:test # docker ps
docker run -itd --name nginx2 -v /opt/html:/usr/share/nginx/html centos:test # 宿主机和容器挂载
cd /opt/html/
echo 123 > index.html
# 开一个终端:获取ip,如172.17.0.3
curl 172.17.0.3 # 出现 123
docker run -itd --name nginx3 --volumes-from nginx2 centos:test # 容器3和容器2挂载
# 开一个终端:获取ip,如172.17.0.4
curl 172.17.0.4 # 出现 123
补充:指定nginx在容器中启动时执行的命令或者参数
bash
vim Dockerfile
CMD ["nginx","-g","daemon off;"]
wq!
docker run -itd --name nginx1 centos:test # docker ps
docker exec -it nginx1 bash
ll /usr/share/nginx/html/
# 开启另外一个终端,获取nginx1的ip,如:172.17.0.2
curl 172.17.0.2 # 页面出现403
cd /usr/share/nginx/html/
rm -rf index.html
echo 123 > index.html
# 开启另外一个终端,获取nginx1的ip,如:172.17.0.2
curl 172.17.0.2 # 出现123
docker run -itd --name nginx2 centos:test /bin/bash
# 开启另外一个终端,获取nginx2的ip,如:172.17.0.3
curl 172.17.0.3 # 出现curl: (7) Failed connect to 172.17.0.4:80; 拒绝连接