• Docker——dockerfile


    1. dockerFile介绍

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

      步骤:

      • 编写dockerFile文件
      • docker build构建成为一个镜像
      • docker run运行镜像
      • docker push发布镜像(DockerHub,阿里云镜像仓库)

      查看官方制作的dockerFile

      • 在hub.docker上搜索centos

      • 选择某个版本的centos,随后跳转到github上

      •   
        FROM scratch  #最底层
        ADD centos-8-x86_64.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="20200809"
        CMD ["/bin/bash"]
        

      dockerFile与dockerImages,docker容器的关系:

      • dockerFile用于构建生成镜像,也就是最终发布和运行的产品
      • docker容器是docker镜像实际运行的一个个独立的服务

      基础知识:

      • 每个保留关键字(指令)都必须是大写字母
      • 执行从上到下顺序执行
      • #表示注释
      • 每一个指令都会创建提交一个新的镜像层
    2. dockerFIle指令

      FROM         # 基础镜像
      MAINTAINER   # 维护者信息(姓名+邮箱)
      RUN          # 镜像构建时的命令
      ADD          # 需要添加的其它环境,如:tomcat压缩包,会自动解压
      WORKDIR		 # 镜像的工作目录(如一开始就进入的目录)
      VOLUME       # 需要挂载的目录
      EXPOSE       # 暴露端口(可以替代-p)
      CMD          # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代(即从外部调用docker run指令且携带参数时,参数会替代dockerFile中的指令)
      ENTRYPOINT   # 指定容器启动的时候要运行的命令,可以追加命令(与上面的不同,不会被替代,而是追加)
      ONBUILD      # 当构建一个被继承DockerFile的时候,会运行ONBUILD的指令
      COPY         # 类似ADD,当我们文件拷贝到镜像中
      ENV          # 构建的时候设置环境变量
      

      测试:

      #1,编写dockerFile文件
      FROM centos              #基于centos构建
      MAINTAINER arno<1143037783@qq.com>
      ENV MYPATH /user/local   #设置环境变量
      WORKDIR $PATH            #设置工作目录
      RUN yum -y install vim   #RUN命令应该是在镜像构建的时候运行的,添加了一些新功能
      RUN yum -y install net-tools
      EXPOSE 80                #暴露的端口
      CMD echo $MYPATH
      CMD echo "---end---"
      CMD /bin/bash
      
      #2.构建镜像
      [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f mydockerfile -t newcentos .
      
      #3.查看镜像
      [root@iZwz908j8pbqd86doyrez5Z test]# docker images
      REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
      newcentos             latest              ded9efb6e766        3 minutes ago       295MB
      
      #4.运行镜像
      [root@iZwz908j8pbqd86doyrez5Z test]# docker run -P -d -it newcentos
      [root@iZwz908j8pbqd86doyrez5Z test]# docker ps
      CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
      4ce4eebf72f9        newcentos           "/bin/sh -c /bin/bash"   7 seconds ago       Up 7 seconds        0.0.0.0:32773->80/tcp   sad_ride  #可以看到运行的是80端口
      [root@iZwz908j8pbqd86doyrez5Z test]# docker attach 4ce4eebf72f9
      [root@4ce4eebf72f9 local]#            #可以看到进入的是/usr/local这一工作目录
      [root@4ce4eebf72f9 local]# ifconfig   #成功在基础的centos上添加了一些新功能(RUN)
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 172.17.0.10  netmask 255.255.0.0  broadcast 172.17.255.255
              ether 02:42:ac:11:00:0a  txqueuelen 0  (Ethernet)
              RX packets 0  bytes 0 (0.0 B)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 0  bytes 0 (0.0 B)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
      lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
              inet 127.0.0.1  netmask 255.0.0.0
              loop  txqueuelen 1000  (Local Loopback)
              RX packets 0  bytes 0 (0.0 B)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 0  bytes 0 (0.0 B)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
      
      #5.查看镜像固构建的历史
      [root@iZwz908j8pbqd86doyrez5Z test]# docker history newcentos
      IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
      ded9efb6e766        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
      345196631c6a        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
      86451430c08f        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
      11948d022259        12 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B                  
      99c8922d054b        12 minutes ago      /bin/sh -c yum -y install net-tools             22.8MB              
      b43f395d0d9e        12 minutes ago      /bin/sh -c yum -y install vim                   57.2MB              
      c973079ba70d        13 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
      ff143e3cb146        13 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
      eee54c129432        13 minutes ago      /bin/sh -c #(nop)  MAINTAINER arno<114303778…   0B                  
      0d120b6ccaa8        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
      <missing>           4 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
      <missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB
      

      docker history:查看镜像的变更历史(构建过程,配置参数)

    3. CMD命令与ENTRYPOINT区别

      比较思路,cmd中的“ls -a”可以列出所有的目录,"ls -al"可以列出所有目录的详细信息.我们分别用CMD和ENTRYPOINT命令构建镜像,然后在运行容器时尝试添加"-l参数",查看运行结果

      (1).CMD

      #1.编写dockerfile文件
      FROM centos
      CMD ["ls","-a"]  #复杂命令用[]包裹
      
      #2.构建镜像
      [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest1 -t dockerfiletest1 .
      
      #3.运行容器
      [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest1
      .
      ..
      ...
      
      #4.尝试添加参数运行——失败,因为没有"ls -l"指令
      [root@iZwz908j8pbqd86doyrez5Z test]# docker run -l dockerfiletest1
      "docker run" requires at least 1 argument.
      

      (2).ENTRYPOINT

      #1.编写dockerfile文件
      FROM centos
      ENTRYPOINT ["ls","-a"]  #复杂命令用[]包裹
      
      #2.构建镜像
      [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest2 -t dockerfiletest1 .
      
      #3.运行容器
      [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2
      .
      ..
      ...
      
      #4.尝试添加参数运行
      [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 -l
      total 56
      drwxr-xr-x   1 root root 4096 Sep 13 01:17 .
      ...
      

      区别:

      • docker run的命令的参数是覆盖CMD指令的参数
      • docker run的命令的参数是追加ENTRYPOINT指令的参数后
    4. 使用duockerfile制作Tomcat镜像(最难的一部分)

      准备工作:tomcat压缩包,jdk压缩包

      #1.编写Dockerfile文件
      FROM centos
      MAINTAINER arno<1143037783@qq.com>
      
      COPY readme.txt /usr/local/readme.txt  #添加readme目录
      
      ADD jdk-8u261-linux-x64.tar.gz /usr/local/  #添加安装包,会自动解压
      ADD apache-tomcat-9.0.37.tar.gz /usr/local/  #这里路径最后应该有"/"
      
      RUN yum -y install vim
      
      ENV MYPATH /usr/local  #工作目录(用户一开始进入的目录)
      WORKDIR $MYPATH
      
      ENV JAVA_HOME /usr/local/jdk1.8.0_261
      ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37  #centos环境变量
      ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37  #绝对路径
      ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
      
      EXPOSE 8080
      
      CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out  #启动apache,同时输出日志文件
      
      #2.构建镜像
      docker build -t arno-tomcat .  #因为dockerfile文件名为Dockerfile,所以省略了-f
      
      #3.运行容器
      docker run -d -it -p 9090:8080 -v /usr/arno/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/ROOT -v /usr/arno/tomcat/log:/usr/local/apache-tomcat-9.0.37/logs arno-tomcat #挂载tomcat的对外展示页面以及日志的目录
      
      #4.测试端口
      curl localhost:38775
      
      • 需要准备tar.gz压缩包,这边犯了一个比较睿智的问题,x86是32位的,x64是64位的
      • 起名为Dockerfile(默认名),在build的时候-f后面可以不用指定名字
      • 使用COPY命令拷贝文件到容器内部(比如readme.md)
      • ADD命令添加的压缩包会自动解压(一般会将它解压到/usr/local目录下)
      • Tomcat没有运行起来,可以到tomcat/bin目录下运行catalina.sh run &指令运行
    5. 镜像发布

      发布到DockerHub

      (1).注册账号

      (2).从服务器登陆docker.hub

      docker login -u usrname -p password
      

      (3).从服务器提交镜像

      [root@iZwz908j8pbqd86doyrez5Z test]# docker tag arno-tomcat8 arnovc/arno-tomcat8  #打上标记
      [root@iZwz908j8pbqd86doyrez5Z test]# docker push arnovc/arno-tomcat8  #将打上标记的镜像上传
      

      注意:

      • 要在镜像之前打上id的标记
      • docker tag指令打标记

      阿里云镜像

      准备工作:登陆阿里云,点开阿里云镜像服务,创建命名空间,创建镜像仓库,创建容器镜像

      #登陆阿里云(如果有登陆docker.hub,建议先退出)
      docker login --username=亚诺_vc registry.cn-hangzhou.aliyuncs.com
      
      #打上tag
      docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/arno-test/新的镜像名:[镜像版本号]
      
      #上传镜像
      $ sudo docker push registry.cn-hangzhou.aliyuncs.com/arno-test/镜像名:[镜像版本号]
      

      注意:

      • 点击仓库的基本信息,可以查看镜像推送的步骤
      • [:tag]中的"[]"表示可选项,本身是不用带上的
  • 相关阅读:
    一张图了解.Net Core和.NetFx和.Net Standard和Xamarin关系
    .NETCore Docker实现容器化与私有镜像仓库管理
    .netcore consul实现服务注册与发现-集群部署
    .netcore consul实现服务注册与发现-单节点部署
    路径显示不下时,中间显示省略号
    CAD2015 C#二次开发 字体变形
    C# 加载并显示菜单
    作为公共组软件工程师如何工作
    面试北京XX科技总结
    面试北京XX数通总结
  • 原文地址:https://www.cnblogs.com/Arno-vc/p/13673768.html
Copyright © 2020-2023  润新知