zoukankan      html  css  js  c++  java
  • docker之旅(第二篇):docker的核心概念与安装配置、使用docker镜像

    一、docker的核心概念

     

    首先介绍Docker 的三大核心概念。 镜像(Image) 容器( Container) 仓库( Repository) 只有理解了这三个核心概念,才能顺利地理解Docker 容器的整个生命周期。

    Docker 的大部分操作都围绕着它的三大核心概念一一镜像、容器和仓库而展开。因此, 准确把握这三大核心概念对于掌握Docker 技术尤为重要。

    1、Docker 镜像

    Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如, 一个镜像可以 包含一个基本的操作系统环境,里面仅安装了Apache 应用程序(或用户需要的其他软件) 。 可以把它称为一个Apache 镜像。

    镜像是创建Docker 容器的基础。通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。

     

    注意:镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

     

    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    Docker 设计时,充分利用 Union FS 的技术,将其设计为分层存储的架构,Docker 镜像由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

     

    2、Docker 容器

    Docker 容器类似于一个轻量级的沙箱, Docker 利用容器来运行和隔离应用。容器是从 镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔 离的、互不可见的。

    可以把容器看做是一个简易版的Linux 系统环境(包括root 用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。

    每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

    按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

    数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。

     

     

    3、Docker 仓库

    Docker 仓库类似于代码仓库,它是Docker 集中存放镜像文件的场所。有时候会看到有资料将Docker 仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签( tag )来进行区分。例如存放Ubuntu 操作系统镜像的仓库称为Ubuntu 仓库,其中可能包括14 .0 4 、12 .04 等不同版本的镜像。

     

    根据所存储的镜像公开分享与否, Docker仓库可以分为公开仓库( Public )和私有仓库( Private )两种形式。目前,最大的公开仓库是官方提供的Docker Hub ,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。

     

    当然,用户如果不希望公开分享自己的镜像文件, Docker 也支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push 命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull 下来就可以了。

     

    可以看出, Docker利用仓库管理镜像的设计理念与Git 非常相似,实际上在理念设计上借鉴了 Git 的很多优秀思想。

     

    二、安装Docker

    Docker 在主流的操作系统和云平台上都可以使用,包括Linux 操作系统(如Ubuntu 、Debian 、CentOS 、Redhat 等)、MacOS 操作系统和Windows 操作系统,以及AWS 等云平台。

    docker安装的系统的要求: 64 位操作系统,内核版本至少为3.10 。Docker 目前支持CentOS 6.5 及以后的版本,推荐使用CentOS 7 系统。

    检查内核版本,必须是3.10及以上
    uname -r
    

      

     

    这里以centos7为例

    环境:

    centos7.5

    关闭selinux

    关闭防火墙

     

    建立docker用户组

    默认情况下,docker命令会使用Unix socket 与docker引擎进行通信,而只有root用户和docker组的用户才可以访问docker引擎的unix socket。处于安全考虑,一般linux系统上不会直接使用root用户。因此,更好的做法是将需要使用的docker的用户加入docker用户组。

    1.创建docker用户组

    sudo groupadd docker
    

      

    2.将当前用户加入docker用户组

    sudo usermod -aG docker $USER
    

      

     

     

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

    docker安装步骤

    ① 卸载旧版本

    # yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-selinux 
                      docker-engine-selinux 
                      docker-engine
    

      

    ② 安装依赖包

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

      

    ③ 安装 Docker 软件包源

    # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    

      

    官方源太慢,建议使用阿里源

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

      

     

    ④ 安装 Docker CE

    # yum install docker-ce
    

      

    ⑤ 启动 Docker 服务

    # systemctl start docker
    

      

    ⑥ 设置开机启动

    # systemctl enable docker
    

      

    ⑦ 验证安装是否成功

    # docker -v
    # docker info
    

      

     

    docker版本

    Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。本文的介绍都针对社区版。

     

    docker服务命令

    systemctl start docker #启动
    systemctl restart docker #重启
    systemctl stop docker #停止
    systemctl status docker #查看状态
    systemctl enable docker #自启动
    systemctl disable docker #禁止自启动
    

      

     

     

    三、使用Docker 镜像

    镜像( image )是Docker 三大核心概念中最为重要的,自Docker 诞生之日起“镜像”就是相关社区最为热门的关键词。 Docker 运行容器前需要本地存在对应的镜像,如果镜像没保存在本地, Docker 会尝试先从默认镜像仓库下载(默认使用Docker Hub 公共注册服务器中的仓库),用户也可以通过配置, 使用自定义的镜像仓库。

    因为国内连接 Docker 的官方仓库很慢,因此我们在日常使用中会使用Docker 中国加速器。通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像。该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker 化应用。

     

    给Docker守护进程配置加速器

    Docker 中国官方镜像加速可通过registry.docker-cn.com访问。该镜像库只包含流行的公有镜像,私有镜像仍需要从美国镜像库中拉取。

    在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

    修改系统中docker对应的配置文件即可,如下:

    vi  /etc/docker/daemon.json
    #添加后
    {
        "registry-mirrors": ["https://registry.docker-cn.com"],
        "live-restore": true
    }
    

      

    重新加载配置并重启docker服务:

    systemctl daemon-reload
    systemctl restart docker
    

      

    可以通过docker info命令查看Registry Mirrors项已经改变

    镜像命令

    ① 搜索镜像 :docker search <NAME> [选项]

    OFFICIAL:是否官方版本;

    ② 下载镜像 :docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

    Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是Docker Hub。

    仓库名:仓库名是两段式名称,既 <用户名>/<软件名> 。对于 Docker Hub,如果不给出用户名,则默认为 library ,也就是官方镜像。

    [root@web docker]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    68ced04f60ab: Pull complete 
    7ecc253967df: Pull complete 
    765957bf98d4: Pull complete 
    91fff01e8fef: Pull complete 
    76feb725b7e3: Pull complete 
    75797de34ea7: Pull complete 
    Digest: sha256:ddf831632db1a51716aa9c2e9b6a52f5035fc6fa98a8a6708f6e83033a49508d
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    [root@web docker]#
    

      

     

    ③ 列出本地镜像 :docker images [选项]

    TAG:标签版本;IMAGE ID:镜像ID;SIZE:镜像大小;

    [root@web docker]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    redis               latest              f0453552d7f2        2 days ago          98.2MB
    ​
    

      

    查看虚悬镜像(镜像既没有仓库名,也没有标签,显示为 <none>):docker images -f dangling=true

    默认的 docker images 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像:docker images -a

    只列出镜像ID:docker images -q

    列出部分镜像:docker images redis

    以特定格式显示:docker images --format "{{.ID}}: {{.Repository}}"

     

     

    ④ 给镜像打 Tag :docker tag <IMAGE ID> [<用户名>/]<镜像名>:<标签>

    镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。

    [root@web docker]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    redis               latest              f0453552d7f2        2 days ago          98.2MB
    [root@web docker]# docker tag f0453552d7f2 redis:official
    [root@web docker]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    redis               latest              f0453552d7f2        2 days ago          98.2MB
    redis               official            f0453552d7f2        2 days ago          98.2MB
    [root@web docker]# 
    ​
    

      

    这里就为镜像f0453552d7f2 增加了新的tag

     

    ⑤ 删除本地镜像 :docker rmi [选项] <镜像1> [<镜像2> ...]

    <镜像> 可以是镜像短 ID、镜像长 ID、镜像名或者镜像摘要。

    删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的Untagged 的信息。

    镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变得非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。

    除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。

     

    docker rmi 某个xx镜像名字ID   删除单个:docker rmi -f 镜像ID
             
    docker rmi name:TAG
     
    

      

     

     

    镜像保存的位置(文件的形式)

     /var/lib/docker/image/overlay2/imagedb/content/sha256

  • 相关阅读:
    微信小程序 scroll-view switch checkbox
    微信小程序 全选和取消全选
    微信小程序 for循环添加样式1
    微信小程序 类似弹出菜单特效,从右向左滑出
    微信小程序 for循环 wx:for和wx:if wx:elif嵌套着使用
    微信小程序 输入框限制字数
    微信小程序 从本地相册选择图片或使用相机拍照chooseImage()和预览图片previewImage()
    安卓开发感言
    安卓-singleTask
    安卓-什么是FrameLayout
  • 原文地址:https://www.cnblogs.com/Nicholas0707/p/12513489.html
Copyright © 2011-2022 走看看