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、上传镜像到阿里云

原文地址:https://www.cnblogs.com/daihang2366/p/13222834.html