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

posted on 2019-12-17 21:15  Nicholas--  阅读(288)  评论(0编辑  收藏  举报

导航