docker创建镜像的方式---dockerfile

发布时间:2023年12月24日

dockerfile:创建镜像,创建自定义的镜像。(dockerfile的主要作用)

包括配置文件,挂载点,对外暴露的端口,设置环境变量

docker的创建镜像的方式:

1.基于已有镜像进行创建。

根据官方提供的镜像源,创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性的功能还是需要自定义(进入容器进行操作)

2.基于模板进行创建

3.dockerfile

联合文件系统(UnionFS),docker镜像的基础

镜像通过分层来进行集成,特性:一次同时加载多个文件系统,但是从外面来看,就是一个文件系统。

docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

每一层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是rootfs

bootfs:宿主机提供的内核和引导程序

roosfs:就是容器的操作系统,在dockerfile中,我们可以自己指定。

rootfs是多个基础镜像和应用镜像结合起来的只读层。镜像实际上就是一个只读文件。

容器基于镜像实例,运行起来之后,容器变成可读可写层。

在docketfile当中每创建一个指定都是一个镜像层。

镜像层会被缓存和复用。

1-6 ??1-4失败 ?1-4将直接完成,继续运行5-6

—旦有一层镜像失败,那么所有的镜像层都会失败。镜像也不会创建。

镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件依然存在,但是在容器中看不见。

dockerfile的核心:用户个性化定制docker的镜像。

dockerfile的结构:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像的操作指令
  4. 容器启动时,执行的命令。

nginx:定义好了容器执行的命令/bin/bash,覆盖了容器内的标准输出。

dockerfile的语法:

FROM:指定基础镜像信息。指定容器的操作系统。

MAINTAINER:指定维护者信息(可有可无)

RUN:在基础的镜像上执行的命令,每一个run就是一层,分层越多,镜像越大。

ENTRYPOINT:设置容器运行是的默认命令(容器内部运行的主程序。)

CMD:指定容器运行时的默认命令(docker run /bin/bash后面加了其他的命令。cmd的指令将会被覆盖。)

EXPOSE:暴露端口(指定容器的运行端口)

ENV:设置环境变量,环境变量可以被RUN命令使用(声明容器运行需要的环境变量)

ADD::复制,解压。解压不支持.zip和.rartar.gz tar.bz2支持url地址解压和复制(解压)

COPY:复制文件,不能解压,而且只能复制本地文件。文件要和dockerfile在一个日录。(官方推荐复制用copy)

VOLUME:创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载。

USER:设置运行镜像时使用的用户或者UID(可以不加)

WORKDIR:为后续指令设置的工作目录。?

QNBUILD:这个镜像可以被其他镜像引用,需要这个命令。

ARG:传参,用于创建容器时,传递参数。ENV用于容器运行时设置环境变量。

Dockerfile创建镜像:

FROM centos:7
?
MAINTAINER "this is my docker <zyg>"
?
ENTRYPOINT ["echo","hello"]
?
CMD ["world"]
?
docker build -t centos7:test .
#.:使用当前dockerfile文件

CMD和ENTRYPQINT的区别:

都是可以作为容器启动时的默认命令。

区别:

  1. cmd可以把参数传给ENTRYP.OINI。
  2. 多个entrypoint和多个cmd只会运行最后一个(一个dockefile当中只会有一个entrypoint和cmd)
  3. entryponit的指令不会被覆盖,CMD的指令如果在docker run的后面加上输出,会被覆盖。
  4. entryponit和cmd的指令在容器启动时执行,都会成为容器的主进程。主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行。|

RUN命令的优化:

主要是减少镜像的层数:把多个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 l l make -j 4

如果前面的命令执行失败,才会执行后面的操作

反斜杠\:换行

RUN yum?-y install nginx \

&& make -j 4 \

&& make install

可读性更高

copy和add区别:

copy和add都可以把本地文件复制到镜像中但是官方推荐如果是复制,使用copy.区别:

ADD可以解压,如果是一个压缩文件,add在复制之后会自动解压。(tar.gz和tar.b2)可以支持URL下载源文件,支持下载,但是不能解压。通过URL拷贝的文件无法自动解压。copy只能复制,不能解压,而且只能是本地文件,不支持URL路径。|

构建一个httpd的dockerfile:
FROM centos:7
MAINTAINER this is my ?diy apache <dn>
RUN yum install -y gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.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/httpd-2.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 4 && make install
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache:centos .

docker run -itd --name http1 -p 1314:80 apache:centos
#根据创建好的镜像创建一个容器名为http1
通过指定的端口在外部浏览器测试一下
20.0.0.41:1314

#二阶段构建
FROM centos:7
#将一阶段的已安装好的包安防到二阶端中,并舍弃一阶段的其他无用资源
COPY --from=first ?/usr/local/httpd ?/usr/local/httpd
#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包
RUN yum install -y pcre pcre-devel expat-devel perl
EXPOSE 80
ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache1:centos .

基于centos7构建nginx的dockerfile(编译安装)

#创建基础镜像
FROM centos:7
MAINTAINER "this is my nginx <zyg>"
ADD nginx-1.22.0.tar.gz /opt
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl ?openssl-devel &&\
useradd -M -s /sbin/nologin nginx &&\
cd /opt/nginx-1.22.0 &&\
./configure --prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcre \--with-stream \--with-stream_ssl_module \--with-stream_realip_module &&\
make -j 4 && make install &&\
ln -s /usr/local/nginx/sbin/nginx /usr/sbin
RUN mkdir -p /usr/local/nginx/run
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

文章来源:https://blog.csdn.net/DDYYmmm/article/details/135182485
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。