• dockerfile来构建自己的docker镜像


    DockerFile介绍

    dockerfile是用来构建docker镜像的文件!命令参数脚本!

    构建步骤:

    1、 编写一个dockerfile文件

    2、 docker build 构建称为一个镜像

    3、 docker run运行镜像

    4、 docker push发布镜像(DockerHub 、阿里云仓库)
    链接地址:https://hub.docker.com/_/centos
    在这里插入图片描述

    点击后跳到一个Dockerfile

    在这里插入图片描述

    很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

    官方既然可以制作镜像,那我们也可以!

    DockerFile构建过程

    基础知识

    1、每个保留关键字(指令)都是必须是大写字母

    2、执行从上到下顺序

    3、#表示注释

    4、每一个指令都会创建提交一个新的镜像层,并提交!

    在这里插入图片描述

    Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

    Docker镜像逐渐成企业交付的标准,必须要掌握!

    步骤:开发、运维

    DockerFile:构建文件,定义了一切的步骤,源代码

    DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。

    Docker容器:容器就是镜像运行起来提供服务。

    DockerFile的指令

    FROM				# from:基础镜像,一切从这里开始构建
    MAINTAINER			# maintainer:镜像是谁写的, 姓名+邮箱
    RUN					# run:镜像构建的时候需要运行的命令
    ADD					# add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
    WORKDIR				# workdir:镜像的工作目录
    VOLUME				# volume:挂载的目录
    EXPOSE				# expose:保留端口配置
    CMD					# cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT			# entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD				# onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
    COPY				# copy:类似ADD,将我们文件拷贝到镜像中
    ENV					# env:构建的时候设置环境变量!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    实战测试

    scratch 镜像

    FROM scratch
    ADD centos-7-x86_64-docker.tar.xz /
    
    LABEL \
        org.label-schema.schema-version="1.0" \
        org.label-schema.name="CentOS Base Image" \
        org.label-schema.vendor="CentOS" \
        org.label-schema.license="GPLv2" \
        org.label-schema.build-date="20201113" \
        org.opencontainers.image.title="CentOS Base Image" \
        org.opencontainers.image.vendor="CentOS" \
        org.opencontainers.image.licenses="GPL-2.0-only" \
        org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
    
    CMD ["/bin/bash"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Docker Hub 中 99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建。

    在这里插入图片描述

    创建一个自己的centos

    1./home下新建dockerfile目录

    $ mkdir dockerfile
    
    • 1

    2.dockerfile目录下新建mydockerfile-centos文件

    $ vim mydockerfile-centos
    
    • 1

    3.编写Dockerfile配置文件

    FROM centos:7						# 基础镜像是官方原生的centos
    MAINTAINER hxl<16498914561@qq.com> 	# 作者  我这里是随便写的,你要写就写自己的
    
    ENV MYPATH /usr/local				# 配置环境变量的目录 
    WORKDIR $MYPATH						# 将工作目录设置为 MYPATH
    
    RUN yum -y install vim				# 给官方原生的centos 增加 vim指令
    RUN yum -y install net-tools		# 给官方原生的centos 增加 ifconfig命令
    
    
    EXPOSE 80							# 暴露端口号为80
    
    CMD echo $MYPATH					# 输出下 MYPATH 路径
    CMD echo "-----end----"				
    CMD /bin/bash						# 启动后进入 /bin/bash
    
    #保存 :wq
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4.通过这个文件构建镜像

    # 命令: docker build -f 文件路径 -t 镜像名:[tag] .
    $ docker build -f mydockerfile-centos -t mycentos:0.1 .
    
    • 1
    • 2

    如果有问题可以参考一下解决方案 https://www.jianshu.com/p/ebd80c7402ea

    5.出现Successfully built XXX以及Successfully tagged mycentos:0.1 后则构建成功

    6.查看镜像

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mycentos            0.1                 vf5ds97t9h3j        5 minutes ago       375MB
    
    • 1
    • 2
    • 3

    7.测试运行

    $ docker run -it mycentos:0.1 		# 注意带上版本号,否则每次都回去找最新版latest
    
    $ pwd	
    /usr/local							# 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致
    $ vim								# vim 指令可以使用
    $ ifconfig     						# ifconfig 指令可以使用
    
    # docker history 镜像id 查看镜像构建历史步骤
    $ docker history 镜像id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    我们平时拿到一个镜像,可以用 “docker history 镜像id” 研究一下是什么做的

    CMD 和 ENTRYPOINT区别

    CMD					# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
    ENTRYPOINT			# 指定这个容器启动的时候要运行的命令,可以追加命令
    
    • 1
    • 2

    测试cmd

    # 编写dockerfile文件
    $ vim dockerfile-test-cmd
    FROM centos
    CMD ["ls","-a"]					# 启动后执行 ls -a 命令
    
    # 构建镜像
    $ docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .
    
    # 运行镜像
    $ docker run cmd-test:0.1		# 由结果可得,运行后就执行了 ls -a 命令
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    
    # 想追加一个命令  -l 成为ls -al:展示列表详细数据
    $ docker run cmd-test:0.1 -l
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
    executable file not found in $PATH": unknown.
    ERRO[0000] error waiting for container: context canceled 
    
    # cmd的情况下 -l 替换了CMD["ls","-l"] 而 -l  不是命令所以报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    测试ENTRYPOINT

    # 编写dockerfile文件
    $ vim dockerfile-test-entrypoint
    FROM centos
    ENTRYPOINT ["ls","-a"]
    
    # 构建镜像
    $ docker build  -f dockerfile-test-entrypoint -t cmd-test:0.1 .
    
    # 运行镜像
    $ docker run entrypoint-test:0.1
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
    lost+found ...
    
    # 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的
    $ docker run entrypoint-test:0.1 -l
    total 56
    drwxr-xr-x   1 root root 4096 May 16 06:32 .
    drwxr-xr-x   1 root root 4096 May 16 06:32 ..
    -rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
    lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
    drwxr-xr-x   5 root root  340 May 16 06:32 dev
    drwxr-xr-x   1 root root 4096 May 16 06:32 etc
    drwxr-xr-x   2 root root 4096 May 11  2019 home
    lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
    lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    Dockerfile中很多命令都十分的相似,最好的学习就是对比它们然后测试效果!

  • 相关阅读:
    【强化学习】10 —— DQN算法
    (免费分享)基于springboot医院管理系统
    【面试 - 八股文】Linux 高频面试题,助你吊打面试官系列
    Java根据ip地址获取归属地
    表白爱心代码
    Linux基础学习笔记(十二)——管道命令
    C++ Reference: Standard C++ Library reference: C Library: cwchar: wcsftime
    常见的 NoSQL 数据库有哪些?
    Postman API测试工具的使用
    由阿里三位专家撰写:数据库高效优化:架构、规范SQL技巧文档
  • 原文地址:https://blog.csdn.net/qq_43585922/article/details/126009255