当前位置: 首页 > news >正文

dockerfile自定义镜像

目录

概念

基于dockerfile创建

dockerfile的命令

构建容器

FROM

ENTRYPOINT和CMD

RUN

COPY和ADD

工作目录和环境变量以及容器卷(挂载卷)

EXPOSE

实战


概念

dockerfile就是自定义镜像,通过dockerfile创建的都是镜像,而不是容器。

创建镜像的方式:

1.dockerfile 最基本的方式、最常用的方式

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

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

基于dockerfile创建

dockerfile用的是联合文件系统UnionFS。这个是docker镜像的基础,镜像是通过分层来进行集成。基于UnionFS这个基础可以制作各种具体的应用镜像。

UnionFS特性:一次性同时的加载多个文件系统,但是从外面看只能看到一个文件系统。它的特点:文件系统叠加。

镜像的分层:它是由一层一层的文件系统组成的

UnionFS是由rootfs 根文件系统和bootfs 引导文件系统组成的。

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

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

dockerfile底层逻辑图:

dockerfile定制化镜像:定制每一层需要添加的配置和文件,也就是把每一层的安装、修改、构建和操作都写入一个脚本,然后用脚本来进行创建镜像。这个脚本就是dockerfile。

创建dockerfile脚本,vim Dockerfile 识别默认名称

每一个镜像我们都会给他单独创建一个目录,然后在这个目录下创建单独的Dockerfile脚本

dockerfile分为四个部分:

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

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

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

4.容器启动时执行的命令

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

dockerfile的命令

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

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

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

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

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

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

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

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

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

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

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

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

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

ARG:主要是用来传参,是用户传递的参数,比如:/bin/bash就是ARG。而ENV是容器内部的变量。

构建容器

命令:docker build -t centos:test .

FROM

格式:FROM centos:7

ENTRYPOINT和CMD

格式:ENTRYPOINT ["ls","/etc"]

           CMD ["ls","/usr"]

ENTRYPOINT有多个的情况下,只会运行最后一个

CMD有多个的情况下,也只会运行最后一个

CMD和ENTRYPOINT同时存在时,命令都会执行。ENTRYPOINT会覆盖CMD的命令并且CMD会把命令作为参数传给ENTRYPOINT

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

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

RUN

RUN的作用是在基础镜像运行然后把结果传给新镜像

RUN的结构要合理,不要太多,否则镜像就会很大。

格式:RUN ls /opt && ls /etc && ls /usr

RUN命令的优化:写一起中间用&&

&&  表示前一个指令成功才会执行下一个

;   表示不管前面的命令是否成功,后一个都会执行

| |    表示前一个失败了,后面才会执行

\      表示把一个命令分成多个行,提高可读性

COPY和ADD

ADD主要作用是解压,比如:.tar  .gz .zip 。还可以根据URL进行文件下载,还可以复制(但是一般不用,官方解释:同样是复制,推荐使用copy)。ADD不能复制压缩文件。

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

ADD和COPY:解压或者复制文件都必须和Dockerfile这个脚本在同一个目录下。

格式:ADD 文件名 /opt    (解压)

           COPY test1.txt /opt/test/   (复制)

           ADD http://mirrors.aliyun.com/repo/Centos-7.repo /opt/Centos-7.repo (在线下载)

工作目录和环境变量以及容器卷(挂载卷)

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

ENV 环境变量:添加一个PATH(可以让系统识别到命令)

VOLUME

格式: WORKDIR /opt

           ENV PATH /opt/test:$PATH

           VOLUME ["/opt/test"] (默认的容器内的挂载点,外部不是必须和这个挂载,其他容器可以和这个进行挂载)

EXPOSE

格式:EXPOSE 指定端口

实战

实战:使用yum安装定制一个nginx,首先我们要先创建一个镜像,里面基础镜像是centos7,里面的服务是nginx

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;"]
 

整个步骤:

cd /opt/

mkdir test

cd test/

vim Dockerfile

FROM centos:7RUN rm -rf /etc/yum.repos.d/*ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/Centos-7.repoRUN yum -y install epel-release && \yum -y install nginxEXPOSE 80WORKDIR /var/log/nginx/VOLUME ["/usr/share/nginx/html"]CMD ["nginx","-g","daemon off;"]

docker build -t nginx:test .

docker run -itd --name nginx1 nginx:test

docker exec -it nginx1 bash

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1

curl 172.17.0.2

设置挂载卷

docker run -itd --name nginx2 -v /opt/html:/usr/share/nginx/html nginx:test

docker run -itd --name nginx3 --volumes-from nginx2 nginx:test

http://www.lryc.cn/news/424959.html

相关文章:

  • 【工作状态】如何保持专注?
  • 欧科云链研究院对话:风浪越大鱼越贵—链上数据洞悉加密市场规律
  • SQLite库笔记:日期和时间函数
  • Linux开发板运行报错/system/bin/sh: can‘t create /dev/leds: Permission denied
  • 月薪5W的项目经理是如何面试的?这份面试攻略请收好!
  • 接口隔离原则
  • 【C++ 面试 - 基础题】每日 3 题(十六)
  • 端到端测试自动化:使用JavaScript打造可靠的Web应用
  • 『大模型笔记』基于LLM生成真实世界数据的合成问答数据!
  • 一个使用Python和`scikit-learn`库实现KMeans聚类算法的简单示例
  • 记录一下vue2和vue3中如何配置keep-alive及写法上的差异
  • 面试题:Rabbitmq怎么保证消息的可靠性?
  • 性能测试工具之JMeter
  • SQL Zoo 9-.Window functions
  • 智能化清理C盘的方法 小白也可以轻松清理C盘了 不再担心误删文件
  • 在c#中常用的特性
  • Polars简明基础教程十二:可视化(二)
  • python 使用正则表达式判断图片路径是否是超链接
  • 【学习笔记】Day 14
  • 使用SSL认证访问操作手册
  • 网络协议 十一 ARP,RARP,icmp,websocket,webservice,HTTPDNS,FTP,邮件相关的协议, SMTP,POP,IMAP
  • 浏览器插件利器--allWebPluginV2.0.0.16-Stable版发布
  • 设计模式22-迭代器模式
  • 编程深水区之并发⑥:C#的线程池
  • KCTF 闯关游戏:1 ~ 7 关
  • 【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(二)
  • 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源?
  • SQLALchemy 自动从数据库中映射
  • C++ stack与queue的使用与简单实现
  • 【CS.DB】数据库-关系型数据库-MySQL-3.3.创建和管理表