• Dockerfile实现容器镜像的自定义及生成


    一.Dockerfile介绍

    Dockerfile是一种能够被Docker程序解释的剧本。Dockerfile由一条一条指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器镜像中指定自己额外的需求时,只需要在Dockerfile上添加和修改指令,然后通过docker build生成我们自定义的容器镜像(image)

    二.Dockerfile指令

    1.构建类指令

    用于构建image,其指定的操作不会在运行image的容器上运行

    FROM MAINTAINER RUN ENV ADD COPY

    2. 设置类指令

    用于设置image的属性,其指定的指令将在运行的image的容器中执行

    CMD ENTRYPOINT USER VOLUME WORKDIR ONBUILD EXPOSE

    指令说明

     1.FROM

    1. FROM <image>:<tag>
    2. FROM centos:latest

    2.RUN

    RUN指令用于构建镜像中执行命令,有以下两种格式

    shell格式

    1. RUN <命令>
    2. RUN echo 'kunkun' > /var/www/html/index.html

    exec格式

    1. RUN ["可执行文件","参数1","参数2"]
    2. RUN ["/bin/bash","-C","echo kubkub > /var/www/html/index.html"]

    注意:如果有多条RUN指令,应该用&&连接,方便查看

     3.CMD

    CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时索要执行的命令
    格式有三种

    1. CMD ["executable","param1","param2"]
    2. CMD ["param1","param2"]
    3. CMD command param1 param2

    一个在物理机中执行,一个在容器中执行

    每个Dockerfile只能有一条CMD指令,如果有多条CMD指令,只有最后一条会被执行;

    如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令

    什么是启动容器时指定运行的命令

    docker run -d -p 80:80 镜像名 运行的命令

    4.EXPOSE

    EXPOSE指令用于指定容器在运行时监听的端口

    1. EXPOSE <port> [<port> ....]
    2. 如 EXPOSE 80 3306 8080

    上述运行的端口还需要使用docker run运行容器时通过 -p 映射到宿主机的端口

    5.ENV

    ENV指令用于指定一个环境变量

    1. 格式:ENV <key> <value> 或者 ENV <key>=<value>
    2. 例: ENV JAVA_HOME /usr/local/jdkxxx/

    6.ADD

    ADD指令用于把宿主机上的文件拷贝到镜像中

    1. ADD <src> <dest>
    2. <src> 可以是本地文件或本地压缩文件吗,也可以是一个url
    3. <dest>路径填写可以是容器内的绝对路径,也可以是相对于工作路径的相对路径

    7.COPY

    COPY指令与ADD指令类似,但COPY的源文件只能是本地文件

    COPY <src> <dest>

    8.ENTRYPOINT

    ENTRYPOINT和CMD非常类似

    相同点:一个Dockerfile只写一条,如果写了多条,只有最后一条生效;

    都是容器启动时才运行

    不同点:如果用户启动容器时候指定了运行命令,ENTRYPOINT不会被运行的命令覆盖而CMD会被覆盖

    1. ENTRYPOINT ["executable","param1","param2"]
    2. ENTRYPOINT command param1 param2

    9.VOLUME

    VOLUME指令用于把宿主机里的目录与容器里的目录映射

    只指定挂载点,docker宿主机映射的目录为自动生成的

    VOLUME [""]

    10.USER

    USER指令设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID

    1. USER daemon
    2. USER 1001

    11.WORKDIR

    WORKDIR指令设置工作目录,类似与cd命令。不建议使用 RUN cd /root ,建议使用WORKDIR

    WORKDIR /root

    三.Dockerfile基本构成

    基础镜像信息:如 centos:latest

    维护者信息:出问题了该找谁

    镜像操作指令:在容器中执行的命令,通常为linux的操作命令

    容器启动时执行指令:如CMD

    1.Dockerfile生成容器镜像方法

     

     拿到Dokerfile文件后,先build生成image,然后用run根据image生成容器

    2.使用dockerfile生成容器镜像案例

    第一步:创建一个文件夹

    第二步:在文件夹中创建Dockerfile文件及其他文件

    第三步:使用docker build命令构建镜像

    第四步:使用构建的镜像启动容器

    以Dockerfile生成Nginx容器镜像为例

    1. mkdir nginxroot
    2. cd nginxroot
    3. echo "nginx's running" > index.html
    4. vim Dockerfile

    Dockerfile文件中的内容 

    注意:#先下载wget再使用

    1. FROM centos:centos7
    2. MAINTAINER "www.kubemsb.com"
    3. #先安装wget再使用
    4. RUN yum -y install wget
    5. RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    6. RUN yum -y install nginx
    7. ADD index.html /usr/share/nginx/html/
    8. #给容器一个进程,使容器处于运行状态
    9. RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    10. EXPOSE 80
    11. #启动nginx
    12. CMD /usr/sbin/nginx

    根据Dockerfile生成文件

    1. docker build -t centos7-nginx:v1 .
    2. 注意: 如果文件名字不为Dockerfile则命令结尾的 . 应该换成 -f 来指定文件

     根据镜像生成容器

    docker run -p 10002:80 -d centos7-nginx:v1

    然后就可以访问物理机的10002端口来进行访问容器

  • 相关阅读:
    java之日期相关
    动态顺序表C++实现
    实现paho.mqtt.cpp库编译
    静态链表(及其两个例题)
    string转float显示位数有误;cout 的 precision 成员函数
    vue3学习笔记--1.
    RHCE8 资料整理(二)
    基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)
    C++设计实现日志系统
    Kibana Query Language (KQL)
  • 原文地址:https://blog.csdn.net/qq_44418229/article/details/126947992