Docker容器的详解与配置

本章大纲:

  • 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是直接在操作系统层面之上实现的虚拟化,二者的工作示意图如下:
Docker容器的详解与配置

2.为什么要用Docker

* Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
* 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
* 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
* 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
* 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
* 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

3.Docker和虚拟机的区别
作为一种轻量级的虚拟化方式,Docker与传统虚拟机相比具有显著的优势。
Docker容器很快,启动和停止可以在秒级实现,比传统虚拟机要快很多,Docker核心解决的问题是利用容器来实现类似VM的功能,从而利用更节省的硬件资源提供给更多的计算资源,所以Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而在保证应用性能的同时,减小系统开销,使得在一台主机上同时运行数千Docker容器成为可能,Docker操作方便,还可以通过Dockerfile配置文件支持灵活的自动化创建和部署。
下表对使用Docker容器技术与传统虚拟化技术的特性进行了比较。
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源也可以,

[root@localhost ~]# yum -y install docker       #直接安装
[root@localhost ~]# systemctl start docker     #启动docker服务
[root@localhost ~]# systemctl enable docker     #设置为开机自启动
[root@localhost ~]# docker version      #查看安装的docker版本

2、docker的镜像操作
(1)查找镜像
docker运行容器前需要本地存在相应的镜像,如果不存在本地镜像,docker就会尝试从默认镜像仓库https://hub.docker.com/ 进行查找。

[root@localhost ~]# 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,也可通过指定的标签来下载特定版本的某一镜像。这里标签就是用来区分镜像版本的。

如下,下载一个镜像

[root@localhost ~]# docker pull docker.io/networkboot/dhcpd           #下载查询出来的某个镜像
[root@localhost ~]# 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号,获取镜像的详细信息。命令如下:
[root@localhost ~]# docker inspect 52cbff801df2      #获取镜像的详细信息
#镜像的详细信息中包括创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
#为了在后续的工作使用这个镜像,可以用docker  tag命令来为本地镜像添加新的标签,
#命令格式:docker tag名称:[标签] 新名称:[新标签],具体操作如下:
[root@localhost ~]# docker tag docker.io/networkboot/dhcpd dchp:dhcp    #改新名称及标签
[root@localhost ~]# 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号,当一个镜像有多个标签的时候,指定标签只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只是删除了镜像的一个标签而已,但当该镜像只剩下一个标签的时候就要注意了,再使用删除命令就会彻底删除该镜像。

[root@localhost ~]# docker rmi docker.io/networkboot/dhcpd    #删除原本的镜像标签
Untagged: docker.io/networkboot/dhcpd:latest
Untagged: docker.io/networkboot/dhcpd@sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b67

当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身,如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

(4)导出镜像
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存位本地文件,这一过程叫做导出镜像,可以使用docker save命令进行存出操作,之后就可以复制该文件到其他机器上。
命令格式:docker save -o 存出镜像为本地文件
如下:

[root@localhost ~]# docker images          #获取镜像名称及标签
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dchp                dhcp                52cbff801df2        5 months ago        105 MB
[root@localhost ~]# docker save -o dhcptest dchp:dhcp      #导出为本地镜像
[root@localhost ~]# du -sh dhcptest              #会导出至本地当前工作目录
103M    dhcptest

(5)载入镜像
将导出的镜像从A机器复制到B机器,需要在B机器上使用该镜像,就可以将该导出文件导入到B机器中的镜像库中,这一过程叫做载入镜像。
命令格式为(从文件dhcp中载入镜像导本地镜像库中):

[root@localhost ~]# docker load --input dhcp
#或者
[root@localhost ~]# docker load < dhcp

(6)上传镜像
本地存储的镜像越来越多,就需要指定一个专门存放这些镜像的地方——仓库,比较简单的就是公共仓库,默认上传到dockerhub官方仓库,需要注册使用公共仓库的账号,可以使用docker login命令来输入用户名,密码和邮箱来完成注册和登录,在上传镜像之前还需要对本地镜像添加新的标签,然后再使用docker push命令进行上传。
命令格式:docker push 仓库名称:标签

[root@localhost ~]# 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                     #提示登录成功
[root@localhost ~]# 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分配一个伪终端):

[root@localhost ~]# 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命令重启网络服务即可
[root@localhost ~]# 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)启动和停止容器

[root@localhost ~]# docker ps -a                #先查出容器的ID号
CONTAINER ID        IMAGE               COMMAND                  CREATE
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   10 min
[root@localhost ~]# docker start 2304f92a8158              #启动时,需指定容器的ID号
2304f92a8158
[root@localhost ~]# 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
[root@localhost ~]# docker stop 2304f92a8158        #停止这个容器
2304f92a8158
[root@localhost ~]# 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)进入容器

[root@localhost ~]# docker start 2304f92a8158              #再次启动这个容器
[root@localhost ~]# docker exec -it 2304f92a8158 /bin/bash     #进入这个容器
root@2304f92a8158:/# ls  #查看这个容器的根目录,可以看到进入容器后命令提示符发生了变化
bin   dev            etc   lib    media  opt   root  sbin  sys  usr
boot  entrypoint.sh  home  lib64  mnt    proc  run   srv   tmp  var
root@2304f92a8158:/# exit       #退出这个容器
exit
[root@localhost ~]# 

(2)容器的导出与导入

[root@localhost ~]# 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
[root@localhost ~]# docker export 2304f92a8158>centos7dhcp  #导出到当前工作目录,并定义名字为centos7dhcp
[root@localhost ~]# ls      #查看导出的文件,下面标红的就是导出的文件
anaconda-ks.cfg  'centos7dhcp'  dhcptest  initial-setup-ks.cfg
#将导出的文件复制到另一台服务器上,之后使用docker  import 命令导入,成为镜像
[root@localhost ~]# scp [email protected]:/root/centos7dhcp /tmp     #在另一台服务器进行复制
[email protected]'s password:                 #输入对端的用户密码
centos7dhcp                         100%   84MB  95.2MB/s   00:00    
[root@localhost ~]# cd /tmp
[root@localhost tmp]# ls     #确定复制过来了
centos7dhcp
 .............#省略部分内容
 [root@localhost tmp]# cat centos7dhcp | docker import - centos7:dhcp     
 #导入文件centos7dhcp成为本地镜像
sha256:e016fa46360492daa9323a0d35bccec76610433f03ba9171fe6d9a5500f823ff
[root@localhost tmp]# docker images | grep centos7        #确定镜像导入成功
centos7                  dhcp                e016fa463604        14 minutes ago      84.7 MB

(3)容器的删除
可以使用docker rm命令将一个已经终止状态的容器进行删除。


[root@localhost ~]# 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
[root@localhost ~]# docker stop 2304f92a8158       #删除容器前需要先停止容器
2304f92a8158
[root@localhost ~]# docker rm 2304f92a8158          #删除容器
2304f92a8158

如果删除一个正在运行的容器,可以添加-f选项强制删除,但是建议先将容器停止再进行删除。

———————— 本文至此结束,感谢阅读 ————————``

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章