Docker的基础管理
一、初识 Docker
1.Docker 概述
-
Docker 是在 Linux 容器里运行应用的一种开源工具,是一种轻量级的虚拟机,诞生于 2013 年
-
Docker 项目加入了 Linux 基金会,全部开源代码均在 https://github.com/docker 上进行维护,官网为 https://www.docker.com/,Docker 与 OpenStack 同为最受欢迎的云计算开源项目
-
Docker 的 Logo 设计为蓝色的鲸鱼,拖着许多集装箱,如上图所示,鲸鱼可以看做是宿主机,集装箱可以理解为是相互隔离的容器,每个集装箱内都有自己的应用程序(沙箱/沙盘)
-
Docker 的设计理念:Build、Ship and Run Any APP,Any where,即通过对应用组件的封装、发布、部署和运行等生命周期的管理,达到应用组件级别的“一次封装、到处运行”的目的
-
这里的组件,可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统
2.Docker 容器与传统虚拟化的比较
- 小而灵活,效率至上!
①Docker 的优点
-
有没有这样一种技术,能够方便地创建运行在云平台上的应用,可以脱离底层的硬件支持,且在任何时间任何地点均可获取这些资源?(Docker!)
-
Doker 的容器技术可以在一台主机上轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器,通过容器来打包应用程序,简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率!
-
简答点说,就是彼此都是使用的是 Docker,那么就能完成平滑的过度,实现任意服务的迁移,也即这个服务时跑在 Docker 容器上的,别的不管!
-
例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了
②Docker 与传统虚拟机相比具有显著的优势
-
Docker 容器的启动与停止可以在秒级实现
-
Docker 核心解决的问题是利用容器来实现类似 VM 的功能,实现以更加节省的硬件资源提供给用户更多的计算资源
-
Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,在保持性能的同时,有效地减少了系统开销,使得能在一台主机上运行数千个 Docker 容器
-
Docker 运行方便,可以通过 Dockerfile 配置文件支持灵活的自动化创建和部署
更直观的总结表如下
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗50%作用 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
- 容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了
- 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制
Docker 拥有的众多优势与操作系统虚拟化的特点是分不开的:
- 传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层
- 而 Docker 容器是直接再操作系统层面之上实现的虚拟化
二、Docker 的核心概念及安装
1.镜像(Image)
Docker 镜像是创建容器的基础,类似于虚拟机的快照
可以理解为是一个面向 Docker 容器引擎的只读模板,比如:
-
一个镜像可以是一个完整的 CentOS 操作系统环境,称之为一个 CentOS 镜像
-
一个安装了 MySQL 的应用程序,称之为是一个 MySQL 镜像
-
…
Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经做好的应用镜像来直接使用,好强大啊!
2.容器(Container)
Docker 的【容器】是【从镜像创建的运行实例】,它可以被【启动、停止和删除】,容器即服务
-
创建的每一个容器都是相互隔离、互不可见的,相互之间隔离性超强,从而保证平台的安全性
-
可以把容器看做是一个简易版本的 Linux 环境,Docker 可以利用容器来运行和隔离一个个应用
3.仓库(Repository)
Docker 仓库时用来集中保存镜像的地方
-
创建完自己的镜像后,可以使用【push】命令将其上传至【公共仓库(public)】或【私有仓库(Private)】
-
之后,在另一台机器上使用这个镜像,直接【pull】下来就可以了,不要太方便!
- 仓库注册服务器【Registry】是存放仓库的地方,其中包含了多个仓库,每个仓库存放某一类镜像,并使用不同的标签【tag】来区分它们
- 目前最大的公共仓库是【Docker Hub】
4.安装 Docker
Docker 支持在主流的操作系统平台上使用,比如:Windows、Linux 和 MacOS 系统
- 官方 docker 安装技术文档:https://docs.docker.com/engine/install/centos/
- 阿里云 docker 安装技术文档:https://developer.aliyun.com/article/110806
建议看看这些技术文档!
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
--
'#在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker'
'#设置存储库,安装yum-utils软件包(提供yum-config-manager实用程序)并设置稳定的存储库'
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
--
'## 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息'
'#例如,docker-ce 17.03 之后,需要先安装docker-ce-selinux!'
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
--
'#安装最新版本的Docker Engine和容器'
'#docker-ce-cli是docker命令行工具包,containerd.io是容器接口相关包'
yum install -y docker-ce docker-ce-cli containerd.io
--
'#启动docker'
systemctl start docker
systemctl enable docker
--
'#通过运行hello-world映像来验证是否正确安装了Docker Engine'
sudo docker run hello-world
--
'#检查docker版本'
docker version
安装好的 Docker 有两个程序:Docker 服务端和 Docker 客户端
-
Docker 服务端是一个服务进程,管理所有的容器
-
Docker 客户端是 Docker 服务端的远程控制器,可以用来控制 Docker 的服务端进程
-
Docker 服务端和客户端在大多数情况下是运行在一台及其上的
5.如何安装特定版本的 Docker?
-
若安装或更新的始终是最高版本,可能满足不了关于稳定性的需求
-
我们可以在存储库中列出可用版本,看看都有哪些版本:
'#列出并排序存储库中可用的版本,按按版本号(从高到低)对结果进行排序,并被截断'
yum list docker-ce --showduplicates | sort -r
...
...
--
'#卸载Docker Engine,CLI和Containerd软件包'
yum remove -y docker-ce docker-ce-cli containerd.io
'#主机上的映像,容器,卷或自定义配置文件不会自动删除,要删除所有图像,容器和卷'
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
'#注:必须手动删除所有已编辑的配置文件'
--
'#例:【docker-ce-18.09.1】'
sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
systemctl start docker
docker version
6.加餐 - key.json | docker0 | PAT 端口多路复用技术
cd /etc/docker
'//Docker安装好后,该目录下会生成一个新文件key.json'
- 你可以查看下内容,该文件是去官方公共仓库下载镜像的密钥,json 格式是键值对的形式(key-value)
- 从开发的角度来看,键值对更高效
ifconfig
'//安装完docker后,ifcong,会发现多了一块docker0网卡'
它是容器的网桥,让容器彼此之间相连
PAT:端口多路复用技术,及能够实现多个地址统一转换为一个地址对外(172.17.0.1/24)
三、Docker 镜像操作
-
Docker 运行容器前需要本地存在对应的镜像,如果不存在本地镜像,Docker 就会尝试从默认镜像仓库【https://hub.docker.com】下载,这是 Docker 官方维护的一个公共仓库,可以满足用户的绝大部分需求
-
当然了,用户也可以通过配置来使用自定义的镜像仓库
①搜索镜像–docker search
'命令格式:'
docker search [对象]
'例:'
docker search nginx
'#默认输出结果会按照星级评价进行排序'
docker search -f stars=1000 nginx
'#可以使用选项"-f"配合"stars=x"显示指定星级以上的镜像'
- 一般官方项目组维护的镜像使用单个单词,例如【nginx】作为镜像名称,我们称之为基础镜像或根镜像
- 像【mailu/nginx】这种命名方式的镜像,表示是由 Docker Hub 的用户【mailu】创建并维护的镜像,带有用户名为前缀
- 是否主动创建表示是否允许用户验证镜像的来源和内容
- 使用【docker search】命令只能查找镜像,无法获取镜像的标签,若需要查找 docker 的标签,需要从网页上访问镜像仓库https://hub.docker.com
②获取镜像–docker pull
搜索到了符合需求的镜像,我们可以使用【docker pull】命令从网络下载镜像到本地使用
'命令格式:'
docker pull [仓库名称][:标签]
'例:'
docker pull mailu/nginx
-
标签【tag】就是用来区分镜像版本的,可以看到没有指定标签,这里会默认下载仓库中最新版本的镜像,即选择【latest】标签
-
在整个下载的过程中,我们可以看出,整个镜像文件是由若干层【layer】组成,我们将其称之为【AUFS】,即联合文件系统,其实现了增量保存与更新的基础,在下载过程中会输出镜像的各层信息
-
镜像下载到本地后,我们就可以随时使用该镜像了
-
用户也可以选择从其他注册服务器仓库下载,需要在仓库名称前指定完整的仓库注册服务器地址
③查看镜像信息–docker images/inspect/tag
'命令格式:'
docker images [仓库名称][:标签]
'例:'
docker images
信息 | 说明 |
---|---|
REPOSITORY | 镜像属于的仓库 |
TAG | 镜像的标签信息,标记了同一个仓库中的不同镜像 |
IMAGE ID | 镜像的唯一 ID 号,是镜像的唯一标识 |
CREATED | 镜像的创建时间 |
SIZE | 镜像的大小 |
用户还可以根据镜像的唯一标识 ID 号来获取镜像的详细信息
'命令格式:'
docker inspect [镜像ID号]
'例:'
docker inspect 23089a8ec5aa
'#这是wodby/nginx的镜像ID号'
'#显示篇幅较长'
为了更方便在后续的工作中使用下载好的镜像,我们可以使用【docker tag】命令来为本地的镜像添加新的标签
'命令格式:'
docker tag 名称:[标签] 新名称:[新标签]
'例:'
docker tag mailu/nginx nginx123:nginx
docker images|grep nginx
④删除镜像–docker rmi
-
可以使用【docker rmi】命令删除镜像
-
删除镜像的方法有两种:使用镜像的标签或 ID
'命令格式:'
docker rmi [仓库名称][:标签]
或
docker rmi [镜像ID号]
'例:'
docker images|grep nginx
docker rmi nginx123:nginx
'#当一个镜像有多个标签时,该命令只会删除多少标签中的这个指定标签,而不会影响镜像文件'
'#若该镜像只有一个标签就要注意了,再使用该命令会直接彻底删除该镜像!'
docker rmi 97788821c58b
'#选择参数为镜像ID号时要谨慎,必须首先确保该镜像当前没有被容器使用'
'#如果该镜像已被容器使用,则需先删除所以依赖该镜像的容器,再删除该镜像'
'#删除时系统会先删除指向该镜像的所有标签,然后删除镜像本身'
docker images|grep nginx
⑤存出镜像和载入镜像–docker save/load
-
如果你需要进行镜像迁移,需要先将镜像保存至本地文件,之后可以拷贝该文件至其他主机
-
这一过程称之为存出镜像,使用【docker save】命令操作
'命令格式:'
docker save -o [存储文件名] [存储镜像]
'例:'
docker save -o nginx nginx
ls -l nginx
--
scp nginx root@192.168.239.102:nginx
'#传至另一台主机'
-
如果需要将存出的镜像从主机 A 迁移至主机 B 上使用,可以将该导出文件导入到主机 B 的镜像库中
-
这一过程称之为载入镜像,使用【docker load】进行载入操作
'命令格式:'
docker load <[存出文件]
'例:'
docker load <nginx
docker images|grep nginx
⑥上传镜像–docker login/push
-
在本地存出的镜像越来越多,我们可以指定一个仓库来存放这些镜像
-
目前最方便的就是公共仓库,默认是上传到 Docker Hub 官方仓库,但需要注册使用公共仓库的账号,可以使用【docker login】命令输入用户名、密码和邮箱来登录
'例:'
docker login
--
'需要先去【https://hub.docker.com】注册一个账号,注册过程很简单'
在上传镜像前需要对本地镜像添加新的标签,然后再使用【docker push】命令进行上传
'命令格式:'
docker tag [名称][:标签] [账号名][/名称][:新标签]
docker push [账号名][/名称][:新标签]
'例:'
docker tag nginx:latest qq1605963524/nginx:centos7
docker push qq1605963524/nginx:centos7
四、Docker 容器操作
容器是 Docker 的另一个核心概念:
-
容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境
-
包括文件系统、系统类库、Shell 环境等等
-
镜像就像一个只读模板,而容器会给这个只读模板一个额外的可写层
①容器的创建与使用–docker create/ps/start/run
容器的创建就是将镜像加载到容器的过程:
-
Docker 的容器十分的轻量级,用户可以随机创建或删除
-
新创建的容器默认处于停止状态,即不会自行开始运行任何程序
-
需要开启一个进程来启动容器,该进程是容器的唯一进程,即该进程终止时,容器也会被完全终止
-
停止后的容器可以重启启动并保留原有的修改
'命令格式:'
docker create [选项] [镜像] [运行的程序]
'常用选项:'
-i:让容器的输出保持打开
-t:让Docker分配一个伪终端
'例:'
docker create -it nginx /bin/bash
'#创建新容器后,会返回一个唯一的ID'
--
docker ps -a
'#可以使用该命令查看索引容器的运行状态'
'#“-a”选项表示列出系统最近一次启动的容器'
--
docker start [容器的ID/名称]
'#启动停止状态下的容器'
-
如果想直接创建并使用容器,可以使用【docker run】命令,等同于先执行【docker create】,再执行【docker start】
-
需要注意的是,执行该命令,只要后面的命运行结束,容器就会停止
使用【docker run】命令创建容器时,Docker 在后台的标准运行过程:
- 检查本地是否存在指定镜像,若不存在,则会从公共仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统给容器,在只读的镜像层外挂载一层可读写层
- 从宿主机配置的网桥接口中桥接一个虚拟机至容器中
- 分配一个地址池中的 IP 给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止运行
'例:创建容器并启动执行一条shell命令'
docker run centos /usr/bin/bash -c ls /
--
docker ps -a
'#查看容器的状态,会发现在执行完命令后就终止了'
--
docker run -d centos /usr/bin/bash -c "while true;do echo hello world;done"
'#可以添加“-d”选项,可以让docker以守护进程形式在后台运行,即可以在后台持续运行该容器'
'#注:该容器所运行的程序一旦结束,容器也就会被终止'
docker ps -a
②容器的运行与终止–docker stop
'命令格式:'
docker stop [容器的ID/名称]
'例:'
docker stop fcd5691107cf
docker stop a17b5d224f47
docker ps -a
'#Exuted即终止状态'
③容器的进入–docker exec
需要进入容器进行相应操作时,可以使用【docker exec】命令进入运行中的容器
'命令格式:'
docker exec -it [容器ID/名称] /bin/bash
'例:'
docker exec -it 4aa9da25318d /bin/bash
'#用户可以通过所创建的终端来输入命令'
④容器的导出与导入–docker export/import
- 首选需要将已创建好的容器导出为文件,使用【docker export】命令实现,该容器当前处于运行状态也可以正常导出
- 导出后将该文件传输至其他主机,通过相应的导入命令以实现容器的迁移
- 与镜像的迁移基本同理
'命令格式:'
docker export [容器ID/名称] >文件名
'例:'
docker export 4aa9da25318d >nginx01
ls -l nginx01
--
scp nginx01 root@192.168.126.16:nginx01
前往远程输出至的主机进行下一步操作
使用【docker import】命令导入,成为镜像
'命令格式:'
cat [文件名] |docker import - [生成的镜像名称][:标签]
'例:'
ls -l nginx01
cat nginx01 |docker import - nginx01:xcf
'#导入文件nginx01成为本地镜像'
--
docker images |grep nginx
⑤容器的删除–docker rm
可以使用【docker rm】命令将一个已处于终止状态的容器删除
'命令格式:'
docker rm [容器ID/名称]
'例:'
docker ps -a
docker rm docker rm fcd5691107cf a17b5d224f47 cf7eb18ebf28 fb95ffa44044 2ee2c9d515b3 e88f1ded4cd
docker ps -a
如果要删除一个正在运行的容器,可以添加“-f”选项以强制删除,但是不建议这么做,最好先停止容器再进行删除操作!
- Docker 默认的存储目录在 /var/lib/docker,Docker 的镜像、容器、日志等内容全部都存储于此
可以单独使用大容量的分区来存储这些内容,并且一般选择建立 LVM 逻辑卷,从而避免 Docker 在运行的过程中发生存储目录容量不足的问题