Docker学习

一、Docker的产生的原因

1、为什么要使用docker:

  1.  开发在本机进行开发,代码打成war包,运维工程师在主机去部署,开发和运维之间由于环境和配置的问题会产生问题和分歧,版本的迭代,环境如此复杂,而docker软件可以带环境安装,安装的时候把原始环境一模一样的复制过来,这样可以消除编码是环境不同的问题。
  2. 代码即应用------》镜像即应用
  3. 自动扩缩容,应用跨平台运行 

二、Docker的理念

  1. 一次封装、到处运行;
  2. 只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作

三、Docker是什么

解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

四、Docker能干什么

  1. 虚拟机技术缺点:
  2. 容器虚拟化技术,linux容器不是模拟一个完整的操作系统,
  3. 开发运维更方便

五、Docker三要素

仓库、集中存放镜像文件的场所,仓库和仓库注册器区别,公开库和私有库
镜像:模板
容器:用镜像创建的运行实例,启动、开始、停止、删除每个容器是互相隔离的

六、安装Docker

  1. CentOs6.5(64bit)版本以上

               yum install -y  epel-release
               yum install -y  docker-io
               安装后配置文件  etc/sysconfig/docker
               启动Docker后台服务 service docker start
               docker verison验证

2.CentOS7安装Docker

            linux没有网络下载  https://download.docker.com/linux/static/stable/x86_64/
           yum install -y  epel-release
           yum install -y  docker-io
          安装后配置文件  etc/sysconfig/docker
          启动Docker后台服务 service docker start
          docker verison验证
          systemctl start docker
          systemctl enable docker

七、阿里云加速镜像加速配置

         1、 阿里云地址:http://dev.alibaba.com/search.html

         2、登录,找到镜像加速器,获取加速器镜像地址

         3、配置:7以下的:etc/sysconfig/docker   other_ages=""

                    7及7以上:vim etc/docker/daemon.json  systemctl daemon-reload

         4、重启docker

八、helloworld镜像

            docker run hello-world   从本地取最新的镜像,取不到,从阿里云拉取镜像
             Unable to find image 'hello-world:latest' locally

九、docker运行底层原理

      1、docker是怎么工作的:C/S结构  docker守护进程运行在主机上,通过socket连接客户端访问,守护进程从客户端接受命令并管理运行主机上的容器。容器是运行时环境,就是我们前面说的集装箱
       2、为什么docker比vm块:docker有更少的抽象层,不需要硬件资源的虚拟化,docker 利用的是宿主机的内核。

十、docker的常用命令

1、帮助命令:docker version \ docker info \ docker --help
2、镜像命令:
     docker images  列出本地的所有镜像   REPOSITORY(仓库源)   TAG(标签)       IMAGE ID   (镜像ID)   CREATED (创建时间)  SIZE(大小)
      docker images  -a   列出所有镜像(含中间镜像层) 
      docker images -q 显示当前镜像的ID -qa ID所有    
      docker images -digests  镜像摘要信息
      docker images --no-trunc  镜像完整信息
      docker search  docker Hub 上搜索镜像
      docker search -s 30 tomcat  搜索点赞数超过30
      docker search -s 30 --no-trunc  tomcat  搜索点赞数超过30的未被省略的信息
      docker search -automated 只列出 automated build 类型的镜像
      docker pull 下载镜像默认最新版 docker pull tomcat:latest 
      docker rmi   删除镜像 默认最新版      -f 强制删除
      docker rmi -f hello-world ngix   删除多个
      docker rmi -f $(docker images -qa)删除全部镜像
3、容器命令:
      docker run 新建并运行容器实例
      docker run -it --name mycentos0115 centos  -i 以交互式运行容器,通常与-t同时使用  
                                                 -d 后台运行接口
                                                 -t 为容器重新分配一个伪输入端,通畅和-i同事使用
                                                 --name 为容器指定一个名字
                                                 -P 随机端口映射
                                                 -p 指定端口映射,有以下4种格式
                                                     ip:hostPort:containerPort
                                                     ip::containerPort
                                                     hostPort:containerPort
                                                         containerPort
      docker run -d centos --使用docker ps -a 进行查看会发现容器已经退出,很重要的信息说明:        docker容器后台运行就必须要有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(top,tail),就会自动退出的
      这个是docker容器的机制问题,所以最佳的解决方式就是将你要运行的容器以前台进程的形式运行
      docker ps 列出所有正在运行容器
      docker ps -l  上一个运行容器
      docker ps -a  现在的和以前运行的容器
      docker ps -q   静默模式,只显示容器号
      docker ps --no-trunc   静默模式,不截断输出
      exit  关闭并退出容器
      ctrl+p+q   退出容器,但不关闭,回到宿主机
      docker start 容器ID  启动容器
      docker restart 容器ID  重启ID
      docker stop 容器ID  停止容器
      docker kill 容器id   强制关闭容器
      docker rm 容器ID     删除已经停止的容器
      docker rm -f 容器ID     强制删除的容器
      docker rm -f $(docker -a -q)     强制删除所有的容器
      docker -logs -f -t --tail 容器ID  日志 -t 时间戳  -f
      docker top 容器ID  查看容器内的进程
      docker inspect 容器ID 查看容器的内部细节
      docker attch 容器ID                 进入正在运行的容器,并以交互式运行容器
      docker exec -t 容器ID ls -l/tmp  未进入容器中执行容器终端的相关命令
      docker exec -t 容器ID /bin/bash  相当于attch
      docker cp  容器ID:路径  目标路径   容器里面的内容拷贝到宿主机

十一、镜像的原理

       1、是什么:轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时库,环境变量和配置文件
            unionFS(联合文件系统)是一种分层的,轻量级的高性能的文件系统,它支持对文件系统的修改,作为一次提交,来一层一层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下,union文件系统是docker镜像的基础,镜像可以通过分层来继承基于基础镜像可以制作出各种应用的镜像
            特点:一次同时加载多个文件系统不,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
        2、docker的镜像加载原理:
          bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs,这一层与我们典型的linux系统是一样的包含boot加载器和内核。当整个boot加载完成后,整个内核就都在内存中了,此时内存的使用权已由bootfs专交给内核,此时内存也会卸载bootfs;
          rootfs(root file system)
           在bootfs之上,包含的主要是linux系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各种不同操作系统发行版,比如ubuntu,centos等
          平时我们安装centos有好几个G,为啥容器却只有几百M呢,
            对于一个精简的OS系统来说,rootfs很小,只需要包括最基本的命令、工具、和程序库就可以,因为直接使用Host的的kernel,自己只需要提供rootfs就行了,由此可见不同的linxu版本,bootfs基本可以共用的,rootfs可以共用的。
        分层的镜像 kernel+centos+jdk+tomcat
        为什么docker镜像要采用分层结构--资源共享,base镜像+各种
特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作容器层           ,容器层下的都叫镜像层
docker镜像的commit操作
      docker commit 提交容器副本使之成为一个新的镜像
      docker run -it -p 8888:8080 tomcat
      docker commit -m(提交的描述信息) -a(作者)  容器id要创建的目标镜像名

十二、docker容器数据卷

1、是什么:保存数据,数据持久化,一句话,有点类似我们redis里面的rdb和aof文件
2、能干嘛:卷就是目录和文件,存在于一个和多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过uniosFS文件,提供一些用于持续存储和共享数据的特性,
        卷的设计就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除是删除其挂载的数据卷
        特点:数据卷可在容器之间共享和重用数据
              卷中的更改可以直接生效
              数据卷中的更改不会包含于镜像的更新中
              数据卷的生命周期一直持续到没有容器使用它为止
4、数据卷:
  容器卷添加:直接命令添加:
                           docker run -it -v /宿主机目录绝对路径:/容器内目录 镜像ID
                           docker inspect 查看容器卷是否挂载成功
                           容器与宿主机之间是数据共享
                           容器停止退出后,主机修改后数据是否同步?同步
                           命令(带权限) docker run -it -v /宿主机目录绝对路径:/容器内目录:ro 镜像ID  容器内文件夹智能读取,不能添加
              dockerfile添加 dockerfile是什么:镜像模板的描述文件
                             根目录下新建mydocker文件夹并进入
                             可在dockerfile文件中使用VOLUME命令来给镜像添加一个或多个数据卷 VOLUME["/datacontainer","/datacontainer","/datacontainer"]
                                     由于可移植和分享的考虑,用-v /宿主机目录绝对路径:/容器内目录 这种方法不能直接在dockerfile上实现,由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样特定的目录
                             file构建: #volume test
                                        FROM centos
                                        VOLUME["/dataVolumeContainer","dataVolumeContainer1"]
                                        CMD echo"finished,----success"
                                        CMD /bin/bash
                             build后生成镜像 docker build -f /mydocker/dockerfile1 -t zzyy/centos.
                             run容器
                             通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址在哪? 默认读写权限,docker inspect查看
                             主机对应默认地址
              备注:
数据卷容器:  命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器称为数据卷容器;
              以上一步新建的镜像/zzyy/centos为模板运行容器dc01/dc02/dc03
              他们已经具有数据卷 /dataVolumeContainer01   /dataVolumeContainer02
              容器间数据共享(--volumes-from) :
                  先启动一个父容器dc01 docker run -it --name dc01 /zzyy/centos  启动后在容器卷datacontainer02里面创建文件 touch dc01_add.txt
                  新建dc02和dc03 继承dc01   docker run -it --name dc02 --volumes-from dc01 zzyy/centos  启动后在容器卷datacontainer02里面创建文件 touch dc02_add.txt
                                            docker run -it --name dc03 --volumes-from dc01 zzyy/centos  启动后在容器卷datacontainer02里面创建文件 touch dc03_add.txt
                  回到dc01可以看到dc02和dc03各自添加的都能共享了
                  
                  删除dc01,dc02修改后,dc03能否访问
                  删除dc02后,dc03能否访问
                  新建dc04继承dc03后再删除dc03
                  结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
                      

十三、dockerfile文件

是什么:dockeFile 是用来构建镜像的构建文件,是由一系列命令和参数构成的脚本        
             构建三步走:编写dockerfile文件 ,docker build 创建镜像 docker run 容器云行
             文件什么样        :
               
                FROM scratch
                MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
                ADD centos-6-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="20181006"

                CMD ["/bin/bash"]
     dockerfile构建过程解析:    
            dockerfile内容基础知识:1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数    
                                    2、指令按照从上到下,顺序执行
                                    3、#标识注释
                                    4、每条指令都会创建一个新的镜像层,并对镜像进行提交
            docker执行dockerfile的大致流程:1、docker从基础镜像运行一个容器
                                            2、执行一条指令,并对容器做出修改
                                            3、执行类似docker commit操作提交一个新的镜像层
                                            4、docker在基于刚提交的容器
                                            5、执行dockerfile中的下一个指令,直到所有的指令都执行完成
            总结:从应用软件的角度看:Dockerfile、docler容器、docker镜像分别代表软件的三个不同阶段
                  1、dockerfile是软件的原材料
                  2、docker镜像是软件的交付品
                  3、docker容器则可以认为是软件的运行状态
            dockerfile面向开发,docker镜像成为交付标准、docker容器则涉及部署和运维,三者缺一不可,合力充当docker体系的基石
    dockerfile的体系结构(保留字指令):
            FROM    基础镜像,当前镜像是基于那个镜像的
            MAINTAINER 镜像维护者的姓名和邮箱地址
            RUN  容器构建时需要运行的命令
            EXPOSE 当前容器对外暴露的端口
            WORKDIR  指定创建容器后,终端默认登录进来的工作目录,一个落脚点
            ENV 用来构建镜像过程中设置环境变量
            ADD  将宿主机下的命令拷贝到镜像中,且ADD命令会自动处理URL和解压tar压缩包
            COPY   类似ADD拷贝文件和目录到镜像中去
                   将从构建上下文目录<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
            VOLUME 容器数据卷,用于保存和持久化工作
            CMD  指定一个容器启动时执行的命令
                 docker中有多个CMD命令,但只有最后一个生效,CMD会被Docker run 之后的命令替换
            ENTRYPOINT 指定一个容器启动时执行的命令
                       ENTRYPOINT 和CMD一样都是在指定容器启动程序和参数
            ONBUILD  当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
    案例:base镜像(scratch)      docker hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
          自定义镜像(mycentos) 初始centos运行该镜像时默认路经是 /
                                 不支持ifconfig 、不支持 vim
                目标:登录后默认路径
                      支持vim
                      支持ifconfig    
                编写dockerfile文件: FROM centos
                                     MAINTAINER lijw@asiainfo.com
                                     ENV mypath /tmp
                                        WORKDIR $mypath
                                     RUN yum -y install vim
                                     RUN yum -y install net-tools
                                     EXPOSE 80
                                     CMD echo $mypath
                                     CMD echo "SUCCESS"
                                     CMD /bin/bash
                创建镜像 docker build -f  dockerfile -t mycentos:1.3 .
                运行 docker run -it mycentos:1.3
                列出镜像的历史:docker history 镜像ID
                                     
          CMD和ENTRYPOINT镜像案例:都是指定一个容器启动时要运行的命令
                CMD  dockerfile中有多个CMD命令,但只有最后一个生效,CMD会被Docker run 之后的命令替换
                     tomcat讲解 docker run -it -p 8888:8080 tomcat ls -l   容器不会启动
                ENTRYPOINT  Docker run 后面的参数会被当做参数传递给 ENTRYPOINT,之后组成新的命令组合
                            制作CMD版可以查询IP的信息的容器
                            如果我们需要显示HTTP头消息,就需要加上-i参数 CMD会报错,因为它替换了原先最后一行的命令,而ENTRYPOINT则不会,会追加-i的操作
          ONBUILD学习:
             
                            
          自定义镜像(tomcat9)1、 mkdir  -p/zzyyuse/mydockerfile/tomcat9
                               2、在上面目录下,touch c.txt
                               3、将jdk和tomcat安装的压缩包拷贝进上一步目录
                               4、在/zzyyuse/mydockerfile/tomcat9 目录下新建dockerfile文件
                                    FROM centos
                                    MAINTAINER LIJW@asiainfo.com
                                    #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
                                    COPY c.TXT  /usr/local/container.txt
                                    #把java和tomcat添加到容器中
                                    ADD tomcat.tar.gz /usr/local/
                                    ADD jdk.tar.gz /usr/local/
                                    #安装vim编辑器
                                    RUN yum -y install vim
                                    #设置工作访问的时候的WORKDIR路径,登录落脚点
                                    ENV MYPATH /user/local
                                    WORKDIR $MYPATH
                                    #配置java与tomcat的环境变量
                                    ENV JAVA_HOME /user/local/jdk1.8.0_171
                                    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
                                    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
                                    ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
                                    ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib;$CATALINA_BASE/bin
                                    #容器运行时监听的端口
                                    EXPOSE 8080
                                    #启动时运行TOMCAT
                                    #ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
                                    #CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
                                    CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
                               5、构建 docker build -t zzzyyyTomcat
                               6、运行 docker run -d -P 9090:8080 --name myTomcat 
                                       -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
                                       -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs:/usr/local/apache-tomcat-9.0.8/logs
                                       --privileged=true
                                       zzzyyyTomcat
                               7、验证
                               8、结合前述的容器卷将测试的web服务test发布
        总结:

十四、本地镜像发布到阿里云

      创建新的镜像:docker commit -a 作者 -m 描述
      创建仓库空间:
      将镜像推送到阿里云:docker login
                          docker tag
                          docker push

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值