• docker


    Docker简介

    Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。

    使用Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。

    容器的特点

    容器化越来越受欢迎,因为容器是:

    • 灵活:即使是最复杂的应用也可以集装箱化。
    • 轻量级:容器利用并共享主机内核。
    • 可互换:可以即时部署更新和升级。
    • 便携式:可以在本地构建,部署到云,并在任何地方运行。
    • 可扩展:可以增加并自动分发容器副本。
    • 可堆叠:可以垂直和即时堆叠服务。

    Docker容器与虚拟机的区别

    容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用共他任何可执行文件的内存,非常轻量。

    虚拟机运行的是一个完整的操作系统,每个虚拟机使用独立的内核,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

    特性

    Docker

    虚拟机

    内核的使用

    共享内核

    独立内核

    启动速度

    秒级(相当于启动一个进程)

    分钟级(启动操作系统)

    计算能力损耗

    几乎无

    损耗 50%左右

    性能

    接近原生

    弱于

    系统支持量(单机)

    上千个

    几十个

    隔离性

    资源隔离/限制

    完全隔离(因为是独立的操作系统)

    操作系统

    主要支持

    几乎所有(KVM)

    封装程度

    只打包项目代码和依赖关系,共享宿主机内核

    完整的操作系统,与宿主机隔离

    linux六大namespace(命名空间):

    namespace

    系统调用参数

    隔离内容

    UTS

    CLONE_NEWUTS

    主机名和域名

    IPC

    CLONE_NEWWIPS

    信号量,消息队列和共享内存

    PID

    CLONE_NEWPID

    进程编号

    NETWORK

    CLONE_NEWNET

    网络设备,网络栈,端口等

    MOUNT

    CLONE_NEWNS

    挂载点(文件系统)

    USER

    CLONE_NEWUSER

    用户和用户组(3.8以后的内核才支持)

    Docker的优点如下:

    1、简化程序

    Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。

    2、避免选择恐惧症

    如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!比如Docker镜像;Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。

    3、节省开支

    一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

    Docker的架构

    Docker daemon(Docker守护进程)

    Docker daemon是一个运行在宿主机(DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。

    Client( Docker客户端)

    Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。

    Images(Docker镜像)

    Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行Docker镜像中的程序。

    Container(容器)

    容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过Docker API或者CLI命令来启停、移动、删除容器。

    Registry

    Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。

    一个Docker Registry可包含多个Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。

    列表包含五列,含义如下:

    NAME:镜像仓库名称。

    DESCRIPTION:镜像仓库描述。

    STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 stars0

    OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护。

     AUTOMATED:表示是否是自动构建的镜像仓库。

    REPOSITORY:镜像所属仓库名称。

    TAG:镜像标签。默认是 latest,表示最新。

    IMAGE ID:镜像 ID,表示镜像唯一标识。

    CREATED:镜像创建时间。

    SIZE: 镜像大小。

    docker基本命令
    1.docker pull [options] NAME[:TAG]

    通过此命令可以docker远程仓库拉取镜像到本地.

    name是拉取镜像的名称,:TAG表示是可选的,如果不选表明时latest,如果选择表明是指定版本的.

    options是拉去的一些参数.

    当不加请求地址的时候回去docker的官网拉取镜像.

    2.docker images [options] [REPOSITORY[:TAG]]

    options是选项,后面是指定镜像的名称.这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像.

    #搜索镜像
    格式:docker search 关键字
    docker search nginx

    #获取镜像
    格式:docker pull 仓库名称[:标签]
    #如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
    docker pull nginx

    #镜像加速下载
    浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置

    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker

    #查看镜像信息
    镜像下载后存放在 /var/lib/docker 。
    Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。

    #查看下载的镜像文件信息
    cat /var/lib/docker/image/overlay2/repositories.json

    #查看下载到本地的所有镜像
    docker images

    REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
    nginx        latest    ae2feff98a0c   9 days ago   133MB
    --------------------------------------------------------------------------------------------
    REPOSITORY:镜像属于的仓库;
    TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
    IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
    CREATED:镜像创建时间;
    VIRTUAL SIZE:镜像大小;
    --------------------------------------------------------------------------------------------

    #根据镜像的唯一标识 ID 号,获取镜像详细信息
    格式:docker inspect 镜像ID号
    docker inspect ae2feff98a0c

    ●lowerdir是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,所以对应的lowerdir是可以有多个目录
    ●upperdir是在lowerdir之上的容器层,这层是可读可写的,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层
    ●MergedDir是表现层,是容器的挂载点
    #为本地的镜像添加新的标签
    格式:docker tag 名称:[标签] 新名称:[新标签]
    docker tag nginx:latest nginx:web

    docker images | grep nginx

    #删除镜像
    格式:
    docker rmi 仓库名称:标签                #当一个镜像有多个标签时,只是删除其中指定的标签
    或者
    docker rmi 镜像ID号                        #会彻底删除该镜像

    注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

    docker rmi nginx:web

    #存出镜像:将镜像保存成为本地文件
    格式:docker save -o 存储文件名 存储的镜像
    docker save -o nginx nginx:latest            #存出镜像命名为nginx存在当前目录下
    ls -lh

    #载入镜像:将镜像文件导入到镜像库中
    格式:
    docker load < 存出的文件
    或者
    docker load -i 存出的文件

    docker load < nginx

    #上传镜像
    默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
    可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
    在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

    docker tag nginx:latest soscscs/nginx:web        #添加新的标签时必须在前面加上自己的dockerhub的username
    docker login                                #登录公共仓库
    Username:soscscs
    password:abc123456
    docker push soscscs/nginx:web                    #上传镜像
    -----------------Docker 容器操作---------------------------
    #容器创建:就是将镜像加载到容器的过程。
    新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

    格式:docker create [选项] 镜像
    常用选项:
    -i:让容器开启标准输入接受用户输入命令
    -t:让 Docker 分配一个伪终端 tty
    -it :合起来实现和容器交互的作用,运行一个交互式会话 shell 

    docker create -it nginx:latest /bin/bash

    #查看容器的运行状态
    docker ps -a            #-a 选项可以显示所有的容器
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS    PORTS     NAMES
    8b0a7be0ff58   nginx:latest   "/docker-entrypoint.…"   57 seconds ago   Created             inspiring_swanson

    容器的ID号       加载的镜像     运行的程序               创建时间       当前的状态  端口映射  名称


    #启动容器
    格式:docker start 容器的ID/名称
    docker start 8b0a7be0ff58
    docker ps -a

    #创建并启动容器
    可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
    注意:容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进程结束容器退出。

    docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。


    当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
    (1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
    (2)利用镜像创建并启动一个容器;
    (3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
    (4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
    (5)分配一个地址池中的 IP 地址给容器;
    (6)执行用户指定的应用程序,执行完毕后容器被终止运行。

    docker run centos:7 /usr/bin/bash -c ls /
    docker ps -a                    #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

    #在后台持续运行 docker run 创建的容器
    需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

    docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"

    docker ps -a                    #可以看出容器始终处于 UP,运行状态
    CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS         PORTS     NAMES
    2592d3fad0fb   centos:7   "/usr/bin/bash -c 'w…"   2 seconds ago    Up 2 seconds             peaceful_chatelet

    docker run -itd --name test1 centos:7 /bin/bash   #创建容器并持续运行容器

    #终止容器运行
    格式:docker stop 容器的ID/名称
    docker stop 2592d3fad0fb

    docker ps -a

    #容器的进入
    需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。

    格式:docker exec -it 容器ID/名称 /bin/bash
    -i 选项表示让容器的输入保持打开;
    -t 选项表示让 Docker 分配一个伪终端。

    docker start 2592d3fad0fb                    #进入容器前,确保容器正在运行
    docker exec -it 2592d3fad0fb /bin/bash
    ls
    exit                #退出容器后,容器仍在运行
    docker ps -a

    docker run -it centos:7 bash      #不加 -d 选项会创建容器后直接进入容器进行交互,但是退出容器,容器也会停止

    #复制到容器中
    echo abc123 > ~/test.txt
    docker cp ~/test.txt 2592d3fad0fb:/opt/

    #从容器复制文件到主机
    docker cp 2592d3fad0fb:/opt/test.txt ~/abc123.txt

    #容器的导出与导入
    用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

    #导出格式:docker export 容器ID/名称 > 文件名
    docker export 2592d3fad0fb > centos7.tar

    docker export -o centos7.tar 2592d3fad0fb

    #导入格式:cat 文件名 | docker import – 镜像名称:标签
    cat centos7.tar | docker import - centos7:test            #导入后会生成镜像,但不会创建容器

    docker import centos7.tar -- centos7:test

    #删除容器
    格式:docker rm [-f] 容器ID/名称
    docker stop 2592d3fad0fb
    docker rm 2592d3fad0fb                #删除已经终止状态的容器

    docker rm -f 2592d3fad0fb            #强制删除正在运行的容器

    docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash            #批量停止容器
    docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop

    docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash                #批量删除所有容器
    docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm

    docker images | awk 'NR>=2{print "docker rmi "$3}' | bash            #批量删除镜像
    docker images | grep none | awk '{print $3}' | xargs docker rmi        #删除none镜像

    docker rm $(docker ps -a -q)        #批量清理后台停止的容器

  • 相关阅读:
    京东二面:Redis为什么快?我说Redis是纯内存访问的,然后他对我笑了笑。。。。。。
    期望值、方差和标准差分别描述了什么?
    【学习】目标检测中的anchor
    网络安全工程师需要学什么?零基础怎么从入门到精通,看这一篇就够了
    [测试] selenium自动化测试
    面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这
    前端sql条件拼接js工具
    PHP生成带中文的图片
    git rebase
    MySQL半同步复制源码解析
  • 原文地址:https://blog.csdn.net/mfuivivig/article/details/128185639