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) 编辑 收藏 举报