zoukankan      html  css  js  c++  java
  • Docker学习笔记03---DockerFile

    Docker学习笔记03

    狂神B站视频链接:https://www.bilibili.com/video/BV1og4y1q7M4

    DockerFile

    Docker介绍

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

    构建步骤:

    1、编写一个dockerfile 文件

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

    3、docker run 运行镜像

    4、docker push 发布镜像(DockerHub 、阿里云镜像仓库!)

    查看 https://hub.docker.com

    官方是怎么做的

    image

    image

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

    官方既然可以制作镜像,那么我们可以构建!

    DockerFile的构建过程

    基础知识:

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

    2、执行从上到下顺序执行

    3、# 表示注释

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

    image

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

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

    步骤:开发 、 部署 、 运维 。。。缺一不可!

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

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

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

    DockerFile的指令

    以前的时候我们就是使用别人的,现在知道了这次命令后,我们就可以自己写一个镜像了!

    FROM         # 基础镜像 
    MAINTAINER   #镜像是谁写的,姓名+邮箱
    RUN          #镜像构建的时候需要运行的命令
    ADD          #步骤:tomcat镜像,这个tomcat压缩包!添加内容
    WORKDIR      #镜像的工作目录
    VOLUME       #挂载的目录
    EXPOSE       #暴露的端口配置
    CMD          #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT   #指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD      #当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令 
    COPY         #类似ADD,将我们文件拷贝到镜像当中
    ENV      #构建的时候设置环境变量!
    

    image

    实战测试

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

    image

    创建一个自己centos的镜像

    # 1、编写Dockerfike文件 
    [root@localhost Dockerfile]# cat mydockerfile-centos
    FROM centos
    MAINTAINER caichuanqi<1415876428@qq.com>
    
    ENV MYPATH /usr/loacl
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    
    # 2、通过这个文件构建镜像
    # 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
    [root@localhost Dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
    Sending build context to Docker daemon  2.048kB
    Step 1/10 : FROM centos
    
    # 3、测试运行
    [root@localhost ~]# docker run -it mycentos:0.1 
    

    对比原生的centos,多了基于之前ADD增加了命令

    [root@localhost ~]# docker images
    ubuntu              18.04     b6a327625d68   5 days ago     397MB
    tomcat              latest    5505f7218e4d   6 days ago     667MB
    centos              latest    300e315adb2f   6 months ago   209MB
    # 进入 docker镜像
    [root@localhost ~]# docker run -it centos
    [root@2162cd366a7c /]# ls
    [root@2162cd366a7c /]# vim
    bash: vim: command not found
    [root@2162cd366a7c /]# ifconfig
    bash: ifconfig: command not found
    [root@2162cd366a7c /]#
    

    对比之前的centos

    image

    我们增加后的镜像

    image

    我们可以列出本地进行的变更历史

    image

    我们平时拿到一个镜像,可以研究一下他是如何运行部署的

    docker history 镜像id

    CMD 和 ENTRYPOINT 区别

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

    测试cmd命令

    #1、先检查一下是否有正在运行的容器
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    #2、在根目录下创建一个空文件夹,用来保存DockerFile文件
    [root@localhost /]# mkdir dockerfile
    #3、创建一个Dockerfile文件,并写一些命令进去
    [root@localhost dockerfile]# vim dockerfile-cmd-test
    FROM centos
    CMD ["ls","-a"]
    #4、构建我们的Dockerfile文件
    [root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM centos
     ---> 300e315adb2f
    Step 2/2 : CMD ["ls","-a"]
     ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
     ---> Running in 46b2d0b2a44e
    Removing intermediate container 46b2d0b2a44e
     ---> f253752d369f
    Successfully built f253752d369f
    Successfully tagged cmdtest:latest
    #5、运行我们创建的docker文件,发现我们的命令ls -a 命令生效
    [root@localhost dockerfile]# docker run f253752d369f
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
    #6、尝试追加一个命令 -l   ls -al
    [root@localhost dockerfile]# docker run f253752d369f -l
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: 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","a"]命令,-l 不是命令,所以报错!
    [root@localhost dockerfile]# docker run f253752d369f ls -al
    total 32
    drwxr-xr-x.  17 root root 4096 Aug 10 02:22 .
    drwxr-xr-x.  17 root root 4096 Aug 10 02:22 ..
    -rwxr-xr-x.   1 root root    0 Aug 10 02:22 .dockerenv
    lrwxrwxrwx.   1 root root    7 Nov  3  2020 bin -> usr/bin
    

    测试ENTRYPOINT命令

    [root@localhost dockerfile]# vim docker-cmd-entrypoint
    FROM centos
    ENTRYPOINT ["ls","-a"]
    [root@localhost dockerfile]# docker build -f docker-cmd-entrypoint -t entorypoint-test .
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM centos
     ---> 300e315adb2f
    Step 2/2 : ENTRYPOINT ["ls","-a"]
     ---> Running in 3d71ad8b47eb
    Removing intermediate container 3d71ad8b47eb
     ---> 5fcda58b0e61
    Successfully built 5fcda58b0e61
    Successfully tagged entorypoint-test:latest
    [root@localhost dockerfile]# docker images
    [root@localhost dockerfile]# docker run 5fcda58b0e61
    #我们的追加命令是直接追加在ENTRYPOINT 后面
    [root@localhost dockerfile]# docker run 5fcda58b0e61 -l
    

    DockerFIle中有很多的命令都十分的相似,我们需要了解它们的区别,最好的学习方法就是对比他们然后测试效果!

    解决虚拟机内部没有网络

    https://www.cnblogs.com/cainiao-chuanqi/p/14620937.html#autoid-5-1-0

    问题:

    装完Docker,然后启动镜像,发现没有网络,而且不能ifconfig,发现是没有开启转发,网桥配置完后,需要开启转发,不然容器启动后,就会没有网络,配置/etc/sysctl.conf,添加net.ipv4.ip_forward=1

    image

    解决:配置转发

    vim /etc/sysctl.conf
    #配置转发
    net.ipv4.ip_forward=1
    #重启服务,让配置生效
    systemctl restart network
    #查看是否成功,如果返回为“net.ipv4.ip_forward = 1”则表示成功
    sysctl net.ipv4.ip_forward
    

    image

    image

    检查容器是否正常访问网络

    #1、重启docker服务
    service docker restart
    或者
    [root@localhost ~]# systemctl restart docker
    #2、重新进入容器,发现没有网络找不到的报错
    [root@localhost dockerfile]# docker run -it centos
    

    image

    实战:Tomcat镜像

    1、准备镜像文件 tomcat压缩包,jdk压缩包!链接:https://pan.baidu.com/s/1XFnzpVRkbujYZKyp4UxrBA
    提取码:bo65

    image

    [root@localhost build]# pwd
    /dockerfile/build
    [root@localhost build]# touch readme.txt
    

    2、编写dockerfile文件,官方文件名 Dockerfile,build会自动寻找这个文件,就不需要 -f 指定了!

    [root@localhost build]# vim Dockerfile
    FROM centos
    MAINTAINER caichuanqi<1415876428@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u181-linux-x64.tar.gz /usr/local
    ADD apache-tomcat-9.0.52.tar.gz /usr/loacl
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_181 
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.52
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.52
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0.52/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.52/bin/logs/catalina.out
    

    3、构建镜像

    #docker build -t diytomcat .
    

    image

    4、启动镜像

    docker run -d -p 9090:8080 --name caichuanqitomcat -v /dockerfile/build/tomcat/test/:/usr/local/apache-tomcat-9.0.52/webapps/test -v /dockerfile/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.52/logs diytomcat
    

    5、访问测试

    6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>db</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    Hello World!<br/>
    <%
    System.out.println("----my test webtomcat log");
    %>
    </body>
    </html>
    

    发现:项目部署成功,可以直接访问;

    我们以后开发的步骤:需要掌握Dockerfile的 编写,我们之后的一切都是使用docker镜像来发布运行的;

    发布自己的镜像

    DockerHub

    1.地址https://hub.docker.com/注册自己的账号

    2、确实这个账号可以登录

    3、在我们的服务器上提交自己的镜像

    [root@localhost ~]# docker login --help
    
    Usage:  docker login [OPTIONS] [SERVER]
    
    Log in to a Docker registry.
    If no server is specified, the default is defined by the daemon.
    
    Options:
      -p, --password string   Password
          --password-stdin    Take the password from stdin
      -u, --username string   Username
    #登陆自己账号
    docker login -u username
    Password:	
    
    

    4、登陆完毕后就可以提交镜像了,就是一步 docker push

    #Push自己镜像到服务器上
    docker push 镜像名
    docker push 用户名/镜像名:tag版本
    #docker tag 镜像ID 新的镜像名:tag版本
    

    提交的时候也是按照镜像的层级来进行提交的!

    发布到阿里云镜像服务器上

    1、登陆阿里云

    2、找到容器镜像服务

    image

    3、创建命名空间

    image

    4、创建镜像容器

    image

    5、浏览阿里云

    image

    镜像打包

    backup.tar:镜像打包成为一个tar压缩包,可以发送压缩包给别人

    [root@localhost ~]# docker save --help
    
    Usage:  docker save [OPTIONS] IMAGE [IMAGE...]
    
    Save one or more images to a tar archive (streamed to STDOUT by default)
    
    Options:
      -o, --output string   Write to a file, instead of STDOUT
    
    [root@localhost ~]# docker load --help
    
    Usage:  docker load [OPTIONS]
    
    Load an image from a tar archive or STDIN
    
    Options:
      -i, --input string   Read from tar archive file, instead of STDIN
      -q, --quiet          Suppress the load output
    
    docker export <CONTAINER ID> > /home/export.tar
    docker save busybox-1 > /home/save.tar
    
    # 导入export.tar文件
    cat /home/export.tar | docker import - busybox-1-export:latest  
    # 导入save.tar文件
    docker load < /home/save.tar  
    

    小结

    image

    systemctl start docker
    
    docker exec -it 264bb068855e /bin/bash
    
    [root@localhost ceshi]# docker start ec7929b6f99c
    ec7929b6f99c
    [root@localhost ceshi]# docker attach ec7929b6f99c
    [root@localhost docker-test-volume]# docker build -f dockerfile -t caichuanqi/centos:1.0 .
    docker build -f dockerfile.
    
    docker load < pwn_deploy_chroot.tar
    docker run -d -p 10000:10000 -p 10022:22 pwn_deploy_chroot
    
    用户名character 密码character
    
    docker import ubuntu.tar ubuntu:18.04
    
    docker run -it -p 10000:10000 -p 22:22 ubuntu:18.04 /bin/bash
    docker run -d -p 3377:8080 --name tomcat01 tomcat
    tar –xvf file.tar
    
    docker load -i web1_v2.tar
    
    # docker run -d -p 8088:80 --name web3 464fa5d4cc5c
    
    docker run -d -p 8088:80 -p 2233:22 --name web4 464fa5d4cc5c
    
    docker load < pwn_deploy_chroot.tar
    docker run -d -p 10000:10000 -p 10022:22 pwn_deploy_chroot
    
    
    1、删除容器
    
    1)首先需要停止所有的容器
    
    docker stop $(docker ps -a -q)
    
    2)删除所有的容器(只删除单个时把后面的变量改为image id即可)
    
    docker rm $(docker ps -a -q)
    
    sudo docker rm <CONTAINER ID>    # 查看所有的镜像
    
    2、删除镜像
    
    1)查看host中的镜像
    
    docker images
    
    2)删除指定id的镜像
    
    docker rmi <image id>
    
    想要删除untagged images,也就是那些id为的image的话可以用
    
    docker rmi $(docker images | grep "^" | awk "{print $3}")
    
    3)删除全部的images
    
    docker rmi $(docker images -q)
    
    #保存docker包
    sudo docker save busybox-1 > /home/save.tar
    sudo docker export <CONTAINER ID> > /home/export.tar
    # 导入export.tar文件
    cat /home/export.tar | sudo docker import - busybox-1-export:latest  
    # 导入save.tar文件
    docker load < /home/save.tar    # 查看镜像
    

    愿路途漫长,以后莫失莫忘。 愿你不骄不躁,安稳顺心。

    作者:菜鸟-传奇
    本文版权归作者和博客园共有,不以任何盈利为目的,欢迎转载。
  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/cainiao-chuanqi/p/15127296.html
Copyright © 2011-2022 走看看