欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > dockerfile

dockerfile

2024/10/25 4:26:21 来源:https://blog.csdn.net/2402_84844434/article/details/141226599  浏览:    关键词:dockerfile

dockerfile

自定义镜像--------通过dockerfile创建镜像

创建镜像的方式

1、dockerfile最基本的方式,也是最常用的方式

2、docker pull 拉取的是最基础的镜像,只有基础功能,没有定制化的功能。

3、基于基础镜像,创建好了容器之后再容器内部进行定制化的操作然后导出成镜像,下次继续使用。

基于dockerfile创建

联合文件系统:UnionFS(这是docker镜像的基础)

镜像通过分层来进行集成,基于基础可以制作各种具体的应用镜像。

特性:

一次性同时加载多个文件系统,但是从外看只能看到一个文件系统。文件系统叠加。

镜像加载的原理:

一层一层的文件系统组成的

rootfs:根文件系统,包含了一个完整的文件系统(操作系统),包括所有的文件和目录。以及相关的权限和用户等信息。运行容器时,整个的根文件系统就会整个被使用作为应用的运行环境。

bootfs:引导文件系统,启动根系统时需要加载的核心文件。

dockfile定制化镜像

定制每一层需要添加的配置和文件。把每一层的修改、安装、构建、操作都写入到一个脚本。

用脚本来创建镜像(脚本就是dockerfile)

dockerfile分四个部分

1、基础镜像信息(底层)

2、维护者信息(可有可无)

3、镜像的操作指令和相关配置

4、容器日东是执行的命令

可以支持以#开头作为注释

dockerfile的命令

FROM:永远时整个脚本的第一个语法,指定定制镜像的基础操作系统。

MAINTAINER:维护者信息,可以不写。新版本用LABEL代替

RUN:在基础镜像上执行的命令,把运行结果整合到新镜像当中。RUN就是一个镜像的分层,RUN越多分层越多,镜像越大。为控制镜像的大小,多个RUN尽可能的写在一个RUN里面。

ENTRYPOINT:指定容器在启动时执行的命令或者参数

CMD:指定容器在启动时执行的命令或者参数

EXPOSE:指定容器对外暴露的端口号

ENV:用来设置基础操作系统的环境变量,以便RUN命令可以使用或者是新镜像使用,就是给系统添加环境变量

ADD:可以支持URL从网络下载文件,也可以对压缩文件镜像解压

COPY:只能复制本地文件(宿主机文件)到镜像的目标位置

VOLUME:创建一个容器内的挂载点,不是和宿主机进行挂载。

USER:设置运行镜像时的用户

WORKDIR:执行容器的工作目录,相当于切换到这个目录,在这个目录下指定的操作

ONBUILD:指定一个镜像作为另一个镜像构建的基础时需要运行的命令

ARG:ARG用来传参数,用户传送参数,ENV是容器内部的变量

1、ENTRYPOINT

FROM语法,以及CMD和ENTRYPOINT的区别(重点)

ENTRYPOINT:有多个的情况下,只会运行最后一个
[root@docker1 test1]# vim Dockerfile
FROM centos:7
ENTRYPOINT ["ls","/etc"]
ENTRYPOINT ["ls","/usr"]
#执行脚本
[root@docker1 test1]# docker build -t centos:test .
[root@docker1 test1]# docker run -it --name test2 centos:test
bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
[root@docker1 test1]# ls /usr/
bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
​
2、CMD:

有多个也是运行最后一个

[root@docker1 test1]# vim Dockerfile
FROM centos:7
CMD ["ls","/etc"]
CMD ["ls","/usr"]
#执行脚本
[root@docker1 test1]# docker build -t centos:test .
[root@docker1 test1]# docker run -it --name test3 centos:test
bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
[root@docker1 test1]# ls /usr/
bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
​
3、CMD和ENTRYPOINT同时存在,

命令都会执行,但是ENTRYPOINT会覆盖CMD的命令,并且CDM会把命令作为参数传给ENTRYPOINT

[root@docker1 test1]# vim Dockerfile
FROM centos:7
ENTRYPOINT ["ls","/etc"]
CMD ["ls","/usr"]
​
#执行脚本
[root@docker1 test1]# docker build -t centos:test .
[root@docker1 test1]# docker run -it --name test2 centos:test
ls: cannot access ls: No such file or directory
/etc:
BUILDTIME        gshadow        openldap        sasl2
​
4、总结:

作为容器启动时执行命令的语句,一般情况下二者是通用的,但是在传参的情况下,需要加上CMD,如果没有特殊的操作(传参),写一个CMD或者ENTRYPOINT即可,二者不要同时存在

CMD作为启动命令,运行容器时传了额外的参数,CMD会被覆盖不会被执行;ENTRYPOINT不会被覆盖,容器运行的命令相当于给ENTRYPOINT传参。

5、RUN

RUN在基础镜像运行然后把结果传给新镜像。

RUN的结构要合理,不要太多,

root@docker1 test1]# vim Dockerfile
FROM centos:7
RUN ls /opt && ls /etc && ls /usr
#&&前一个指令成果才会执行下一个
RUN Ls /opt ; ls /etc ; ls /usr
#也可以用分号;前一个不管成不成功,后一个都会执行
RUN Ls /opt || ls /etc || ls /usr
#||:前面一个失败了才会执行
RUN ls /opt && \ls /etc && \ls /usr 
#\把一个命令分成多个行,提高可读性
​
6、COPY和ADD

ADD:是解压,.tar .tar.gz .zip 根据URL进行文件下载,复制(官方解释:同样是复制,推荐使用COPY)

ADD不能复制压缩文件。使用COPY

COPY:只能复制,复制本地文件到容器

[root@docker1 test1]# vim Dockerfile 
[root@docker1 test1]# docker build -t centos:test .
[root@docker1 test1]# docker run -it centos:test
[root@7210bf0ada16 /]# cd /opt
[root@7210bf0ada16 opt]# ls
Centos-7.repo
​
7、工作目录和环境变量以及容器卷(挂载卷)

WORKDIR

工作目录:切换到容器内的指定目录

ENV

环境变量:添加一个PATH

VOLUME

容器卷:

8、EXPOSE

指定端口

#使用yum安装定制一个nginx

#用docker容器安装nginx,也就是把命令行的命令写在脚本里,执行自动创建
[root@docker1 test1]# vim Dockerfile 
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"]      
CMD ["nginx","-g","daemon off;"]       #后台运行
​
#执行脚本
[root@docker1 test1]# docker build -t nginx:test .
#创建容器
[root@docker1 test1]# docker run -itd --name nginx1 nginx:test 
ae8d0872cc1418d950e72e16dcc56affca425cb7e7d3457a2810ea8293ae8b31
[root@docker1 test1]# docker ps
CONTAINER ID   IMAGE        COMMAND       CREATED         STATUS         PORTS     NAMES
ae8d0872cc14   nginx:test   "/bin/bash"   4 seconds ago   Up 3 seconds   80/tcp    nginx1
#进入容器
[root@docker1 test1]# docker exec -it nginx1 bash
[root@ae8d0872cc14 nginx]# cd /usr/share/nginx/html/
[root@ae8d0872cc14 html]# ll
total 12
-rw-r--r--. 1 root root 3650 Nov 10  2022 404.html
-rw-r--r--. 1 root root 3693 Nov 10  2022 50x.html
lrwxrwxrwx. 1 root root   20 Aug 15 06:14 en-US -> ../../doc/HTML/en-US
drwxr-xr-x. 2 root root   27 Aug 15 07:10 icons
lrwxrwxrwx. 1 root root   18 Aug 15 06:14 img -> ../../doc/HTML/img
lrwxrwxrwx. 1 root root   25 Aug 15 06:14 index.html -> ../../doc/HTML/index.html
-rw-r--r--. 1 root root  368 Nov 10  2022 nginx-logo.png
lrwxrwxrwx. 1 root root   14 Aug 15 06:14 poweredby.png -> nginx-logo.png
#查看ip,访问,因为容器使用CMD被覆盖所以没有运行起来
[root@docker1 test1]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
172.17.0.2
[root@docker1 test1]# curl 172.17.0.2
curl: (7) Failed connect to 172.17.0.2:80; 拒绝连接
​
​
#当脚本把CMD换成ENTRYPOINT的情况
[root@docker1 test1]# vim Dockerfile 
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"]      
CMD ["nginx","-g","daemon off;"]       #后台运行
​
#执行脚本
[root@docker1 test1]# docker build -t nginx:test .
#创建容器
[root@docker1 test1]# docker run -itd --name nginx1 nginx:test 
ae8d0872cc1418d950e72e16dcc56affca425cb7e7d3457a2810ea8293ae8b31
#查看容器运行状态
[root@docker1 test1]# docker ps
CONTAINER ID   IMAGE        COMMAND       CREATED         STATUS         PORTS     NAMES
ae8d0872cc14   nginx:test   "/bin/bash"   4 seconds ago   Up 3 seconds   80/tcp    nginx1
#进入容器
[root@docker1 test1]# docker exec -it nginx1 bash
[root@ae8d0872cc14 nginx]# cd /usr/share/nginx/html/
[root@aad7eaf37740 html]# ll
total 12
-rw-r--r--. 1 root root 3650 Nov 10  2022 404.html
-rw-r--r--. 1 root root 3693 Nov 10  2022 50x.html
lrwxrwxrwx. 1 root root   20 Aug 15 07:49 en-US -> ../../doc/HTML/en-US
drwxr-xr-x. 2 root root   27 Aug 15 08:45 icons
lrwxrwxrwx. 1 root root   18 Aug 15 07:49 img -> ../../doc/HTML/img
lrwxrwxrwx. 1 root root   25 Aug 15 07:49 index.html -> ../../doc/HTML/index.html
-rw-r--r--. 1 root root  368 Nov 10  2022 nginx-logo.png
lrwxrwxrwx. 1 root root   14 Aug 15 07:49 poweredby.png -> nginx-logo.png
[root@aad7eaf37740 html]# ls   
404.html  50x.html  en-US  icons  img  index.html  nginx-logo.png  poweredby.png
#创建新的软连接(因为此时软连接报错403)
[root@aad7eaf37740 html]# rm -rf index.html 
[root@aad7eaf37740 html]# echo 123 > index.html
#获取docker容器的ip
[root@docker2 opt]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
172.17.0.3
#访问连接成功,获取信息
[root@docker2 opt]# curl 172.17.0.3
123
​

1

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com