文章目录
第一节 Docker容器入门
1.1.1 基础概念
1. Docker是什么
- Docker最初是动态Cloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache 2.0授权协议开源,主要项目代码在GitHub上进行维护。Docker项目后来还加入了Linux基金会,并成立推动开放容器联盟(OCI)
- Docker使用Google公司推出的 Go语言 进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为 容器 。
- Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得 Docker技术比虚拟机技术更为轻便、快捷
2. Docker和传统虚拟机的对比
3. 为什么要使用Docker
4. Docker架构
5. Docker包括三个基本概念:
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
1)Docker镜像
- 我们都知道,操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像centos:7.6就包含了完整的一套centos7.6最小系统的root文件系统。
- Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
2)Docker镜像分层存储
- 因为镜像包含操作系统完整的root文件系统,其体积往往是庞大的,因此在Docker设计时将其设计为分层存储的架构。镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
- 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生再自己这一层。
在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
- 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需要的内容,构建新的镜像。
3)Docker容器
镜像
(Image)和容器
(Container)的关系,就像java中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。- 镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
- 容器存储层的生命周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
- 按照Docker最佳实践的要求,容器不应该向其存储内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用Volume数据卷、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
- 数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,在使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
4)Docker仓库
-
镜像构建文成后,可以很容易的在当前宿主机上运行,但是,如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
-
一个Docker Registry中可以包含多个
仓库
(Repository);每个仓库可以包含多个标签
(Tag);每个标签对应一个镜像。 -
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
-
以centos镜像为例,centos是仓库的名字,其内包含有不同的版本标签,如:6.9、7.5。我们可以通过centos:6.9,或者centos:7.5来具体指定所需哪个版本的镜像。如果忽略了标签,比如centos,那将视为centos:latest。
-
仓库名经常以
两段式路径
形式出现,比如study/nginx,前者旺旺意味着Docker Registry多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于锁使用的具体Docker Registry的软件或服务。
Docker Registry公开仓库
- 常用的Registry是官方的Docker Hub,这也是默认的Registry。除此之外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;Google的Google Container Registry,Kubernetes的镜像使用的就是这个服务。
- 国内的一些云服务商提供了针对Docker Hub的镜像服务,这些镜像服务被称为加速器。常见的有
阿里云加速器
、DaoCloud加速器
等。使用加速器会直接从国内的地址下载Docker Hub的镜像,比直接从Docker Hub下载速度会提高很多。 - 国内也有一些云服务上提供类似于Docker Hub的公开服务。比如
网易云镜像服务
、DaoCloud镜像市场
、阿里云镜像库
等。
Docker Registry 私有仓库
- 除了使用公开服务外,用户还可以在本地搭建私有Docker Registry。Docker官方提供了Docker Registry镜像,可以直接使用作为私有Registry服务。
- 开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持docker命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本Docker Trusted Registry中,提供了这些高级功能。
- 除了官方的Docker Registry外,还有第三方软件实现了Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor和Sonatype Nexus。
1.1.2 安装及加速
1. Docker版本命名
- Docker在1.13版本之后,从2017年的3月1日开始,版本命名规则变为如下
项目 | 说明 |
---|---|
版本格式 | YY.MM |
Stable版本 | 每个季度发行 |
Edge版本 | 每个月发行 |
当前Docker CE Stable版本 | 18.09 |
当前Docker CE Edge版本 | 18.09 |
- 同时Docker划分为CE和EE。CE即社区版(免费,支持周期三个月),EE即企业版,强调安全,付费使用。
2.CentOS安装Docker
- 官方网站上有各种环境下的安装指南,这里主要介绍Docker CE在Linux上的安装。
- 官方安装指南地址:https://docs.docker.com/install/
1)系统要求
- Docker CE支持 64 位版本CentOS 7,并且要求内核版本
不低于3.10
。 - 查看系统内核版本
uname -r
2)卸载旧版本
- 旧版本的Docker称为docker或者docker-engine,使用以下命令卸载旧版本:
sudo yum remove docker docker-common docker-selinux docker-engine
3)使用yum安装
sudo yum install docker-ce
注意:如果安装的是centos7 minimal版本,执行安装提示“没有可用软件包”。这个时候需要安装必要的软件依赖以及更新增加docker-ce yum源。
- 安装相关依赖:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
其中
-y
是不需要提示,全部同意的安装模式
- 添加yum源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4)使用脚本安装
- 在测试或开发环境中Docker官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS系统上可以使用这套脚本安装:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
- 执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE的Edge版本安装在系统中。
5)启动Docker CE
sudo systemctl enable docker #设置开机启动
sudo systemctl start docker
6)建立docker用户组
- 默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix Socket。一般Linux系统上不会直接使用root用户进行操作。因此,需要使用docker的用户加入docker用户组。
sudo groupadd docker #建立docker组
sudo usermod -aG docker $USER #将当前用户加入docker组
7)测试Docker是否安装正确
docker run hello-world #启动一个基于hello-world镜像的容器
docker info #显示docker的详细信息
docker --version #显示docker的详细信息
若能正常输出以上信息,则说明安装成功。
3.CentOS卸载Docker
1)删除docker安装包
sudo yum remove docker-ce
2)删除docker镜像
sudo rm -rf /var/lib/docker
4. 镜像加速器
- 国内从Docker Hub拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker官方和国内很多云服务商都提供了国内加速器服务,例如
- Docker官方提供的中国Registry mirror
- 阿里云加速器
- DaoCloud加速器
- 163加速器
以163加速器为例进行介绍
1)CentOS 7 配置镜像加速
- 对于使用systemd的系统,请在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors":[
"http://hub-mirror.c.163.com"
]
}
- 重新启动服务生效
sudo systemctl daemon-reload
sudo systemctl restart docker
2)检查加速器是否生效
- 配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,如果从结果中看到了如下内容,说明配置成功。
$ docker info
...
Registry Mirrors:
http://hub-mirror.c.163.com
Live Restore Enable:false
1.1.3 Docker常用命令
1. Docker镜像操作
- Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像。
1)获取镜像
- 从Docker镜像仓库获取镜像的命令是docker pull。其命令格式为:
docker pull[选项][Docker Registry 地址[:端口号]/]仓库名[:标签]
- 具体的选项可以通过docker pull --help命令看到,这里我们说一下镜像名称的格式。
- Docker镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是Docker Hub。
- 仓库名:仓库名是两段式名称,即<用户名>/<软件名>。
- 对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
docker pull ubuntu:16.04
- 上面命令中没有给出Docker镜像仓库地址,因此将会从Docker Hub获取镜像。而镜像名称是ubuntu:16.04,因此将会获取官方镜像library/ubuntu仓库中标签为16.04的镜像。
2)运行镜像
- 有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以杀你那的ubuntu:16.04为例,如果我们打算启动里面的bash并且进行交互式操作的话,可以执行:
docker run -it --rm ubuntu:16.04 bash
- -it:这是两个参数,一个是 -i:交互式操作,一个是 -t:终端。
- –rm:这个参数是说容器退出后随之将其删除。
- ubuntu:16.04 : 这是指用ubuntu:16.04镜像为基础来启动容器。
- bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是bash。
- 最后通过exit指令退出这个容器。
- –name参数可以指定容器的名称
- -p
[宿主机端口号]:[容器端口号]
,该命令可以用来将容器的端口映射到宿主机的端口
3)列出镜像
- 想要列出已经下载下来的镜像,可以使用docker images ls命令。列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间。
docker image ls
- 查看镜像、容器、数据卷所占用的空间。
docker system df
- 仓库名、标签均为<none>的镜像成为
虚悬镜像
(dangling image),显示这类镜像:
docker image ls -f dangling=true
- 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
docker image prune
4)删除本地镜像
- 如果要删除本地的镜像,可以使用docker image rm命令,其格式为:
docker image rm [选项]<镜像1>[<镜像2>...]
-
其中,<镜像>可以是镜像短ID、镜像长ID、镜像名或者镜像摘要。
-
使用docker image ls -q来配合docker image rm,这样可以批量删除希望删除的镜像。
docker image rm $(docker image ls -q ubuntu) #删除所有仓库名为ubuntu的镜像
- 或者删除所有在ubuntu:16.04之前的镜像:
docker image rm $(docker image ls -q -f before=ubuntu:16.04)
2. Docker容器操作
- 容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
1)启动容器
- 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
- 因为Docker的容器是轻量级的,用户可以随时删除和新创建容器。
i. 新建并启动
- 使用
docker run
命令启动 - 例如输出一个“Hello World”,之后终止容器。
docker run ubuntu:16.04 /bin/echo 'Hello world'
ii. 启动已终止容器
- 使用
docker container start
或者docker start
命