本章大纲:
- 1.什么是Docker
- 2.Docker的三大核心是什么
- 3.Docker的概念及安装
一、揭开Docker的神秘面纱
1.Docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。
Docker作为开源社区最火爆的项目,它是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”,docker的全部源代码都在https://github.com/docker 进行相关维护,其官网是:https://www.docker.com 。
docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的,传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层,而docker是直接在操作系统层面之上实现的虚拟化,二者的工作示意图如下:
2.为什么要用Docker
* Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
* 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
* 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
* 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
* 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
* 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署
3.Docker和虚拟机的区别
作为一种轻量级的虚拟化方式,Docker与传统虚拟机相比具有显著的优势。
Docker容器很快,启动和停止可以在秒级实现,比传统虚拟机要快很多,Docker核心解决的问题是利用容器来实现类似VM的功能,从而利用更节省的硬件资源提供给更多的计算资源,所以Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而在保证应用性能的同时,减小系统开销,使得在一台主机上同时运行数千Docker容器成为可能,Docker操作方便,还可以通过Dockerfile配置文件支持灵活的自动化创建和部署。
下表对使用Docker容器技术与传统虚拟化技术的特性进行了比较。
4.Docker的使用场景
现在开发者需要能更方便地运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间地点可获得这些资源,这正是Docker所能提供的。Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器,通过这种容器打包应用程序,意味着简化了重新部署,调试这些琐碎的重复工作,极大地提高了工作效率,列如,服务器从腾讯云迁移到阿里云,如果采用Docker容器技术,迁移只需要在新的服务器上启动需要的容器即可。
二、Docker的三大核心
1、镜像
docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向docker容器引擎的只读模板,比如,一个镜像可以是一个完整的centos操作系统环境,称为一个centos镜像;可以是一个安装了MySQL的应用程序,称为一个MySQL镜像,等等。
docker提供了简单的机制来创建和更新现有的镜像,我们也可以从网上下载已经做好的应用镜像来直接使用。
2、容器
docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,可以保证安全性的平台,可以把容器看做一个简易版的Linux环境,docker利用容器来运行和隔离应用。
3、仓库
docker仓库是用来几种保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到共有仓库或者私有仓库,这样一来当下次要在另一台机器上使用这个镜像时,只需要从仓库上拉去取下来就可以了。
仓库注册服务器是存放仓库的地方,其中包含了多个仓库,每个仓库集中存放某一类镜像,并且使用不同的标签来区分他们。目前最大的公共仓库是docker hub,存放了数量庞大的镜像提供用户下载使用。
docker默认的存储目录在/var/lib/docker,docker的镜像、容器、日志等内容全部都存储在这里,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM逻辑卷,从而避免docker运行过程中存储目录容量不足的问题。
三、安装Docker的基础操作
1、安装及启动
安装时,必须保证服务器配置可上网,或者自行配置本地yum源也可以,
[[email protected] ~]# yum -y install docker #直接安装
[[email protected] ~]# systemctl start docker #启动docker服务
[[email protected] ~]# systemctl enable docker #设置为开机自启动
[[email protected] ~]# docker version #查看安装的docker版本
2、docker的镜像操作
(1)查找镜像
docker运行容器前需要本地存在相应的镜像,如果不存在本地镜像,docker就会尝试从默认镜像仓库https://hub.docker.com/ 进行查找。
[[email protected] ~]# docker search dhcp #以DHCP作为关键字进行搜索镜像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/networkboot/dhcpd Suitable for running a DHCP server for you... 40 [OK]
docker.io docker.io/joebiellik/dhcpd DHCP server running on Alpine Linux 14 [OK]
docker.io docker.io/gns3/dhcp A DHCP container for GNS3 using dnsmasq 2 [OK]
docker.io docker.io/instantlinux/dhcpd-dns-pxe Serve DNS, DHCP and TFTP from a small Alpi... 2 [OK]
docker.io docker.io/ictu/dhcpd-tftpd dhcpd tftpd container 1 [OK]
.................#省略部分内容
返回很多包含DHCP关键字的镜像,其中返回的信息包括镜像名称(NAME)、描述(DESCRIPTION)、星级(STARS)、是否官方创建(OFFICIAL)、是否主动创建(AUTOMATED)。默认的输出结果会按照星级评价进行排序,表示该镜像的受欢迎程度,在下载镜像时,可以参考这一项,星级越高表示越受欢迎;是否为官方镜像一项是指是否由官方项目组创建和维护的镜像,一般官方项目组维护的镜像使用单个单词作为镜像名称,我们称为基础镜像或者根镜像。如/reinblau/dhcp这种命名方式的镜像,表示是由docker hub的用户reinblau创建并维护的镜像,带有用户名为前缀;是否主动创建资源则是指是否允许用户验证镜像的来源和内容。
(2)下载镜像
搜索到符合需求的镜像,可以使用docker pull命令从网络下载镜像到本地使用。
命令格式:docker pull 仓库名称[:标签]
对于docker镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest,也可通过指定的标签来下载特定版本的某一镜像。这里标签就是用来区分镜像版本的。
如下,下载一个镜像
[[email protected] ~]# docker pull docker.io/networkboot/dhcpd #下载查询出来的某个镜像
[[email protected] ~]# docker images #查询下载的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/networkboot/dhcpd latest 52cbff801df2 5 months ago 105 MB
从回显的信息可以读出以下信息:
#REPOSITORY:镜像属于的仓库;
#TAG :镜像的标签信息,标记同一个仓库中的不同镜像;
#IMAGE ID:镜像的唯一ID号,唯一标识了该镜像;
#CREATED:镜像创建的时间;
#SIZE:镜像的大小
用户还可以根据镜像的唯一标识ID号,获取镜像的详细信息。命令如下:
[[email protected] ~]# docker inspect 52cbff801df2 #获取镜像的详细信息
#镜像的详细信息中包括创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
#为了在后续的工作使用这个镜像,可以用docker tag命令来为本地镜像添加新的标签,
#命令格式:docker tag名称:[标签] 新名称:[新标签],具体操作如下:
[[email protected] ~]# docker tag docker.io/networkboot/dhcpd dchp:dhcp #改新名称及标签
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dchp dhcp 52cbff801df2 5 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 5 months ago 105 MB
(3)删除镜像
会发现原来的镜像还在,那么删除原来的镜像试试吧!
使用docker rmi命令可以删除多余的镜像,可以指定标签进行删除,也可以指定ID删除镜像
删除镜像的命令格式:docker rmi 仓库名称:标签或docker rmi 镜像ID号,当一个镜像有多个标签的时候,指定标签只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只是删除了镜像的一个标签而已,但当该镜像只剩下一个标签的时候就要注意了,再使用删除命令就会彻底删除该镜像。
[[email protected] ~]# docker rmi docker.io/networkboot/dhcpd #删除原本的镜像标签
Untagged: docker.io/networkboot/dhcpd:latest
Untagged: docker.io/networkboot/[email protected]:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b67
当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身,如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
(4)导出镜像
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存位本地文件,这一过程叫做导出镜像,可以使用docker save命令进行存出操作,之后就可以复制该文件到其他机器上。
命令格式:docker save -o 存出镜像为本地文件
如下:
[[email protected] ~]# docker images #获取镜像名称及标签
REPOSITORY TAG IMAGE ID CREATED SIZE
dchp dhcp 52cbff801df2 5 months ago 105 MB
[[email protected] ~]# docker save -o dhcptest dchp:dhcp #导出为本地镜像
[[email protected] ~]# du -sh dhcptest #会导出至本地当前工作目录
103M dhcptest
(5)载入镜像
将导出的镜像从A机器复制到B机器,需要在B机器上使用该镜像,就可以将该导出文件导入到B机器中的镜像库中,这一过程叫做载入镜像。
命令格式为(从文件dhcp中载入镜像导本地镜像库中):
[[email protected] ~]# docker load --input dhcp
#或者
[[email protected] ~]# docker load < dhcp
(6)上传镜像
本地存储的镜像越来越多,就需要指定一个专门存放这些镜像的地方——仓库,比较简单的就是公共仓库,默认上传到dockerhub官方仓库,需要注册使用公共仓库的账号,可以使用docker login命令来输入用户名,密码和邮箱来完成注册和登录,在上传镜像之前还需要对本地镜像添加新的标签,然后再使用docker push命令进行上传。
命令格式:docker push 仓库名称:标签
[[email protected] ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don‘t have a Docker ID, head over to https://hub.docker.com to create one.
Username: ljztest #输入注册的用户名
Password: #输入密码
Login Succeeded #提示登录成功
[[email protected] ~]# docker push docker.io/ljztest/dhcp
#在这里登录上传时,报错,发现是因为镜像的仓库名称有问题,根据提示改了下仓库名称,就上传成功了
The push refers to a repository [docker.io/ljztest/dhcp]
8d3d1c857813: Pushed
37ee4253c76e: Pushed
b57c79f4a9f3: Pushed
d60e01b37e74: Pushed
e45cfbc98a50: Pushed
762d8e1a6054: Pushed
testdhcp: digest: sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477 size: 1569
、docker的容器操作
容器是docker的另一个核心概念,简单来说,容器是镜像的一个运行实例,是独立运行的一个或一组应用及它们所必需的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
(1)容器的创建与启动
docker的创建就是将镜像加载到容器的过程,docker的容器十分轻量级,用户可以随时创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中一个发起一个进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。可以使用docker create 命令新建一个容器。
1)创建容器
命令如下(-i:表示让容器的输入保持打开,就是容器一直运行;-t:是让docker分配一个伪终端):
[[email protected] ~]# docker create -it dchp:dhcp /bin/bash #创建一个容器,并指定伪终端
2304f92a815800305804987bcb2ee20aca5f4d651d577427c476554d54171f2d
#如果此刻创建容器命令报错“WARNING:IPv4 forwarding is disabled.Network will bot
#work.”,就使用vim编辑器打开/usr/lib/sysctl.d/00-system.conf文件,在其中添加
#net.ipv4.ip_forward=1,然后使用systemctl start network命令重启网络服务即可
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2304f92a8158 dchp:dhcp "/entrypoint.sh /b..." 8 minutes ago Created naughty_perlman
#输出的信息显示容器的ID号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射、容器名称等。
#上面查出的状态一栏是create表示当前的容器是新创建的并处于停止状态。
2)启动和停止容器
[[email protected] ~]# docker ps -a #先查出容器的ID号
CONTAINER ID IMAGE COMMAND CREATE
2304f92a8158 dchp:dhcp "/entrypoint.sh /b..." 10 min
[[email protected] ~]# docker start 2304f92a8158 #启动时,需指定容器的ID号
2304f92a8158
[[email protected] ~]# docker ps -a #再查询容器的状态,会发现状态栏变成了UP
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2304f92a8158 dchp:dhcp "/entrypoint.sh /b..." 23 minutes ago Up 42 seconds naughty_perlman
[[email protected] ~]# docker stop 2304f92a8158 #停止这个容器
2304f92a8158
[[email protected] ~]# docker ps -a #再次查看状态,会发现状态栏变成了exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2304f92a8158 dchp:dhcp "/entrypoint.sh /b..." About an hour ago Exited (0) 4 seconds ago naughty_perlman
3)进入容器
[[email protected] ~]# docker start 2304f92a8158 #再次启动这个容器
[[email protected] ~]# docker exec -it 2304f92a8158 /bin/bash #进入这个容器
[email protected]:/# ls #查看这个容器的根目录,可以看到进入容器后命令提示符发生了变化
bin dev etc lib media opt root sbin sys usr
boot entrypoint.sh home lib64 mnt proc run srv tmp var
[email protected]:/# exit #退出这个容器
exit
[[email protected] ~]#
(2)容器的导出与导入
[[email protected] ~]# docker ps -a #查询容器的ID号
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2304f92a8158 dchp:dhcp "/entrypoint.sh /b..." About an hour ago Up 6 minutes naughty_perlman
[[email protected] ~]# docker export 2304f92a8158>centos7dhcp #导出到当前工作目录,并定义名字为centos7dhcp
[[email protected] ~]# ls #查看导出的文件,下面标红的就是导出的文件
anaconda-ks.cfg ‘centos7dhcp‘ dhcptest initial-setup-ks.cfg
#将导出的文件复制到另一台服务器上,之后使用docker import 命令导入,成为镜像
[[email protected] ~]# scp [email protected]:/root/centos7dhcp /tmp #在另一台服务器进行复制
[email protected]‘s password: #输入对端的用户密码
centos7dhcp 100% 84MB 95.2MB/s 00:00
[[email protected] ~]# cd /tmp
[[email protected] tmp]# ls #确定复制过来了
centos7dhcp
.............#省略部分内容
[[email protected] tmp]# cat centos7dhcp | docker import - centos7:dhcp
#导入文件centos7dhcp成为本地镜像
sha256:e016fa46360492daa9323a0d35bccec76610433f03ba9171fe6d9a5500f823ff
[[email protected] tmp]# docker images | grep centos7 #确定镜像导入成功
centos7 dhcp e016fa463604 14 minutes ago 84.7 MB
(3)容器的删除
可以使用docker rm命令将一个已经终止状态的容器进行删除。
[[email protected] ~]# docker ps -a #还是需要查出容器的ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2304f92a8158 dchp:dhcp "/entrypoint.sh /b..." About an hour ago Up 35 minutes naughty_perlman
[[email protected] ~]# docker stop 2304f92a8158 #删除容器前需要先停止容器
2304f92a8158
[[email protected] ~]# docker rm 2304f92a8158 #删除容器
2304f92a8158
如果删除一个正在运行的容器,可以添加-f选项强制删除,但是建议先将容器停止再进行删除。
———————— 本文至此结束,感谢阅读 ————————``
原文地址:https://blog.51cto.com/14223370/2453418