dockerfile 创建镜像,创建自定义的镜像
包括配置文件、挂载点、对外暴露的端口、设置环境变量
docker的创建镜像的方式
1、基于已有镜像进行创建
根据官方提供的镜像源创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性功能还是要自定义(进入容器进行操作)
2、基于模板进行创建
cd /opt
拖进去
ls
docker import ubuntu-14.04-x86-minimal.tar.gz(镜像名称) -- ubuntu:14
docker images
docker run -itd --name test ubuntu:14 /bin/bash
docker exec -it test bash
ls
apt
apt -y install nginx
apt -y install httpd
exit
3、dockerfile
联合文件系统(UnionFS),docker镜像的基础
镜像通过分层来进行集成,特性:一次同时加载多个文件系统,但是从外面看,就是一个文件系统
docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是iUnionFS
每一层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起最终形成的就是rootfs
bootfs 宿主机提供内核和引导程序
rootfs 就是容器的操作系统,在dockerfile中,我们可以自己指定
rootfs 是多个基础镜像和应用镜像结合起来的只读层。镜像实际上就是只读文件
容器基于镜像实例,运行起来之后,容器变成可读可写层
在dockerfile当中,每创建一个指定都是一个镜像层
镜像层会被缓存和复用
例:
1--6层
1-4层成功,第4层失败
修复完成后,1-4将会直接完成,继续运行5-6
特点:一旦有一层镜像缓存失败,那么所有的镜像层都会失败,镜像也不会创建
镜像层是不可变的,在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件,依然存在,但是在容器中看不见
dockerfile的核心: 用户个性化定制docker的镜像。
dockerfile的结构
1、基础镜像信息
2、维护者信息
3、镜像的操作指令
4、容器启动时执行的命令
nginx:定义好了容器执行命令 /bin/bash覆盖了容器内的标准输出
dockerfile的语法(所有语法都是大写)
FROM ?指定基础镜像信息。指定容器的操作系统(必须要有)
MAINTAINER ?指定维护者信息(可有可无)
RUN ?在基础镜像信息FROM上执行的命令,每个RUN就是一层,RUN越多,分层越多,镜像越大(必须要有)
ENTRYPOINT ?设置容器运行时的默认命令(容器内部运行的主程序)(和CMD二选一,必须要有)
CMD ?指定容器运行时的默认命令(docker run /bin/bash 后面加了其他命令,CMD命令将会被覆盖)(和ENTRYPOINT二选一,必须要有)
EXPOSE ?暴露容器端口(指定容器的运行端口)(必须要有)
ENV ?设置环境变量。环境变量可以被RUN命令使用(声明容器运行需要的环境变量)
ADD ?复制、解压。解压不支持.zip和.rar。支持tar.gz、tar.bz2、支持url地址解压和复制(解压)
COPY ??复制文件,不能解压,只能复制本地文件。文件要和dockerfile在一个目录里(官方推荐复制用COPY)
VOLUME ?设置挂载点。创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载
USER ?设置运行镜像时使用的用户或者UID(可以不加)
WORKDIR ?为后续指令设置的工作目录
ONBUILD ?这个镜像可以被其他镜像引用,需要这个命令
ARG ?传参,用于创建容器时传进参数(可有可无)。ENV用于容器运行时设置环境变量
Q:ENTRYPOINT和CMD的区别
A:都是可以作为容器启动时的默认命令
区别一:CMD 可以把参数传给ENTRYPOINT
[root@10 opt]# cd
[root@10 ~]# cd /opt/
[root@10 opt]# ls
containerd ?rh
[root@10 opt]# mkdir test1
[root@10 opt]# ls
containerd ?rh ?test1
[root@10 opt]# cd test1/
[root@10 test1]# vim Dockerfile
FROM centos:7
MAINTAINER "this is my docker <fmh>"
ENTRYPOINT ["echo","hello"]
CMD ["by"]
[root@10 test1]# docker build -t centos7:test .
[+] Building 0.0s (5/5) FINISHED ????????????????????docker:default
?=> [internal] load build definition from Dockerfile ??????????0.0s
?=> => transferring dockerfile: 183B ??????????????????????????0.0s
?=> [internal] load .dockerignore ?????????????????????????????0.0s
?=> => transferring context: 2B ???????????????????????????????0.0s
?=> [internal] load metadata for docker.io/library/centos:7 ???0.0s
?=> [1/1] FROM docker.io/library/centos:7 ?????????????????????0.0s
?=> exporting to image ????????????????????????????????????????0.0s
?=> => exporting layers ???????????????????????????????????????0.0s
?=> => writing image sha256:12ef6f09c329271e46c1d23005bf7e229 ?0.0s
?=> => naming to docker.io/library/centos7:test ???????????????0.0s
[root@10 test1]# docker images
REPOSITORY ??TAG ??????IMAGE ID ??????CREATED ????????SIZE
nginx ???????1.22.0 ???08a1cbf9c69e ??14 months ago ??142MB
nginx ???????latest ???605c77e624dd ??23 months ago ??141MB
centos7 ?????test ?????12ef6f09c329 ??2 years ago ????204MB
centos ??????7 ????????eeb6ee3f44bd ??2 years ago ????204MB
[root@10 test1]# docker run --name test3 centos7:test
hello by
区别二:多个entrypoint和多个cmd只会运行最后一个(一个dockerfile中只会有一个entrypoint和cmd)
[root@10 test1]# vim Dockerfile
FROM centos:7
MAINTAINER "this is my docker <fmh>"
ENTRYPOINT ["echo","hello"]
ENTRYPOINT ["echo","hi"]
CMD ["by"]
CMD ["LIKE"]
[root@10 test1]# docker build -t centos7:test4 .
[+] Building 0.0s (5/5) FINISHED ????????????????????docker:default
?=> [internal] load build definition from Dockerfile ??????????0.0s
?=> => transferring dockerfile: 224B ??????????????????????????0.0s
?=> [internal] load .dockerignore ?????????????????????????????0.0s
?=> => transferring context: 2B ???????????????????????????????0.0s
?=> [internal] load metadata for docker.io/library/centos:7 ???0.0s
?=> CACHED [1/1] FROM docker.io/library/centos:7 ??????????????0.0s
?=> exporting to image ????????????????????????????????????????0.0s
?=> => exporting layers ???????????????????????????????????????0.0s
?=> => writing image sha256:30b66fd7a78cd675a46e2b673581e1e02 ?0.0s
?=> => naming to docker.io/library/centos7:test4 ??????????????0.0s
[root@10 test1]# docker run ?centos7:test4
hi LIKE
区别三:entrypoint指令不会被覆盖,cmd指令如果在docker run 后面加上输出,会被覆盖
[root@10 test1]# vim Dockerfile
FROM centos:7
MAINTAINER "this is my docker <fmh>"
ENTRYPOINT ["echo","hello"]
CMD ["by"]
[root@10 test1]# docker run -it centos7:test ls /opt
hello ls /opt
共同点:entrypoint和cmd的指令在容器启动时执行,都会成为容器的主进程。主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行
Q:run命令的优化
A:主要是减少镜像的层数:把多个RUN命令写在一起
&&符号:
RUN yum-y install nginx && make -j 4 && make install
前一个命令执行成功才会执行下一个命令
;符号
RUN yum?-y install nginx ; make -j 4 ; make install
不管前一个命令是否执行成功,都会执行下一个命令
||符号
RUN yum?-y install nginx || make -j 4 || make install
前一个命令执行失败才会执行下一个命令
RUN yum?-y install nginx \
&& make -j 4?\
&& make install
换行,可读性更高
Q:COPY和ADD区别
A:
共同点:copy和add都可以把本地文件复制到镜像中 但是官方推荐如果是复制,使用copy.
区别:ADD可以解压。如果是一个压缩文件,ADD在复制之后会自动解压(仅限于tar.gz和tar.bz2)。并且ADD支持URL下载源文件(只能支持下载,不能解压。通过URL拷贝的文件无法自动解压)
COPY只能复制,不能解压,而且只能是本地文件,不支持URL路径
centos7构建一个apache的dockerfile(编译安装)
[root@10?apache]# ls
apr-1.6.2.tar.gz apr-util-1.6.0.tar.gz httpd-2.4.29.tar.bz2
[root@10?apache]# vim Dockerfile
FROM centos:7
MAINTAINER "this is my apache <fmh>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD apr-util-1.6..tar.gz /opt
ADD httpd-2.4.29,tar.bz2 /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd -enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 16?&& make install
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
[root@10?apache]# docker build -t apache:centos?.
[root@10?apache]# docker run -itd --name httpdl -p 1314:80?apache:centos
8968bc8a879a172d7ee90a9c63c6d047dc036c598e07279c84de16d636a35a2c
[rootadockerl apache]#
网页浏览192.168.233.10:1314
[rootadockerl apache]# docker ps
基于镜像进行二次构建
?[rootadockerl apache]# ls
[root@10?apache]# vim Dockerfile
FROM centos:7?AS first
MAINTAINER "this is my apache <fmh>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD apr-util-1.6..tar.gz /opt
ADD httpd-2.4.29,tar.bz2 /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd -enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 16?&& make install
#二层构建
FROM centos:7
COPY --from=first /usr/local/httpd /usr/local/httpd
RUN yum -y install pcre pcre-devel expat-devel perl
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
[root@10?apache]# docker build t apache1:centos .
[root@10?apache]# docker images