Docker使用

浅谈Docker 

  虚拟化:是资源的一种逻辑表示,并不会受限于物理资源,可以将一台物理资源丰富的服务器虚拟化成多个独立的性能一般的服务器;也可以将多台物理资源一般的服务器虚拟化为一台性能很好的服务器。通过上述描述就会发现:虚拟化就是一种基于逻辑的资源整合,进行资源的再分配,减少资源的损耗和淘汰,高效,弹性的使用物理资源。

  在学习的过程当中,使用的VM就是一种虚拟化技术,VM给开发者提供了在windows当中方便运行Linux或者其他系统的可能,对初学开发的同学的来说提供了一个很好的虚拟环境,但是VM的安装文件大,使用占用资源多这些问题也成为了限制大家使用和开发的重要因素,所以docker兴起了。

Docker(码头工人),首先docker比VM确实有更加轻量,使用更加廉价的优势。

   

  对比两种虚拟化,很显然,docker没有虚拟化系统内核,而是选择直接在宿主机的系统内核上进行其他虚拟化系统的运行,所以轻量很多。

  但是这并不是docker兴起的主要原因,跟多的是在项目部署过程当中,从开发到测试,从项目开发到项目上线的标准化问题,在开发,测试和部署项目当中,最担心也是遇到的最多的问题就是项目的兼容问题,很有可能由于开发,测试和上线环境问题,导致兼容问题,甚至是项目崩溃,于是有了这样的设计思路:

  开发一种独立的轻量级的环境,将项目部署到这个环境上,而这个环境本身有完整的标准化,且足够轻量,所以之后考虑的就不再是兼容问题,而是直接跑这个环境,那么这种思路就是docker。

docker提供了一个轻量级的虚拟化方案,开发者可以在这个虚拟化环境当中进行开发,一旦完成之后测试和运维直接跑这个虚拟化环境,所以就很大程度的规避了兼容和环境导致的项目失败问题。

   

  在docker学习的过程当中,必须要知道一些基本的概念和原理:

  作为开发,在docker使用过程当中,必须需要注意上述的概念:

  Client部分:在docker安装完成之后,开发者可以通过命令行进行控制,这个部分就是用户操作的部分。

  Docker Server部分:实际上操作docker在系统当中是以一个服务或者进程存在的,在这个服务当中保存在可以为开发者提供的资源,这部分也是开发者需要着重了解的部分,docker虚拟机是由image镜像和container容器组成的:

           image:类似VM当中的镜像,里面是指定好的系统和应用,但是不可以直接使用

        container:用来加载镜像,形成具体的虚拟化实例(也就是虚拟机),提供给开发者使用

        Registry 仓库:用来存放镜像,类似git的仓库,开发者可以从仓库当中下载或者上传镜像。

  所以使用docker的过程就是:

    1、  从仓库当中下载镜像

    2、  然后用容器加载(运行)镜像开始开发

    3、  将修改后的容器再次编译成镜像上传到仓库

    4、  测试使用二次编译的镜像直接测试

    5、  运维直接部署二次编译的镜像

  从这个角度上看,镜像更类似在python面向对象过程当中的一个类,而容器运行镜像形成的就是实例,真正的操作和修改都作用于实例。

  

  所以上述的图可以用下面的轨迹进行描述,当然命令会在后面的课程学习

   

Docker 安装

  1、  安装FastDFS Linux依赖包

    yum install libevent libevent-devel gcc* -y

  2、  安装docker

    yum install docker -y

  3、  启动docker服务,查看版本

    systemctl start docker

    docker version

Docker基本命令

  docker命令本身有很多参数选项,有的使用比较频繁,有的在个别特殊的情况下才可能用到,建议在初学的同学首先掌握常用的命令和参数,然后在附录里面查看所有的参数。

  Image

    1、  查询image

      docker search python

      结果

      INDEX       NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

      docker.io   docker.io/python                           Python is an interpreted, interactive, obj...   5281      [OK]      

      docker.io   docker.io/django                           Django is a free web application framework...   970       [OK]      

      docker.io   docker.io/pypy                             PyPy is a fast, compliant alternative impl...   241       [OK]      

      docker.io   docker.io/kaggle/python                    Docker image for Python scripts run on Kaggle   141                  [OK]

                0

              docker search 查询所有当前源地址上的类似镜像

              查询返回的字段

                          index 镜像索引

                            name 镜像仓库源的名称

                            description 镜像描述

                            stars  点赞

                            official 是否官方发布

                            automated 自动构建         

    2、  下载image

      docker pull python

      docker pull python:3.7

    3、  查看image

      docker image list

    4、  删除image

    docker rmi image_id

  Containers

    1、  创建containers

      docker container create [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器实例

      docker container create 是命令的主体

      [OPTIONS] 代表docker可以使用的选项,带有中括号代表可以写,也可以不写

                       --name 指定docker容器实例的名称,如果不写,采用默认名称命名实例

              -i 保持标准输入的开启

              -t 分配tty设备,该可以支持终端登录,默认为false

      IMAGE 指的是创建容器实例加载的镜像,必须指定

      [COMMAND] 启动容器实例后执行的命令 通常会写/bin/bash 其实就是指开启命令行

      案例一:

        需要先执行:

                          docker pull centos

               创建一个centos的实例

        [root@localhost ~]# docker container create centos

        c4e003a9c41d6911a9d0b3d816c7a31a67e1767277cd151fef788245dbcd7c4e

        [root@localhost ~]# docker container list --all

        CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

        c4e003a9c41d        centos              "/bin/bash"              20 seconds ago      Created                                    stupefied_meninsky

      案例二:

                创建一个名字为contos1的centos实例

        [root@localhost ~]# docker container create --name Centos1  centos

        976fd40a03bdaf662d7e46d8b193c721b6e86e026ba63c2ed08f422c28aaf213

        [root@localhost ~]# docker container list --all

        CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

        976fd40a03bd        centos              "/bin/bash"              2 seconds ago       Created                                    Centos1

      案例三:

                  创建一个记录标准数据输出的centos实例     

        [root@localhost ~]# docker container create -it --name Centos2 centos

        14aa970305e18375aaca6bdf6f395d6d893c11599bbbea06cd192540acbeda1d

        CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

        14aa970305e1        centos              "/bin/bash"              46 seconds ago      Created                                    Centos2

    2、  查看containers

      docker container list --all

    3、  启动containers

      docker container start

                 -a 参数带上了的话,那么会把pid1程序的输出都带到终端上

                 -i 添加容器的输入

      docker container run

               -a 参数带上了的话,那么会把pid1程序的输入输出都带到终端上

               -c 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU

               -d  指定容器运行于前台还是后台,默认为false

               -h  指定容器的主机名

               -I  保持标准输入的开启

               -l  设置容器的源数据

               -m 限制容器内应用使用的内存,单位可以是b、k、m或g

               -p 将容器的端口发布到主机

               -P 随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

               -t  分配tty设备,该可以支持终端登录,默认为fa

               -u 指定容器的用户

               -v 给容器挂载存储卷,挂载到容器的某个目录

               -w 指定容器的工作目录

    docker container run = docker container create + docker container start

  4、  停止containers

    docker container stop container_id  #等待关闭之后停止

    docker container kill container_id  #杀死进程

  5、  启动containers

    docker container start

             -a 参数带上了的话,那么会把pid1程序的输出都带到终端上

             -i 添加容器的输入

  docker container exec 对指定的容器执行命令,并把结果返回回来

  

  例一:查看Centos2实例的根目录:

     docker container exec Centos2 ls

  例二:切入Centos2进行更多命令操作

     docker container exec -it Centos2 /bin/bash

     docker container attach Centos2

  注意:切入容器实例之后可以用

         ctrl+p+q 退出实例,但是保持容器实例运行

         exit命令,退出并且关闭容器实例

  docker container run

           -a 参数带上了的话,那么会把pid1程序的输入输出都带到终端上

           -c 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU

           -d  指定容器运行于前台还是后台,默认为false

           -h  指定容器的主机名

           -I  保持标准输入的开启

           -l  设置容器的源数据

           -m 限制容器内应用使用的内存,单位可以是b、k、m或g

           -p 将容器的端口发布到主机

           -P 随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

           -t  分配tty设备,该可以支持终端登录,默认为fa

           -u 指定容器的用户

           -v 给容器挂载存储卷,挂载到容器的某个目录

           -w 指定容器的工作目录

    docker container run = docker container create + docker container start

  6、  删除containers

  docker container rm container_id

      打包新的镜像:

    上述可以对容器实例进行初步的修改,修改后的容器实例当中已经拥有了项目的功能,那么现在就可以进行镜像打包了,就是讲修改后的容器实例再次封装成一个镜像。在docker当中,封装镜像有两种方法:

      1、  使用命令

        docker commit -a "bian<3392279511.qq.com>" -m "set image test" Centos2 laobian/centos2       

      2、  使用docker_file

DockerFile

         在工作当中直接把镜像拷贝给其他同事的操作其实不多见,更多的时候是传递镜像文件,然后通过镜像文件来构建镜像,那这里的镜像文件其实就是描述镜像的文件。

         docker常用预留字

        

预留字

预留字描述

FROM

镜像来源,镜像的父镜像  scratch所有容器的父容器

MAINTAINER

作者名和邮件 laobian<laobian@qq.com>

RUN

在构建镜像的时候执行,比如安装命令

EXPOSE

暴露的端口,提供给命令 -p 绑定

WORKDIR

切入容器的初始化目录

ENV

变量声明 ENV MYPATH /opt    使用变量$MYPATH

ADD

从宿主机复制并解压目录到容器机

COPY

从宿主机复制目录到容器机

VOLUME

挂载 单个目录直接写 多个目录需要用列表

CMD

执行命令,只能执行一条,写多条,最后一条覆盖前面的命令

ENTRYPOINT

追加式执行

ONBUILD

在作为父镜像构建时回调执行

 

           构建流程

      1、  创建一个目录(建议)

        mkdir -p /opt/MyDocker

      2、  编写docker文件(名称必须为Dockerfile)

        vim Dockerfile

      3、  编写docker文件

        

      FROM centos
  
      RUN yum install wget -y

      CMD /bin/bash

         4、  进行镜像构建

        docker build -f /opt/MyDocker/Dockerfile -t laobin/centos:v2 .

        Sending build context to Docker daemon 2.048 kB

        Step 1/3 : FROM centos

         ---> 831691599b88

        Step 2/3 : CMD yum install wget

         ---> Running in b53c7e154277

         ---> ba4d2c1a4fd7

        Removing intermediate container b53c7e154277

        Step 3/3 : CMD /bin/bash

         ---> Running in 37bb18c00ec2

         ---> bccf8434eece

        Removing intermediate container 37bb18c00ec2

        Successfully built bccf8434eece

 

  案例加深

            使用命令挂载目录

    --privileged=true  使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。    

 

    FROM centos:7 

    ENV MYPATH /opt

    WORKDIR $MYPATH

    ADD nginx-1.12.2.tar $MYPATH

    RUN yum -y install make crypt pcre pcre-devel zlib zlib-devel openssl gcc*

    RUN cd $MYPATH/nginx-1.12.2 && $MYPATH/nginx-1.12.2/configure && make && make install

    RUN ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

    EXPOSE 80

    CMD /bin/bash

 

    使用:

    docker container run -it --name nginx_test -p 80:80  -v /opt/nginx/html:/usr/local/nginx/html --privileged=true c5f0cbfff9fd /bin/bash

 

              使用DOCKERFILE挂载

    FROM centos:7

    ENV MYPATH /opt

    WORKDIR $MYPATH

    ADD nginx-1.12.2.tar $MYPATH

    RUN yum -y install make crypt pcre pcre-devel zlib zlib-devel openssl gcc*

    RUN cd $MYPATH/nginx-1.12.2 && $MYPATH/nginx-1.12.2/configure && make && make install

    RUN ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx 

    VOLUME /usr/local/nginx/html   

    EXPOSE 80

    CMD /bin/bash

  使用:

     docker container run -it --name nginx_test1 -p 8000:80 --privileged=true ba9c39c76389 /bin/bash

原文地址:https://www.cnblogs.com/bianjinhui/p/13207021.html