• Docker基础记录


    目录:

      注:本随笔绝大部分摘抄尚硅谷docker教程,本随笔仅仅是做记录所用,请勿当作教程查看!尚硅谷官网:http://www.atguigu.com/

      1、Docker简介

      2、Docker安装

      3、Docker常用命令

      4、Docker镜像

      5、Docker容器数据卷

      6、DockerFile解析

      7、Docker常用安装

      8、上传自定义镜像到阿里云

    1、Docker简介

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

    例如以前我们在linux上安装MySQL,那么我们需要考虑很多情况,比如说缺什么库,缺什么依赖,然后配置一系列东西。

    当我们使用Docker以后,直接在docker中拉取MySQL的镜像,然后直接启动后就可以使用,不需要我们手动的配置什么东西。

    从上面的话可以猜出来,docker的作用就是可以直接安装软件环境+软件,我们安装软件的时候直接带着软件的环境一起安装了。

    docker官网:http://www.docker.com

    docker中文网站:https://www.docker-cn.com/

    Docker Hub(Docker的软件仓库)官网: https://hub.docker.com/

    2、Docker安装

    Docker支持的Centos环境:

      Docker支持以下的CentOS版本:

      CentOS 7 (64-bit)

      CentOS 6.5 (64-bit) 或更高的版本

    Docker的组成:

      1、镜像(Image)

        Docker镜像(Image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。

        我们可以用Java中类和对象来举例:

           类====镜像

        对象====容器

        所以我们就可以看出来,镜像就跟类一样,是模板,而类创建的实际的对象/实例,就是容器。

      2、容器(Container)

        Docker利用容器(Container)独立运行一个或一组应用。容器时用镜像创建的运行实例

        容器可以被启动、开始、停止、删除。每个容器之间都是相互隔离的。

        可以把容器看作是一个简易版的Linux环境,这个简易版Linux环境包括root权限、进程、用户、网络等和运行在其中的软件/应用程序。

      3、仓库(Repository)

        仓库(Repository)是集中存放镜像文件的地方

        仓库仓库注册服务器是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag:就是版本号)。

        仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

          公开仓库就是那种阿里、网易、docker官网提供的公开的仓库。

          私有仓库就是那种你自己搞的仓库,或者说是你公司内部使用的仓库。

          最大的公开仓库是docker官方的仓库:https://hub.docker.com/

      4、总结

         需要正确的理解仓库/镜像/容器这几个概念,下面给一张图:

         

     安装步骤:

      centos6.8:

        1、yum install -y epel -release:docker使用epel发布,phel系统的os首先要确保已经持有epel仓库,否则先检查os的版本,然后安装相应的epel包。

        2、yum install -y docker-io

        3、安装后的配置文件在:/etc/sysconfig/docker

        4、启动docker服务:serivce docker start

        5、docker version:验证是否安装成功(出现版本号则成功)

      centos7:

        官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/

        1、确保是centos7以上版本:

          cat /etc/redhat-release

        2、安装gcc相关:

          yum -y install gcc

          yum -y install gcc-c++

        3、卸载旧版本(第一行是一个命令,后面的是一个命令):

           yum -y remove docker docker-common docker-selinux docker-engine

           yum remove docker

           docker-client

           docker-client-latest

           docker-common

           docker-latest

           docker-latest-logrotate

           docker-logrotate

           docker-selinux

           docker-engine-selinux

           docker-engine

        4、安装需要的软件包:

          yum install -y yum-utils device-mapper-persistent-data lvm2

        5、设置stable仓库镜像:

          yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

        6、更新yum软件包索引:

          yum makecache fast

        7、安装dokcer ce:

          yum -y install docker-ce

        8、启动Docker:

          systemctl start docker

        9、测试:

          docker version

          dokcer run hello-world

          hello-world那个只要有以下的文件就说明成功:

          

         10、配置镜像加速:

          mkdir -p /etc/docker

          vim  /etc/docker/daemon.json 

            #网易云
            {"registry-mirrors": ["http://hub-mirror.c.163.com"] }
            #阿里云
            {
              "registry-mirrors": ["https://{自已的编码}.mirror.aliyuncs.com"]
            }

               systemctl daemon-reload

           systemctl restart docker

           注:配置阿里云镜像加速的那个编码,自己去阿里云注册开发者,然后就会有你的专属加速编码。

        11、如果你要卸载docker:

          systemctl stop docker​

          yum -y remove docker-ce

          rm -rf /var/lib/docker

    HelloWorld:

      docker run hello-world。

       

        可以看到输出了Hello from Docker! 

      那么我们执行docker run hello-world命令后docker做了些什么???

       

     底层原理:

      Dokcer是如何工作的:

        docker是一个cs(client-server)结构的系统。docker守护进程运行在主机上,守护进程接收客户端传来的命令,然后用这种方式来管理Docker。

        

          Docker是虚拟环境,VMware也是虚拟环境,他们有啥不同?为什么Docker比VMWare快?

        不同:

          Docker只是为了提供软件+软件运行所需的环境,VM是虚拟整套系统,包括硬件系统。

        为什么Docker比VM快:

          VM是虚拟整套系统,比如centos,VM是虚拟完整的centos,而Docker则是虚拟精简版的centos,并没有硬件系统、一些不必要的软件等。

          Docker虚拟centos的话,内核仍然是使用的宿主机的内核,所以它运行会更快!

          可能我表达不好,从网上摘抄一张图:

          

    3、Docker常用命令

    帮助命令:

      docker version:

        

       docker info:

        

       docker -help:

        

    镜像命令:

      docker images:列出所有本地的镜像

        

         REPOSITORY:镜像名

         TAG:镜像标签,说白了就是版本号,latest就是最新版

         IMAGE ID:镜像ID,唯一的标识符

         CREATED:镜像创建时间

         SIZE:镜像大小

         docker images还可以加参数:

          -a:列出本地所有的镜像(含中间镜像层)。docker images -a

          -q:只显示所有镜像ID。docker images -q

          --digests:显示镜像的摘要信息。docker images --digests  注:两个“-”

          --no-trunc:显示完整的镜像信息。docker images --no-trunc

      docker search:查找某个xxx镜像的名

        查找是在仓库查找,官网仓库地址:https://hub.docker.com

        docker search 镜像名[:版本号]:如果版本号不写,则默认最新版

          

           NAME:镜像名

          DESCRIPTION:镜像简介

          STARTS:收藏数

          OFFICIAL:是否为官方镜

          AUTOMATED:是否是自动化构建的镜像

          当然该命令也可以加参数:

            --no-trunc:显示完整的镜像描述。docker search tomcat --no-trunc

            -f stars=xxx:列出收藏数不小于xxx指定值的镜像。docker search redis -f stars=100

      docker pull 某个镜像名:下载某个镜像

        docker pull 镜像名:版本号:如果版本号不写,那么默认为latest(最新版)。

      docker rmi 某个镜像名:删除本地某个镜像

        删除镜像:docker rmi centos:latest/docker rmi 831691599b88,可以填写镜像名[:版本号](如果不填则为最新版)或者镜像ID

        删除单个:docker rmi -f 镜像名/镜像ID

        删除多个:docker rmi -f 镜像名1:版本 镜像2:版本

        删除全部:docker rmi -f $(docker images -qa),解释:docker images -qa:-q是列出历史的镜像,-a是只显示镜像ID。那么这命令的意思就是列出历史所有镜像的ID

    容器命令:

      (先去下载一个centos镜像,这样你才能尝试后面的命令(docker pull centos)):

      docker run [options]:从镜像中新建并启动容器:

        docker run [options] 镜像名:版本号/镜像ID [参数(这个参数会在容器中被运行)]:

          例如:

            docker run centos:从容其中查找centos镜像并新建一个容器实例后运行。

          options:有些是一个减号,有些是两个减号

            --name="容器新名字": 为容器指定一个名称;

            -d: 后台运行容器,并返回容器ID,也即启动守护式容器;

            -i:以交互模式运行容器,通常与 -t 同时使用;

            -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;

            -P: 随机端口映射;

            -p: 指定端口映射,有以下四种格式

              ip:hostPort:containerPort

              ip::containerPort

              hostPort:containerPort

              containerPort

           例如:

            docker run -it centos /bin/bash:新建并运行centos容器/实例,并以前台交互的方式运行,然后在容器内执行/bin/bash的命令。

      docker ps:列出当前所有正在运行的容器/实例

        当然它也有参数:

          -a:列出当前正在运行+历史运行的容器。docker ps -a

          -l:显示最近创建的容器。docker ps -l

          -n:显示最近创建的容器。docker ps -n5

          -q:显示容器编号。docker ps -q

          --no-trunc:不截断输出。

      exit:停止并退出容器

      ctrl+P+Q:容器退出但是不停止。

      docker start 容器ID或者容器名:启动已经创建好了的容器。

      docker restart 容器ID或荣容器名:重启容器

      docker stop 容器ID或容器名:停止容器

      docker kill 容器ID或荣启铭:强制停止容器

      docker rm 容器ID:删除已停止的容器。

        一次性删除多个容器:docker rm -f $(docker -a -q)或者docker ps -a -q | xargs docker rm

      其他重要命令:

        docker run -d 容器名:

          以后台模式启动一个容器。

          但是你运行后会发现,容器退出了,其实这是因为docker容器中的程序必须有一个前台进程,如果当前docker容器的程序中没有前台进程,那么就会自动退出。

        docker logs -f -t --tail 容器名:

          查看容器日志。

          -t 是加入时间戳

          -f 跟随最新的日志打印

          --tail 显示最后多少条

        docker top 容器名:

          查看容器内运行的进程。

        docker inspect 容器名:

          查看容器内部细节。

        docker exec -it 容器ID /bin/bash或docker attach 容器ID:

          进入正在运行的容器并以命令交互。

          这两个命令的区别:

            attach:直接进入容器启动的时候的终端,不会开启新的线程。

            exec:在容器中打开新的终端,是新开启的进程。

        docker cp 容器ID:容器内路径 宿主机路径:复制容器文件到宿主机内

    总结: 

       

    4、Docker镜像

     是什么?

      前面我们说过,镜像可以看成类,而容器就是通过类这个模板创建的实际的对象。

      docker镜像是分层的,比如下面这种情况:

      

       看我们这里,我们pull了一个redis,而他下载的不止一个镜像,下载了很多,这能看出来docker镜像并不是一整个一整个的,一个完整的可供我们使用的镜像是由多个小镜像组成的。

      那为什么docker要使用这种分层的镜像呢?

        最大的一个好处就是:资源共享。

        比如我们现在需要MySQL和tomcat,这两个镜像都需要centos作为基础镜像。

        那我们现在安装MySQL以后,centos这个基础镜像已经被下载好了,然后我们安装tomcat的时候,已经不需要再去下载centos这个基础镜像了。

        我们来组织一下语言:

          有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,

          同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

    镜像的特点:

      Docker镜像都是只读的。

      当容器启动时,一个新的可写层被加载到镜像的顶部。

      这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

    docker镜像的提交/commit操作:

       docker commit 提交容器副本使之成为一个新镜像。

       docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

       来一个案例演示:

        1、下载一个tomcat镜像。docker pull tomcat

        2、后台方式运行tomcat,docker run -d -p 8080:8080 tomcat

        3、进入tomcat,在webapps下创建test文件夹,然后创建hello.html(注意,最新版的tomcat的webapps下啥也没有)。docker exec -it 容器id /bin/bash,然后mkdir文件夹,touch文件

        4、然后根据这个容器创建一个镜像,docker commit -m="test tomcat image" -a="you author" 运行的tomcat的容器ID tomcat:test

        5、然后停止并删除我们运行的容器。

        6、然后我们会发现,原tomcat镜像中的webapps下是没有任何文件的,但是我们根据容器创建的镜像中,webapps下是有文件的,然后我们运行我们创建的镜像,就会发现,其webapps下是有文件的。

    5、Docker容器数据卷

      例如MySQL,它是一个数据库,而它会存储数据,这个数据是存放在容器中的,当我们删除容器以后,数据就没了,而我们希望将这个数据持久化到我们宿主机的某个位置(它类似于redis的持久化,而这里持久化是到宿主机,而不是redis的rdb或者aof这种文件),那么这个时候容器数据卷就派上了用场。说白了,就是和宿主机共享莫格文件夹。

      不仅如此,docker中还可以继承容器数据卷,就比如c1这个容器它搞了一个数据卷,是在/usr/volume下,然后我们创建容器c2,继承于c1的数据卷,那么c2也可以共享/usr/volume这个目录。

    使用方法:

      直接命令添加: 

        使用命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

        查看数据卷是否成功:docker inspect 容器ID

        

         带权限: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名。注意一下,这个ro代表着read only,容器中只能进行读取操作,那么上图中RW的值就为false。

      DockerFile添加:

        命令:VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

        我们来测试一下:

          1、创建一个文件,touch mydockerfile

          2、编辑文件的内容

    1 # volume test
    2 
    3 FROM centos
    4 
    5 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    6 
    7 CMD echo "finished,--------success1"
    8 
    9 CMD /bin/bash
    内容

          3、根据文件构建镜像:docker build -f /root/dockerFileTestDir/myDockerFile -t dhcentos .     注意,最后的那个点一定要加

          4、创建容器并运行,看其/下是否含有dataVolumeContainer1和dataVolumeContainer2这两个目录。

          5、然后我们会发现,我们的容器内路径,并没有指定映射到宿主机哪个位置上,那么这种情况,我们该如何得知其宿主机的路径在哪呢?

          6、使用docker inspect 容器ID,可以查看其对应宿主机路径

          

        注意:

          Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied   解决办法:在挂载目录后多加一个--privileged=true参数即可

            Docker通过dockerfile文件构建镜像的时候,不要忘记最后的点!!!

    6、DockerFile解析

    是什么?

      DockerFile是用来构建镜像的构建文件,有一系列命令和参数组成。

      构建镜像有三个步骤:编写dockerfile文件--编译构建镜像(docker build)--创建容器并运行(docker run)

      docker文件什么样的:我们前面看容器数据卷的时候,dockerfile这种方式也涉及到了dockerfile,只是比较简单,我们可以看看docker hub上,centos的dockerfile:

      

     Docker构建过程解析?

       Docker基础内容:

        1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数。

        2、指令按照从上到下,顺序执行。

        3、#表示注释

        4、每条指令都会创建一个新的镜像层,并对镜像进行提交。

      Docker执行DockerFile的大致流程:

        1、docker从基础镜像运行一个容器。

        2、执行一条指令并对容器作出修改。

        3、执行类似于Docker Commit的操作提交一个新的镜像层。

        4、docker再基于刚提交的镜像运行一个新的容器。

        5、执行dockerfile中的下一条指令知道所有指令都执行完成。

    DockerFile体系结构(保留字指令):

      FROM:基础镜像,当前新镜像是属于哪个镜像的。

      MAINTAINER:镜像维护者的姓名和邮箱地址。

      RUN:容器构建时需要运行的命令。

      EXPOSE:当前容器对外暴露出的端口。

      WORKDIR:指定在创建容器以后,终端默认登陆的进来工作目录,一个落脚点。

      ENV:用来在构建镜像过程中设置环境变量。

        例如:ENV MY_PATH /usr/mytest

           这个环境变量可以在后续的任何RUN指令中使用,就如同在命令前制定了环境变量前缀一样;也可以在其他指令中直接使用这些变量。

           比如:WORKDIR $MY_PATH

      ADD:将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包

      COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置:

        例如:

          COPY src dest

          COPY ["src","dest"] 

      VOLUME:容器数据卷,用于数据保存和持久化

      CMD:指定一个容器启动时要运行的命令。

        注意:

          1、DockerFile中如果有多个CMD命令,那么只有最后一个CMD命令生效。

          2、CMD命令会在被docker run之后的参数替换。

      ENTRYPOINT:指定一个容器启动时要运行的命令。它和CMD一样,都是在指定容器启动程序及参数

      ONBUILD:当构建一个被继承的Dockerfile时运行的命令,例如我现在dockerfile是A,我写了一个ONBUILD命令,然后我dockerfileB继承于dockerfileA,你们当我们B在构建的时候,父镜像A中的ONBUILD就会被执行

      小总结:

        

     案例:

      完成内容:自定义一个Centos,登录终端后默认当前路径为/usr/local、自带VIM编辑器、自带ifconfig指令。

      1、编写DockerFile,注意文件名为:Dockerfile

     1 FROM centos
     2 # 作者
     3 MAINTAINER dh<2366567504@qq.com>
     4 # 定义环境变量
     5 ENV MYPATH /usr/local
     6 # 定义登陆后的默认工作路径/usr/local
     7 WORKDIR $MYPATH
     8 # 运行命令
     9 RUN yum -y install vim
    10 RUN yum -y install net-tools
    11 
    12 # 定义暴露对外的端口
    13 EXPOSE 80
    14 
    15 # CMD命令
    16 CMD echo $MYPATH
    17 CMD echo "success"
    18 CMD /bin/bash
    dockerfile

      2、构建镜像:docker build -t mycentos:latest .

      3、运行镜像dockerfile中的命令是否生效。docker run -it mycentos

      4、查看镜像的变更历史。docker history mycentos

    7、Docker常用安装

    8、上传镜像到阿里云

  • 相关阅读:
    2015-05-06前端开发总结
    深入了解 Flexbox 伸缩盒模型
    Sublime text3 快捷方式(windows平台)
    移动web最简洁的滑动效果Swipe JS(适合初学者)
    谈响应式web设计代码实现
    经验分享:多屏复杂动画CSS技巧三则
    css3 animation动画效果解析
    移动H5前端性能优化指南
    php codeigniter (CI) oracle 数据库配置-宋正河整理
    jquery图片裁切+PHP文件上传
  • 原文地址:https://www.cnblogs.com/daihang2366/p/13222834.html
Copyright © 2020-2023  润新知