Docker简介

    Docker的思想是来自于集装箱,隔离是docker的核心思想;它可以通过隔离机制,将服务器利用到极致;docker是基于Go语言开发的且也是一种虚拟化技术。

    二者的区别

      传统虚拟机:它是一整套硬件,运行的是一个完整的操作系统,然后在这个系统上运行和安装软件;故资源占用多、冗余步骤多、启动慢;

       docker:容器内的应用都是直接运行在宿主机的内核之上,它是没有自己的内核的,也没有虚拟硬件,所以更加轻便;在docker中每个容器都是隔离的,都有属于自己的文件系统,他们之间互不影响。

   Docker安装

      官网:https://docs.docker.com/get-docker/

     基本组成

 

      images(镜像):它就好像是一个模板,可以通过这个模板来创建容器服务;通过这个镜像可以创建许多新容器;

      container(容器):docker利用容器技术独立运行一个或一组应用,通过镜像来创建(启动,停止,删除);

      repository(仓库):存放镜像的地方(国外:docker hub 国内:阿里云) 

   Docker常用命令

      帮助启动类命令

         docker version          #显示docker的版本信息

         docker info             #显示docker的系统信息,包括镜像

         systemctl start docker         #启动docker

         systemctl stop docker         #停止docker

         systemctl restart docker        #重启docker

      systemctl enable docker        #开机自启动docker

         docker --help            #帮助总体文档

      镜像命令

         docker images            #查看本地主机上的镜像

                  -a          #列出所有的镜像

          -q          #只显示镜像的id

         docker search            #搜索镜像

                  --limit 5 mysql   #列出在仓库中使用最多的5个MySQL的镜像

    docker rmi 镜像id         #删除镜像

                  -f 镜像id       #强制删除指定的镜像

                  -f 镜像id 镜像id    #强制删除多个镜像

     docker rmi -f $(docker images -aq)  #强制删除所有镜像

          docker systemctl df        #查看镜像/容器/数据卷所占的空间

   Docker虚悬镜像是什么?

      虚悬镜像一般是指 仓库名和标签都是<none>的镜像,俗称为虚悬镜像;

      容器命令

         docker run 【可选参数】 images   #新建容器并启动

            --name=”容器名字“ #自定义容器名字,容易区分

          -d         #使用后台方式运行

          -it         #使用交互方式进行运行

                                 -p                              #映射指定的端口;例如 -p 8080:8080

          -P        #随机指定映射端口 

         docker ps            #列出所有在运行的容器

                -a         #列出当前正在运行和历史运行过的容器

           -q         #只显示容器的编号

           -l        #显示最近创建的容器

         docker rm -f 容器id       #删除停止运行的容器

            容器id 容器id    #删除多个指定的容器

         docker rm -f ¥(docker ps -aq)   #删除全部容器

         docker kill 容器id        #杀死容器

         docker run -it redis #前台交互式启动

         docker run -d redis #后台守护式启动
         docker logs 容器id #查看日志
         docker logs -f -t --tail 容器编号       #查看日志
                               -tf #显示日志
                               -- tail number           #显示日志条数
         docker top 容器id                          #查看容器中进程信息
         dokcer inspect 容器id                   #查看镜像的元数据
   
进入当前正在运行的容器
        docker exec -it 容器id bin/bash    #以交互方式进入容器内
        docker atlach 容器id                    #进入当前运行的容器
区别:1、进入容器后开启一个新的终端,可以在里面进行操作,用exit退出,并不会停止容器;
           2、进入容器正在执行的终端,不会启动新的进程,用exit退出,导致停止容器;
   从容器内拷贝东西到主机
      docker cp 容器id:容器内路径 目的主机路径
   以tar包的方式导入和导出容器
      docker export 容器id > 导出名称.tar      #export导出容器的内容作为一个tar归档文件 
      cat nginx.tar | docker import - mynginx/nginx:8.1.0      #import从tar包中的内容创建为一个镜像
Docker镜像
   镜像:它是一种轻量级,可执行的独立软件包,它包含运行某个软件所需的全部内容,我们把应用程序
和配置依赖打包好形成一个可交付的运行环境(包括源代码、运行时需要的库,环境配置和配置文件等),这个打包好的运行环境就是images镜像文件;
   UnionFS(联合文件系统):它是一个分层,轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下;
      commit命令
         docker commit -m=“添加信息说明” -a=“作者” 容器id 要创建的目标镜像名:【标签名】
   本地镜像发布到阿里云的基本过程

    docker容器数据卷

      当使用-v挂载卷的时候,在后面加入--privileged=true(放开权限);卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过联合文件系统提供一些用于持续存储和共享数据的特性;

      卷设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除挂载的数据卷;

         docker -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

         docker -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (在容器内加入限制 在容器内只能读取 不能写入)
      卷的继承和共享
      容器2继承容器1 的卷规则
         docker run -it --privileged=true --volumes-from 准备继承的容器名字或id --name=“容器2的名字” 镜像id
Docker网络
   docker network ls                 #查看docker网络模式命令
   docker network --help   #查看docker网络模式下的帮助命令
   能干嘛
      进行容器间的互联和通行以及端口的映射;容器IP变动时可以通过服务名直接进行网络通信而不受到影响;
   docker网络模式
      bridge为每一个容器分配,设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式;
      docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络,docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信;
      host容器将不会虚拟出自己的网卡,配置自己的IP,而是使用宿主机的IP和端口;
      容器将不会获得一个独立的network命名空间,而是和宿主机共用一个network命名空间,容器将不会虚拟出自己的网卡,而是和使用宿主机的IP和端口;
      docker启动时总是会遇到的警告
         docker启动时指定--network=host或-net=host,还指定了-p映射端口,那这个时候就会有警告,并且通过-p设置的参数不会起到任何作用,端口号会以主机端口号为主,重复时则递增;
         例如:docker run -d -p 8081:8080 --name=myjava --network=host java        警告
                    docker run -d                          --name=myjava --network=host java        正确
      container新建的容器和已经存在的一个容器共享一个网络IP配置而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是用指定的容器共享IP,端口范围等;同样,两个容器除了网络方面,其他的如文件系统,进程列表还是隔离的;
         docker run -it --name=alpine1 alpine /bin/sh         #启动alpine1
         docker run -it --network=container:alpine1 --name=alpine2 alpine /bin/sh   启动alpine2并将其网络配置连接到alpine1
      自定义网络
         1、自定义桥接网络,自定义桥接网络默认使用的是桥接网络bridge;2、新建一个自定义桥接网络(docker network create 新建网络名)3、新建容器加入上一步新建的自定义网络(docker run -d -p 8081:8080 --network 新建网络名 --name=tomcat81 tomcat;   docker run -d -p 8082:8080 --network 新建网络名 --name=tomcat82 tomcat; )4、互相ping服务名进行测试;
posted on 2022-02-21 17:49  文强1032  阅读(28)  评论(0编辑  收藏  举报