dockerfile

反转基因福娃  金牌会员 | 2024-8-16 14:41:05 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 560|帖子 560|积分 1680

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的区别(重点)
  1. ENTRYPOINT:有多个的情况下,只会运行最后一个
  2. [root@docker1 test1]# vim Dockerfile
  3. FROM centos:7
  4. ENTRYPOINT ["ls","/etc"]
  5. ENTRYPOINT ["ls","/usr"]
  6. #执行脚本
  7. [root@docker1 test1]# docker build -t centos:test .
  8. [root@docker1 test1]# docker run -it --name test2 centos:test
  9. bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
  10. [root@docker1 test1]# ls /usr/
  11. bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
复制代码
2、CMD:

有多个也是运行最后一个
  1. [root@docker1 test1]# vim Dockerfile
  2. FROM centos:7
  3. CMD ["ls","/etc"]
  4. CMD ["ls","/usr"]
  5. #执行脚本
  6. [root@docker1 test1]# docker build -t centos:test .
  7. [root@docker1 test1]# docker run -it --name test3 centos:test
  8. bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
  9. [root@docker1 test1]# ls /usr/
  10. bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
复制代码
3、CMD和ENTRYPOINT同时存在,

命令都会实验,但是ENTRYPOINT会覆盖CMD的命令,并且CDM会把命令作为参数传给ENTRYPOINT
  1. [root@docker1 test1]# vim Dockerfile
  2. FROM centos:7
  3. ENTRYPOINT ["ls","/etc"]
  4. CMD ["ls","/usr"]
  5. #执行脚本
  6. [root@docker1 test1]# docker build -t centos:test .
  7. [root@docker1 test1]# docker run -it --name test2 centos:test
  8. ls: cannot access ls: No such file or directory
  9. /etc:
  10. BUILDTIME        gshadow        openldap        sasl2
复制代码
4、总结:

作为容器启动时实验命令的语句,一般情况下二者是通用的,但是在传参的情况下,需要加上CMD,如果没有特殊的操作(传参),写一个CMD或者ENTRYPOINT即可,二者不要同时存在
CMD作为启动命令,运行容器时传了额外的参数,CMD会被覆盖不会被实验;ENTRYPOINT不会被覆盖,容器运行的命令相称于给ENTRYPOINT传参。
5、RUN

RUN在底子镜像运行然后把结果传给新镜像。
RUN的结构要合理,不要太多,
  1. root@docker1 test1]# vim Dockerfile
  2. FROM centos:7
  3. RUN ls /opt && ls /etc && ls /usr
  4. #&&前一个指令成果才会执行下一个
  5. RUN Ls /opt ; ls /etc ; ls /usr
  6. #也可以用分号;前一个不管成不成功,后一个都会执行
  7. RUN Ls /opt || ls /etc || ls /usr
  8. #||:前面一个失败了才会执行
  9. RUN ls /opt && \
  10.    ls /etc && \
  11.    ls /usr
  12. #\把一个命令分成多个行,提高可读性
复制代码
6、COPY和ADD

ADD:是解压,.tar .tar.gz .zip 根据URL进行文件下载,复制(官方解释:同样是复制,推荐使用COPY)
ADD不能复制压缩文件。使用COPY
COPY:只能复制,复制当地文件到容器
  1. [root@docker1 test1]# vim Dockerfile
  2. [root@docker1 test1]# docker build -t centos:test .
  3. [root@docker1 test1]# docker run -it centos:test
  4. [root@7210bf0ada16 /]# cd /opt
  5. [root@7210bf0ada16 opt]# ls
  6. Centos-7.repo
复制代码
7、工作目次和环境变量以及容器卷(挂载卷)

WORKDIR
工作目次:切换到容器内的指定目次
ENV
环境变量:添加一个PATH
VOLUME
容器卷:
8、EXPOSE

指定端口

#使用yum安装定制一个nginx
  1. #用docker容器安装nginx,也就是把命令行的命令写在脚本里,执行自动创建
  2. [root@docker1 test1]# vim Dockerfile
  3. FROM centos:7
  4. RUN rm -rf /etc/yum.repos.d/*
  5. ADD  http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/Centos-7.repo
  6. RUN yum -y install epel-release && \
  7.    yum -y install nginx
  8. EXPOSE 80
  9. WORKDIR /var/log/nginx/              
  10. VOLUME ["/usr/share/nginx/html"]      
  11. CMD ["nginx","-g","daemon off;"]       #后台运行
  12. #执行脚本
  13. [root@docker1 test1]# docker build -t nginx:test .
  14. #创建容器
  15. [root@docker1 test1]# docker run -itd --name nginx1 nginx:test
  16. ae8d0872cc1418d950e72e16dcc56affca425cb7e7d3457a2810ea8293ae8b31
  17. [root@docker1 test1]# docker ps
  18. CONTAINER ID   IMAGE        COMMAND       CREATED         STATUS         PORTS     NAMES
  19. ae8d0872cc14   nginx:test   "/bin/bash"   4 seconds ago   Up 3 seconds   80/tcp    nginx1
  20. #进入容器
  21. [root@docker1 test1]# docker exec -it nginx1 bash
  22. [root@ae8d0872cc14 nginx]# cd /usr/share/nginx/html/
  23. [root@ae8d0872cc14 html]# ll
  24. total 12
  25. -rw-r--r--. 1 root root 3650 Nov 10  2022 404.html
  26. -rw-r--r--. 1 root root 3693 Nov 10  2022 50x.html
  27. lrwxrwxrwx. 1 root root   20 Aug 15 06:14 en-US -> ../../doc/HTML/en-US
  28. drwxr-xr-x. 2 root root   27 Aug 15 07:10 icons
  29. lrwxrwxrwx. 1 root root   18 Aug 15 06:14 img -> ../../doc/HTML/img
  30. lrwxrwxrwx. 1 root root   25 Aug 15 06:14 index.html -> ../../doc/HTML/index.html
  31. -rw-r--r--. 1 root root  368 Nov 10  2022 nginx-logo.png
  32. lrwxrwxrwx. 1 root root   14 Aug 15 06:14 poweredby.png -> nginx-logo.png
  33. #查看ip,访问,因为容器使用CMD被覆盖所以没有运行起来
  34. [root@docker1 test1]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
  35. 172.17.0.2
  36. [root@docker1 test1]# curl 172.17.0.2
  37. curl: (7) Failed connect to 172.17.0.2:80; 拒绝连接
  38. #当脚本把CMD换成ENTRYPOINT的情况
  39. [root@docker1 test1]# vim Dockerfile
  40. FROM centos:7
  41. RUN rm -rf /etc/yum.repos.d/*
  42. ADD  http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/Centos-7.repo
  43. RUN yum -y install epel-release && \
  44.    yum -y install nginx
  45. EXPOSE 80
  46. WORKDIR /var/log/nginx/              
  47. VOLUME ["/usr/share/nginx/html"]      
  48. CMD ["nginx","-g","daemon off;"]       #后台运行
  49. #执行脚本
  50. [root@docker1 test1]# docker build -t nginx:test .
  51. #创建容器
  52. [root@docker1 test1]# docker run -itd --name nginx1 nginx:test
  53. ae8d0872cc1418d950e72e16dcc56affca425cb7e7d3457a2810ea8293ae8b31
  54. #查看容器运行状态
  55. [root@docker1 test1]# docker ps
  56. CONTAINER ID   IMAGE        COMMAND       CREATED         STATUS         PORTS     NAMES
  57. ae8d0872cc14   nginx:test   "/bin/bash"   4 seconds ago   Up 3 seconds   80/tcp    nginx1
  58. #进入容器
  59. [root@docker1 test1]# docker exec -it nginx1 bash
  60. [root@ae8d0872cc14 nginx]# cd /usr/share/nginx/html/
  61. [root@aad7eaf37740 html]# ll
  62. total 12
  63. -rw-r--r--. 1 root root 3650 Nov 10  2022 404.html
  64. -rw-r--r--. 1 root root 3693 Nov 10  2022 50x.html
  65. lrwxrwxrwx. 1 root root   20 Aug 15 07:49 en-US -> ../../doc/HTML/en-US
  66. drwxr-xr-x. 2 root root   27 Aug 15 08:45 icons
  67. lrwxrwxrwx. 1 root root   18 Aug 15 07:49 img -> ../../doc/HTML/img
  68. lrwxrwxrwx. 1 root root   25 Aug 15 07:49 index.html -> ../../doc/HTML/index.html
  69. -rw-r--r--. 1 root root  368 Nov 10  2022 nginx-logo.png
  70. lrwxrwxrwx. 1 root root   14 Aug 15 07:49 poweredby.png -> nginx-logo.png
  71. [root@aad7eaf37740 html]# ls  
  72. 404.html  50x.html  en-US  icons  img  index.html  nginx-logo.png  poweredby.png
  73. #创建新的软连接(因为此时软连接报错403)
  74. [root@aad7eaf37740 html]# rm -rf index.html
  75. [root@aad7eaf37740 html]# echo 123 > index.html
  76. #获取docker容器的ip
  77. [root@docker2 opt]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
  78. 172.17.0.3
  79. #访问连接成功,获取信息
  80. [root@docker2 opt]# curl 172.17.0.3
  81. 123
复制代码
1

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表