目录

1 Docker简介

1.1 虚拟化技术

1.2 Docker概述 

1.2.1 Docker能解决的问题 

1.2.2 Docker介绍 

1.2.3 为什么使⽤Docker 

1.简化程序 

2.避免选择恐惧症 

3.节省开⽀ 

4.持续交付和部署 

5.更轻松的迁移 

1.2.4 Docker特点 

1.2.5 Docker应⽤场景 

1.3 Docker与虚拟机对⽐ 

1.3.1 Docker和虚拟机组成结构 

1.3.2 Docker和虚拟机的不同点 

1.性能对⽐ 

2.应⽤场景不同 

3.使⽤资源⽅⾯不同 

4.实现原理不同 

1.4 Docker基本概念 

1.4.1 Docker引擎 

1.4.2 Docker基本架构 

1.4.3 Docker容器的核⼼概念 

1.4.3.1 镜像Image 

1.4.3.2 容器Container 

1.4.3.3 仓库Reopsitory 

1.公有Docker Registry 

2.私有Docker Registry 

1.4.3.4 客户端Client 

1.4.3.5 守护进程Daemon 

2 Docker安装与配置 

2.1 虚拟机安装 

2.2 Docker安装 

 2.3 Docker守护进程相关命令

1.启动docker服务。 

 2.查看docker服务运⾏状态。如果docker是在运⾏中,输⼊命令后会看到绿⾊的"active (running)"提示。

 3.重启docker服务。

 4.停⽌docker服务。

 5.设置docker开机⾃动启动。

 6.禁⽤Docker开机⾃动启动。

 2.4 Docker镜像加速器

2.4.1 Docker镜像加速器介绍 

2.4.2 Docker镜像加速器配置 

1.中科⼤镜像加速器 

2.阿⾥云镜像加速器 

 3.Docker官⽅加速器

 4.重新启动服务

 5.检查加速器是否⽣效

 3 Docker常⽤命令

3.1 镜像相关命令 

3.1.1 搜索镜像 

1.语法

 2.实例

​3.1.2 拉取镜像

1.语法 

2.实例 

 3.1.3 查看镜像

1.语法 

2.实例

3.1.4 删除镜像 

1.语法 

2.实例 

 3.1.5 镜像其他辅助命令

 3.2 容器相关命令

3.2.1 查看容器 

1.语法 

2.实例 

1.列出所有在运⾏的容器信息。 

 2.列出最近创建的5个容器信息。

3.列出所有创建的容器ID。

 4.查看停⽌的容器。

3.2.2 创建与启动容器

1.语法

2.实例 

 3.2.3 启动停⽌重启容器

1.语法 

 2.实例

 3.2.4 登录容器

1.语法 

2.实例 

 3.2.5 ⽂件拷⻉

1.语法 

2.实例 

 3.2.6 ⽬录挂载

1.⽬录挂载实现 

 2.容器权限被拒

 3.2.7 查看容器元数据

1.语法 

2.实例 

 3.2.8 删除容器

1.语法 

2.实例 

 3.2.9 查询⽇志

1.语法 

2.实例 

 4 Docker数据卷

4.1 Docker数据卷概述 

4.1.1 什么是Docker数据卷 

4.1.2 为什么需要Docker数据卷 

4.2 Docker数据卷的应⽤ 

4.2.1 创建数据卷 

1.语法 

2.实例 

 4.2.2 查看数据卷

1.语法 

 2.实例

 4.2.3 删除数据卷

1.语法 

 2.实例

 4.3 Docker数据卷配置⽅式

4.3.1 ⼀个容器挂载⼀个数据卷 

1.语法 

2.实例 

 4.3.2 ⼀个容器挂载多个数据卷

 4.3.3 多个容器挂载⼀个数据卷

5. Docker迁移与备份

5.1 应⽤场景

5.2 容器保存为镜像 

5.2.1 语法 

5.2.2 实例 

 5.3 镜像备份

 5.3.1 语法

5.3.2 实例 

 5.4 镜像恢复与迁移

5.4.1 语法 

5.4.2 实例 

 6 Docker⽹络

6.1 Centos防⽕墙端⼝ 

 6.2 查看Docker的⽹络连接

6.3 Docker⽹络的相关命令 

6.3.1 Docker⽹络的相关命令介绍 

 语法:

6.3.2 Docker⽹络的相关命令使⽤ 

 6.3.3 Docker⽹络解决的问题

6.4 Docker的⽹络模式 

6.5 bridge模式 

6.5.1 容器实例默认⽹络⽣成规则介绍 

6.5.2 容器实例默认⽹络⽣成规则原理 

6.5.3 验证⽹桥模式 

6.6 host模式 

6.7 none模式 

6.8 container模式 

 6.9 ⾃定义⽹络模式

1 Docker简介

Docker官⽹地址

1.1 虚拟化技术

 虚拟化技术是⼀种计算机资源管理技术,是将计算机的各种实体资源,如服务器、⽹络、内存及存储等,予以抽 象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的不可切割的障碍。使⽤户可以⽐原本的组态更好的⽅ 式来应⽤这些资源。

虚拟化技术主要作⽤:

⾼性能的物理硬件产能过剩和⽼的旧的硬件产能过低的重组重⽤,透明化底层物理硬件。软件跨环境迁移问题(代码的⽔⼟不服)。

在⼀台主机上实现多个操作系统,关键技术就是硬件的虚拟化。

1.2 Docker概述 

1.2.1 Docker能解决的问题 

⾸先,我们先来看⼏个问题:

1.合作开发的时候,在本机可以运⾏,在别⼈的电脑上跑不起来。 

这⾥我们以Java Web应⽤程序为例,⼀个Java Web应⽤程序涉及很多东⻄,⽐如JDK、Tomcat、Spring等等。当 这些其中某⼀项版本不⼀致的时候,可能就会导致应⽤程序跑不起来这种情况。Docker则将程序直接打包成镜像, 直接运⾏在容器中即可。

2.服务器⾃⼰的程序挂了,结果发现是别⼈程序出了问题把内存吃完了,⾃⼰程序因为内存不够就挂了。

 这种也是⼀种⽐较常⻅的情况,如果你的程序重要性不是特别⾼的话,公司基本上不可能让你的程序独享⼀台服务 器的,这时候你的服务器就会跟公司其他⼈的程序共享⼀台服务器,所以不可避免地就会受到其他程序的⼲扰,导 致⾃⼰的程序出现问题。Docker就很好解决了环境隔离的问题,别⼈程序不会影响到⾃⼰的程序。

3.测试阶段能运⾏和上线出现问题。

开发阶段部署⼀套软件环境,测试⼈员在开发中测试没有问题,运维进⾏部署(同⼀套代码)。但是正式部署到服 务器时,发⽣了问题(启动参数、环境问题、漏配了参数)等意外。

4.公司要弄⼀个活动,可能会有⼤量的流量进来,公司需要再多部署⼏⼗台服务器。 

在没有Docker的情况下,要在⼏天内部署⼏⼗台服务器,这对运维来说是⼀件⾮常折磨⼈的事,⽽且每台服务器的 环境还不⼀定⼀样,这时就会出现各种问题,最后部署地头⽪发麻。⽤Docker的话,我只需要将程序打包到镜像, 你要多少台服务,我就给你跑多少容器,极⼤地提⾼了部署效率。

5.微服务环境搭建问题。 

随着微服务技术的兴起,⼀个⼤的应⽤需要拆分成多个微服务。多个微服务的⽣成,就会⾯临庞⼤系统的部署效 率,开发协同效率问题。然后通过服务的拆分,数据的读写分离、分库分表等⽅式重新架构,⽽且这种⽅式如果要 做的彻底,需要花费⼤量⼈⼒物⼒。可能需要部署很多个服务器。 

6.容器版本管理。 

持续的软件版本发布、测试项⽬到线上环境的集成。⽤户可以⽅便地创建和使⽤容器,把⾃⼰的应⽤放⼊容器。容 器还可以进⾏版本管理、复制、分享、修改,就像管理普通的代码⼀样。 

1.2.2 Docker介绍 

Docker是⼀个开源的应⽤容器引擎,诞⽣于2013年初,基于Go语⾔实现,dotCloud公司出品(后改名为Docker Inc),并遵从Apache 2.0协议开源。从17.03版本之后,Docker分为CE(Community Edition-社区版)和EE (Enterprise Edition-企业版)版本,Docker CE是免费版。 

Docker可以让开发者打包他们的应⽤,以及依赖包到⼀个轻量级、可移植的容器中,然后发布到任何流⾏的Linux 机器上。Docker容器是完全使⽤沙箱机制,相互隔离,性能开销也极低。 

Docker通俗的讲是服务器中⾼性能的虚拟机,可以将⼀台物理机虚拟N多台虚拟机的机器,互相之间隔离,互不影 响。 

“Debug your app, not your environment!”。调试您的应⽤程序,⽽不是您的环境! 

官⽹的介绍是“Docker is the world’s leading software container platform.”。官⽅给Docker的定位是⼀个应⽤容 器平台。 

想要搞懂Docker ,其实看它的两句⼝号就⾏。第⼀句是“Build, Ship and Run”。也就是“搭建、发送、运⾏”,三板 斧。 

Docker的第⼆句⼝号就是“Build once, Run anywhere.”,意思是“搭建⼀次,到处能⽤”。 

1.2.3 为什么使⽤Docker 

1.简化程序 

Docker让开发者可以打包他们的应⽤以及依赖包到⼀个可移植的容器中,然后发布到任何流⾏的Linux机器上,便 可以实现虚拟化。Docker改变了虚拟化的⽅式,使开发者可以直接将⾃⼰的成果放⼊Docker中进⾏管理。⽅便快 捷已经是Docker的最⼤优势,过去需要⽤数天乃⾄数周的任务,在Docker容器的处理下,只需要数秒就能完成。 

2.避免选择恐惧症 

如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!Docker镜像中包含了运⾏环境和配置,所以 Docker可以简化部署多种应⽤实例⼯作。⽐如Web应⽤、后台应⽤、数据库应⽤、⼤数据应⽤,再如Hadoop集 群、消息队列等都可以打包成⼀个镜像部署。 

3.节省开⽀ 

⼀⽅⾯,云计算时代到来,使开发者不必为了追求效果⽽配置⾼额的硬件,Docker改变了⾼性能必然⾼价格的思维 定势。Docker与云的结合,让云空间得到更充分的利⽤。不仅解决了硬件管理的问题,也改变了虚拟化的⽅式。 

4.持续交付和部署 

对开发和运维(DevOps)⼈员来说,最希望的就是⼀次创建或配置,可以在任意地⽅正常运⾏。使⽤Docker可以 通过定制应⽤镜像来实现持续集成、持续交付、部署。开发⼈员可以通过Dockerfile来进⾏镜像构建,并结合持续 集成(Continuous Integration)系统进⾏集成测试,⽽运维⼈员则可以直接在⽣产环境中快速部署该镜像,甚⾄ 结合持续部署(Continuous Delivery/Deployment)系统进⾏⾃动部署。⽽且使⽤Dockerfile使镜像构建透明化, 不仅仅开发团队可以理解应⽤运⾏环境,也⽅便运维团队理解应⽤运⾏所需条件,帮助更好的⽣产环境中部署该镜 像。 

5.更轻松的迁移 

由于Docker确保了执⾏环境的⼀致性,使得应⽤的迁移更加容易。Docker可以在很多平台上运⾏,⽆论是物理 机、虚拟机、公有云、私有云,甚⾄是笔记本,其运⾏结果是⼀致的。因此⽤户可以很轻易的将在⼀个平台上运⾏ 的应⽤,迁移到另⼀个平台上,⽽不⽤担⼼运⾏环境的变化导致应⽤⽆法正常运⾏的情况。 

1.2.4 Docker特点 

标准化交付:Docker将应⽤打包成标准化单元,⽤于交付、部署。 

轻量级:容器及包含了软件运⾏所需的所有环境,⽽且⾮常轻量级。 

⾼可靠:容器化的应⽤程序,可以在任何Linux环境中始终如⼀的运⾏。 

隔离性:容器化的应⽤程序,具备隔离性,这样多团队可以共享同⼀Linux系统资源。 

1.2.5 Docker应⽤场景 

1.Web应⽤的⾃动化打包和发布。 

2.⾃动化测试和持续集成、发布。 

3.在服务型环境中部署和调整数据库或其他的后台应⽤。 

4.从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建⾃⼰的PaaS环境。 

PaaS:Platform as a Service,平台即服务SaaS:Software as a Service,软件即服务IaaS:Infrastructure as a Service,基础设施即服务 

1.3 Docker与虚拟机对⽐ 

1.3.1 Docker和虚拟机组成结构 

下⾯的图⽚⽐较了传统虚拟化⽅式和Docker的不同之处,可⻅Docker是在操作系统层⾯上实现虚拟化,直接复⽤ 本地主机的操作系统,⽽传统⽅式(VMware)则是在硬件层⾯实现。 

Docker的组成结构图: 

传统虚拟机的组成结构图: 

⽐较上⾯两张图,我们发现虚拟机是携带操作系统的,本身很⼩的应⽤程序却因为携带了操作系统⽽变得⾮常⼤且 很笨重。⽽Docker是不携带操作系统的,所以Docker的应⽤就⾮常的轻巧。 

Docker和虚拟机的相同点是:Docker和虚拟机都是虚拟化技术,具备资源隔离和分配优势。 

1.3.2 Docker和虚拟机的不同点 

1.性能对⽐ 

Docker容器作为⼀种轻量级的虚拟化技术,和传统虚拟机技术的特性差异如下表所示: 

2.应⽤场景不同 

若需要资源的完全隔离并且不考虑资源的消耗,可以使⽤虚拟机。若是想隔离进程并且需要运⾏⼤量进程实例,应 该选择Docker容器。 

3.使⽤资源⽅⾯不同 

Docker容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此更加轻量级,消耗的资源更 少。虚拟机会独占分配给⾃⼰的资源,不存在资源共享,各个虚拟机之间近乎完全隔离,更加重量级,也会消耗更 多的资源。 

4.实现原理不同 

虚拟机是⽤来进⾏硬件资源划分的完美解决⽅案,利⽤的是硬件虚拟化技术,如此VT-x、AMD-V会通过⼀个 Hypervisor层来实现对资源的彻底隔离。⽽容器则是操作系统级别的虚拟化,利⽤的是内核的cgroup和 namespace特性,此功能通过软件来实现,仅仅是进程本身就可以实现互相隔离,不需要任何辅助。 

1.4 Docker基本概念 

1.4.1 Docker引擎 

Docker引擎组件的流程如下图所示: 

Docker使⽤客户端-服务器C/S架构模式,使⽤远程API来管理并创建Docker容器。 

1.4.2 Docker基本架构 

Docker采⽤C/S架构。Docker Server负责构建、运⾏和分发Docker镜像。Docker Client和Docker Server可以运 ⾏在同⼀台机器上,也可以通过RESTful或其他⽹络接⼝进⾏远程通信,如下图所示: 

从上图能够看到,Docker体系的核⼼组件包括如下⼏部分: 

Docker Client:Docker客户端。Docker Daemon:Docker守护进程。Docker Container:Docker容器。Docker Image:Docker镜像。Docker Registry:Docker仓库。 

1.4.3 Docker容器的核⼼概念 

1.4.3.1 镜像Image 

Docker镜像和虚拟机镜像的概念是⼀样的,可以将其理解为⼀个⾯向Docker引擎的只读模板,可⽤于批量创造可 运⾏的容器实例。Docker镜像可以看作是⼀个特殊的⽂件系统,除了提供容器运⾏时所需的程序、库、资源、配置 等⽂件外,还包含了⼀些为运⾏时准备的⼀些配置参数(如环境变量、⽤户等)。镜像不包含任何动态数据,其内 容在构建之后也不会被改变。镜像是创建Docker容器的基础,⽽Docker体系能够提供⼀套简单的机制创建和更新 已有的镜像,也可以从⽹上下载⼀个制作好的现成的镜像。 

分层储层。因为镜像包含操作系统完整的root⽂件系统,其体积往往是庞⼤的,因此在Docker设计时,就充分利⽤ Union FS的技术,将其设计为分层存储的架构。所以严格来说,镜像并⾮是像⼀个ISO那样的打包⽂件,镜像只是 ⼀个虚拟的概念,其实际体现并⾮由⼀个⽂件组成,⽽是由⼀组⽂件系统组成,或者说,由多层⽂件系统联合组 成。 

镜像构建时,会⼀层层构建,前⼀层是后⼀层的基础。每⼀层构建完就不会再发⽣改变,后⼀层上的任何改变只发 ⽣在⾃⼰这⼀层。⽐如,删除前⼀层⽂件的操作,实际不是真的删除前⼀层的⽂件,⽽是仅在当前层标记为该⽂件 已删除。在最终容器运⾏的时候,虽然不会看到这个⽂件,但是实际上该⽂件会⼀直跟随镜像。因此,在构建镜像 的时候,需要额外⼩⼼,每⼀层尽量只包含该层需要添加的东⻄,任何额外的东⻄应该在该层构建结束前清理掉。 

分层存储的特征还使得镜像的复⽤、定制变的更为容易。甚⾄可以⽤之前构建好的镜像作为基础层,然后进⼀步添 加新的层,以定制⾃⼰所需的内容,构建新的镜像。 

1.4.3.2 容器Container 

Docker容器是⼀个运⾏时的概念,可以理解为⼀个简易的Linux系统环境(包括root⽤户权限、进程空间、⽹络空 间等概念)以及运⾏在其中的应⽤程序。每个Docker容器本质上就是⼀个Linux进程,拥有⾃⼰的上下⽂环境,彼 此隔离。Docker引擎能够对⼀个容器进⾏创建、启动、停⽌、删除和暂停等操作。 

容器的实质是进程,但与直接在宿主执⾏的进程不同,容器进程运⾏于属于⾃⼰的独⽴的命名空间。因此容器可以 拥有⾃⼰的root⽂件系统、⾃⼰的⽹络配置、⾃⼰的进程空间,甚⾄⾃⼰的⽤户ID空间。容器内的进程是运⾏在⼀ 个隔离的环境⾥,使⽤起来,就好像是在⼀个独⽴于宿主的系统下操作⼀样。这种特性使得容器封装的应⽤⽐直接 在宿主运⾏更加安全。 

前⾯讲过镜像使⽤的是分层存储,容器也是如此。每⼀个容器运⾏时,是以镜像为基础层,在其上创建⼀个当前容 器的存储层,我们可以称这个为容器运⾏时读写⽽准备的存储层为容器存储层。 

容器存储层的⽣存周期和容器⼀样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都 会随容器删除⽽丢失。 

按照Docker最佳实践的要求,容器不应该向其存储层内写⼊任何数据,容器存储层要保持⽆状态化。所有的⽂件写 ⼊操作,都应该使⽤数据卷(Volume)、或者绑定宿主⽬录,在这些位置的读写会跳过容器存储层,直接对宿主 (或⽹络存储)发⽣读写,其性能和稳定性更⾼。 

数据卷的⽣存周期独⽴于容器,容器消亡,数据卷不会消亡。因此,使⽤数据卷后,容器删除或者重新运⾏之后, 数据却不会丢失。 

Docker容器与Docker镜像的关系类似于⾯向对象编程中的对象与类。 

1.4.3.3 仓库Reopsitory 

Docker仓库类似代码仓库,是Docker体系集中存放镜像⽂件的场所。⼀般情况下,⼀个仓库会包含同⼀个软件不 同版本的镜像,⽤“标签”的概念来标记版本。可以通过 : 的格式来精确定位具体采⽤哪个镜像。如 果不指定标签,则采⽤latest作为默认标签。  

根据存储的镜像公开与否,可以分为公开仓库(Public)和私有仓库(Private),⽬前最⼤的公开仓库是Docker Hub,⽤户可以在⾃⼰的本地⽹络中创建私有仓库。 

Docker利⽤仓库管理镜像的理念类似于Git,默认情况下Docker会在中央仓库(Docker Hub和Docker Cloud)寻 找镜像⽂件。 

1.公有Docker Registry 

Docker Registry公开服务是开放给⽤户使⽤、允许⽤户管理镜像的Registry服务。⼀般这类公开服务允许⽤户免费 上传、下载公开的镜像,并可能提供收费服务供⽤户管理私有镜像。 

最常使⽤的Registry公开服务是官⽅的Docker Hub,这也是默认的Registry,并拥有⼤量的⾼质量的官⽅镜像。除 此以外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这⾥;Google的Google Container Registry, Kubernetes的镜像使⽤的就是这个服务。 

由于某些原因,在国内访问这些服务可能会⽐较慢。国内的⼀些云服务商提供了针对Docker Hub的镜像服务 (Registry Mirror),这些镜像服务被称为加速器。常⻅的有阿⾥云加速器、DaoCloud加速器等。使⽤加速器会 直接从国内的地址下载Docker Hub的镜像,⽐直接从Docker Hub下载速度会提⾼很多。 

国内也有⼀些云服务商提供类似于Docker Hub的公开服务。⽐如时速云镜像仓库、⽹易云镜像服务、DaoCloud镜 像市场、阿⾥云镜像库等。 

2.私有Docker Registry 

除了使⽤公开服务外,⽤户还可以在本地搭建私有Docker Registry。Docker官⽅提供了Docker Registry镜像,可 以直接使⽤做为私有Registry服务。 

开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,⾜以⽀持docker命令,不影响使⽤。但 不包含图形界⾯,以及镜像维护、⽤户管理、访问控制等⾼级功能。在官⽅的商业化版本Docker Trusted Registry 中,提供了这些⾼级功能。 

1.4.3.4 客户端Client 

Docker Client提供了命令⾏界⾯(CLI),是⽤户与Docker进⾏交互的主要窗⼝。通过Client可以构建、运⾏和停 ⽌容器,还可以与远程的Docker Server进⾏交互。 

1.4.3.5 守护进程Daemon 

Docker Daemon是最核⼼的后台服务进程,以Linux后台服务的⽅式运⾏,也称为守护进程。它负责响应来⾃ Docker Client的请求,内部对请求进⾏路由分发,交给具体的管理模块进⾏处理。 

2 Docker安装与配置 

先在本地电脑上安装虚拟机(Windows系统-VMware Workstation Pro虚拟机,Mac系统-VMware Fusion虚拟 机),然后在虚拟机上搭建Linux操作系统(CentOS),最后在Linux操作系统中安装Docker容器。 

2.1 虚拟机安装 

根据不同的本地操作系统,选择安装不同的虚拟机。例如,Windows系统上,安装VMware Workstation Pro虚拟 机;Mac系统上,安装VMware Fusion虚拟机。 

虚拟机的安装以及虚拟机上Linux操作系统(CentOS)的安装⾃⾏参考其他教程。在使⽤Docker的时候,需要从 镜像仓库下载镜像,因此虚拟机上所搭载的Linux操作系统必须处于联⽹的状态。 

虚拟机⽹络适配器有三种模式,具体介绍⻅下: 

桥接模式。就像⼀个在路由器“⺠政局”那⾥“上过户⼝”的成年⼈,有⾃⼰单独的居住地址,虽然和主机住在同 ⼀个⼤院⾥,但好⽍是有户⼝的⼈,可以⼤摇⼤摆地直接和外⾯通信。NAT模式。纯粹就是⼀个没上过户⼝的⿊户,路由器“⺠政局”根本不知道有这么个⼈,⾃然也不会主动和它通 信。即使虚拟机偶尔要向外⾯发送点的信件,都得交给主机以主机的名义转发出去,主机还专⻔请了⼀位叫做 NAT的⽼⼤爷来专⻔负责这些虚拟机的发信、收信事宜。仅主机模式。纯粹是⼀个彻彻底底的⿊奴,不仅没有户⼝、路由器“⺠政局”不知道这么号⼈,还被主机关在⼩ ⿊屋⾥,连信件也不准往外发。 

 其中这个仅主机模式能够保障我们在拔掉⽹线的情况下继续连接我们的虚拟机,不依靠公⽹连接,⽽是依靠物理机 和虚拟机的关系连接。在断⽹的情况下,利⽤这个模式,我们可以继续连接虚拟机,实现我们的操作。

2.2 Docker安装 

Docker官⽅建议在Ubuntu操作系统中安装Docker软件。因为Docker基于Ubuntu发布,⽽且Docker出现问题时, Ubuntu系统版本的⼀般是先打补丁。很多版本在CentOS中,是不⽀持更新最新补丁包的。没有好的解决⽅案。 

但是,由于我们学习的环境都是基于CentOS操作系统。因此,这⾥我们将Docker安装到CentOS操作系统上。注 意,⼀定要将Docker安装在CentOS 7.x及以上版本上,在CentOS 6.x的版本中会有Bug。 

注意:从2017年3⽉开始 docker 在原来的基础上分为两个分⽀版本:Docker CE和Docker EE。Docker CE即社区 免费版,Docker EE即企业版,强调安全,但需付费使⽤。本⽂介绍 Docker CE 的安装使⽤。 

官⽅安装教程⽂档:https://docs.docker.com/engine/install/centos/ 。在CentOS 7.x操作系统中安装Docker软件 具体步骤⻅下:

1.切换到root账户,并输⼊root⽤户密码。 

su root

 2.查看电脑上是否已经安装Docker软件。

yum list installed | grep docker

 3.如果已经安装过Docker,先卸载已安装的Docker,执⾏如下命令。如果报告未安装这些包,则没有问题。

sudo yum remove docker docker-client docker-client-latest docker-common docker-latest

docker-latest-logrotate docker-logrotate docker-engine

4.安装所需的软件包。yum-utils提供了yum-config-manager应⽤,并device-mapper-persistent-data和lvm2由 需要devicemapper存储驱动程序。

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

 5.设置Docker镜像的仓库,添加软件源信息。

# 官⽅默认镜像仓库(不推荐)

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/dockerce.repo

# 阿⾥云源(推荐)

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 6.更新yum源。

sudo yum makecache fast

 7.Docker要求CentOS系统的内核版本⾼于3.10 ,通过 uname -r 命令查看你当前的内核版本是否⽀持安装 Docker。

uname -r

8.安装Docker-CE软件。

# docker-ce表示社区免费版本

yum -y install docker-ce

 9.安装后查看Docker软件的版本。

# 查看Docker版本⽅式⼀

docker -v

# 查看Docker版本⽅式⼆

docker version

10.查看docker概要信息。

docker info

 11.查看docker帮助⽂档。

docker --help

 2.3 Docker守护进程相关命令

systemctl命令是系统服务管理器指令。通过systemctl命令可以控制Docker服务的不同状态。 

1.启动docker服务。 

systemctl start docker

 2.查看docker服务运⾏状态。如果docker是在运⾏中,输⼊命令后会看到绿⾊的"active (running)"提示。

systemctl status docker

 3.重启docker服务。

systemctl restart docker

 4.停⽌docker服务。

systemctl stop docker

 5.设置docker开机⾃动启动。

systemctl enable docker

 6.禁⽤Docker开机⾃动启动。

systemctl disable docker

 2.4 Docker镜像加速器

2.4.1 Docker镜像加速器介绍 

使⽤Docker的时候,默认情况下,国内从Docker Hub(https://hub.docker.com)获取镜像,但是由于显⽽易⻅ 的⽹络原因,拉取镜像的过程⾮常耗时,严重影响使⽤Docker的体验。因此很多云服务商推出了加速器⼯具解决这 个难题,通过智能路由和缓存机制,极⼤提升了国内⽹络访问Docker Hub的速度,⽬前已经拥有了⼴泛的⽤户群 体,并得到了Docker官⽅的⼤⼒推荐。 如果您是在国内的⽹络环境使⽤Docker,那么Docker加速器⼀定能帮助到 您。 

 Docker官⽅和国内很多云服务商都提供了国内加速器服务,例如:

镜像提供商镜像地址科⼤镜像https://docker.mirrors.ustc.edu.cn/阿⾥云 https://[系统分配前缀].mirror.aliyuncs.com ⽹易hub-mirror.c.163.com七⽜云加速器reg-mirror.qiniu.com

当配置某⼀个加速器地址之后,若发现拉取不到镜像,请切换到另⼀个加速器地址。国内各⼤云服务商均提供了 Docker镜像加速服务,建议根据运⾏Docker的云平台选择对应的镜像加速服务。 

2.4.2 Docker镜像加速器配置 

对于使⽤systemd的系统,请在/etc/docker/daemon.json中写⼊如下内容(如果⽂件不存在请新建该⽂件)。 

1.中科⼤镜像加速器 

中国科学技术⼤学(University of Science and Technology of China,简称USTC)是⽼牌的Linux镜像服务提供 者了,还在遥远的Ubuntu 5.04版本的时候就在⽤。USTC的Docker镜像加速器速度很快。USTC Docker Mirror的 优势之⼀就是不需要注册,是真正的公共服务。 

 1.通过vim命令编辑daemon.json⽂件(没有时新建该⽂件)。

vim /etc/docker/daemon.json

 2.在daemon.json⽂件中输⼊如下内容。

{

"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

}

 注意:⼀定要保证该⽂件符合JSON规范,否则Docker将不能启动。

2.阿⾥云镜像加速器 

使⽤阿⾥云Docker镜像,必须要先注册阿⾥云账号,然后可以⾃⼰从阿⾥云上申请Docker镜像地址,阿⾥云会为 每个账户分配⼀个免费的Docker镜像加速地址,速度极快。 

https://promotion.aliyun.com/ntms/act/kubernetes.html1.访问阿⾥云镜像获取地址:https://promotion.aliyun.com/ntms/act/kubernetes.html 

2.阿⾥云的镜像源有个加速器,可以加速你获取容器的速度。这个加速器地址是每个⼈专属的。⾸先,登录阿⾥云 的个⼈账号,然后点击【控制台】按钮。

3.进⼊控制台后,搜索【容器镜像服务】选项。 

 4.在打开的容器镜像服务窗⼝中,选择【镜像加速器】选项,复制个⼈的加速器地址。

5.通过vim命令编辑daemon.json⽂件(没有时新建该⽂件)。 

vim /etc/docker/daemon.json

 6.在daemon.json⽂件中输⼊如下内容。

{

"registry-mirrors": ["刚刚复制的地址"]

}

 3.Docker官⽅加速器

1.官⽅加速器 1.Docker官⽅加速器官⽅⽂档:https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror 

2.通过vim命令编辑daemon.json⽂件(没有时新建该⽂件)。 

vim /etc/docker/daemon.json

 3.在daemon.json⽂件中输⼊如下内容。

{

"registry-mirrors": ["https://registry.docker-cn.com"]

}

 4.重新启动服务

配置完成后,需要重新启动服务。 

sudo systemctl daemon-reload

sudo systemctl restart docker

 5.检查加速器是否⽣效

检查加速器是否⽣效配置加速器之后,如果拉取镜像仍然⼗分缓慢,请⼿动检查加速器配置是否⽣效,在命令⾏执 ⾏ docker info ,如果从结果中看到了如下内容,说明配置成功。 

# docker info

...

Registry Mirrors:

https://docker.mirrors.ustc.edu.cn

...

 3 Docker常⽤命令

3.1 镜像相关命令 

3.1.1 搜索镜像 

我们可以从Docker Hub⽹站来搜索镜像,Docker Hub⽹址为:https://hub.docker.com。也可以通过Docker命 令来搜索镜像。 

1.语法

从镜像仓库查找镜像。注意,必须确保当前系统能联⽹。

docker search [OPTIONS] TERM

 OPTIONS说明:

TERM说明:表示镜像名称。 

 2.实例

从Docker镜像仓库查找所有镜像名包含“java”,并且收藏数⼤于10的镜像。 

[root@localhost ~]# docker search -f stars=10 java

NAME DESCRIPTION STARS OFFICIAL AUTOMATED

tomcat Apache Tomcat is an open source implementati… 3558 [OK]

tomee Apache TomEE is an all-Apache Java EE certif… 108 [OK]

bitnami/tomcat Bitnami Tomcat Docker Image 49 [OK]

 参数说明:

 3.1.2 拉取镜像

1.语法 

从镜像仓库中拉取或者更新指定镜像。不指定版本号,下载的是默认最新的版本。 

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

 OPTIONS说明:

2.实例 

1.从Docker镜像仓库下载java最新版镜像。 

docker pull java

 2.从Docker镜像仓库下载REPOSITORY为java的所有镜像。

docker pull -a java

 3.从Docker镜像仓库下载指定版本的Tomcat镜像。

docker pull tomcat:9

 3.1.3 查看镜像

1.语法 

查看本地所有镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

 这些镜像都是存储在Docker宿主机的/var/lib/docker⽬录下。

OPTIONS说明:

  

2.实例

1.查看本地镜像列表。 

docker images

2.列出本地镜像中REPOSITORY为tomcat的镜像列表。

docker images tomcat

 3.参数说明:

镜像体积。如果仔细观察,会注意到,这⾥标识的所占⽤空间和在Docker Hub上看到的镜像⼤⼩不同。这是因为 Docker Hub中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此Docker Hub 所显示的⼤⼩是⽹络传输中更关⼼的流量⼤⼩。⽽docker image显示的是镜像下载到本地后展开的⼤⼩,准确说, 是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关⼼的是本地磁盘空间占⽤的⼤⼩。 另 外⼀个需要注意的问题是,docker image列表中的镜像体积总和并⾮是所有镜像实际硬盘消耗。由于Docker镜像 是多层存储结构,并且可以继承、复⽤,因此不同镜像可能会因为使⽤相同的基础镜像,从⽽拥有共同的层。由于 Docker使⽤Union FS,相同的层只需要保存⼀份即可,因此实际镜像硬盘占⽤空间很可能要⽐这个列表镜像⼤⼩ 的总和要⼩的多。

3.1.4 删除镜像 

1.语法 

删除本地⼀个或多个镜像。 

docker rmi [OPTIONS] IMAGE [IMAGE...]

 通过镜像ID(可以是镜像短ID、镜像⻓ID)、镜像名、摘要来删除镜像。

OPTIONS说明:

注意事项:要删除的镜像必须要确认此镜像⽬前没有被任何容器使⽤。

2.实例 

1.强制删除本地镜像centos:7。

docker rmi -f centos:7

 2.按镜像ID删除镜像。

docker rmi 镜像id

 3.1.5 镜像其他辅助命令

查询本地镜像的IMAGE ID。 

docker images -q

 查看⼀个镜像的制作历程。

docker history 镜像ID

 3.2 容器相关命令

3.2.1 查看容器 

1.语法 

列出容器。 

docker ps [OPTIONS]

 OPTIONS说明:

2.实例 

1.列出所有在运⾏的容器信息。 

docker ps

 输出详情介绍:

容器状态有7种:

 2.列出最近创建的5个容器信息。

docker ps -n 5

3.列出所有创建的容器ID。

docker ps -a -q

 4.查看停⽌的容器。

docker ps -f status=exited

3.2.2 创建与启动容器

启动容器有⼆种⽅式,⼀种是基于镜像新建⼀个容器并启动,⼀种是将在终⽌状态( stopped )的容器重新启 动。 

docker run:创建⼀个新的容器并运⾏⼀个命令。 

1.语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 OPTIONS说明:

2.实例 

使⽤镜像nginx:latest以后台模式启动⼀个容器,并将容器命名为mynginx。

docker run --name mynginx -d nginx:latest

 使⽤镜像nginx:latest以后台模式启动⼀个容器,并将容器的80端⼝映射到主机随机端⼝。

docker run -P -d nginx:latest

 使⽤nginx镜像ID以后台模式启动⼀个容器,将容器的80端⼝映射到主机的80端⼝。

docker run -itd --name=mynginx -p 80:80 fb5657adc892

 绑定容器的8080端⼝,并将其映射到本地主机127.0.0.1的80端⼝上。

docker run -p 127.0.0.1:80:8080/tcp mynginx bash

 使⽤镜像nginx:latest以交互模式启动⼀个容器,在容器内执⾏/bin/bash命令。

docker run -it nginx:latest /bin/bash

 使⽤镜像nginx:latest以后台模式启动⼀个容器,将容器的80端⼝映射到主机的80端⼝,主机的⽬录/data映射到容 器的/data。

docker run -p 80:80 -v /data:/data -d nginx:latest

 3.2.3 启动停⽌重启容器

docker stop:停⽌⼀个运⾏中的容器。 

docker start:启动⼀个或多个已经被停⽌的容器。 

docker restart:重启容器(重启已经关闭的容器)。 

1.语法 

docker start [OPTIONS] CONTAINER [CONTAINER...]

docker stop [OPTIONS] CONTAINER [CONTAINER...]

docker restart [OPTIONS] CONTAINER [CONTAINER...]

 2.实例

停⽌运⾏中的容器mynginx。 

docker stop mynginx

 停⽌所有正在运⾏的容器。

docker stop $(docker ps -aq)

 启动已被停⽌的容器mynginx。

docker start mynginx

 重启容器mynginx。

docker restart mynginx

 3.2.4 登录容器

docker exec:在运⾏的容器中执⾏命令。 

1.语法 

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

 OPTIONS说明:

2.实例 

1.在容器mynginx中开启⼀个交互模式的终端。 

docker exec -i -t mynginx /bin/bash

 2.在容器mynginx中以交互模式执⾏容器内/root/test.sh脚本。

docker exec -it mynginx /bin/sh /root/test.sh

 3.也可以通过 docker ps -a 命令查看已经在运⾏的容器,然后使⽤容器ID进⼊容器。

(1) 查看已经在运⾏的容器ID: 

docker ps -a

 (2) 通过exec命令对指定的容器执⾏bash。

docker exec -it 9df70f9a0714 /bin/bash

 3.2.5 ⽂件拷⻉

docker cp:⽤于容器与主机之间的数据拷⻉。 

1.语法 

# 从宿主机⽂件拷⻉到容器中

docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH

# 从容器中拷⻉⽂件到宿主机

docker cp [OPTIONS] CONTAINER:PATH LOCALPATH

 OPTIONS说明:

特别强调:不管是把⽂件从宿主机拷⻉到容器,还是从容器拷⻉⽂件到宿主机,都在宿主机⼀⽅执⾏命令。 

2.实例 

将主机/www⽬录下的test⽬录拷⻉到容器96f7f14e99ab的/root⽬录下。 

docker cp /www/test 96f7f14e99ab:/root

 将主机/www/test⽬录拷⻉到容器96f7f14e99ab中,⽬录重命名为www。

docker cp /www/test 96f7f14e99ab:/www

 将容器96f7f14e99ab的/www⽬录拷⻉到主机的/tmp⽬录中。

docker cp 96f7f14e99ab:/www /tmp

 3.2.6 ⽬录挂载

1.⽬录挂载实现 

我们可以在创建容器的时候,将宿主机的⽬录与容器内的⽬录进⾏映射,这样我们就可以通过修改宿主机某个⽬录 的⽂件从⽽去影响容器。 

1.⾸先拉取centos:7镜像。 

docker pull centos:7

 2.创建容器添加 -v 参数,后边为 宿主机⽬录:容器⽬录 。

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos centos:7

 3.登录mycentos容器。

docker exec -it mycentos /bin/bash

 4.进⼊容器的/usr/local/myhtml⽬录。

cd /usr/local/myhtml

 5.查看该⽬录下的⽂件。提示,使⽤ ls ⽆法打开⽬录,权限被拒绝。

root@c8f54579a002://usr/local/myhtml# ls

ls: cannot open directory ".": Permission denied

 2.容器权限被拒

原因是CentOS中的安全模块selinux把权限禁掉了。解决⽅法是,在运⾏容器的时候,给容器加特权。有三种解决 ⽅法: 

1.在运⾏容器的时候,给容器加特权,即加上 --privileged=true 参数。 

docker run -d -t --privileged=true xxx

 2.如果使⽤的是docker-compose,则在配置⽂件中加上 -privileged=true 环境变量。

environment:

- TZ=Asia/Shanghai

- privileged=true

 3.关闭selinux。临时关闭⽅法,重启失效。

setenforce 0

 3.2.7 查看容器元数据

docker inspect:获取容器/镜像的元数据。 

1.语法 

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

 OPTIONS说明:

2.实例 

获取镜像mynginx的元信息。 

docker inspect mynginx

 获取正在运⾏的容器nginx的IP。

docker inspect --format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

mynginx

 3.2.8 删除容器

docker rm:删除⼀个或多个容器。 

1.语法 

docker rm [OPTIONS] CONTAINER [CONTAINER...]

 OPTIONS说明:

2.实例 

强制删除容器db01、db02。 

docker rm -f db01 db02

 移除容器nginx01对容器db01的连接,连接名db。

docker rm -l db

 删除容器nginx01,并删除容器挂载的数据卷。

docker rm -v nginx01

 删除所有已经停⽌的容器。

docker rm $(docker ps -a -q)

 3.2.9 查询⽇志

查看某个容器的运⾏⽇志。 

1.语法 

docker logs [OPTIONS] CONTAINER

 OPTIONS说明:

2.实例 

实时查看,容器tomcat后20条⽇志。 

docker logs -f --tail=20 tomcat

 实时查看,容器tomcat从2023-1-1⽇期后20条⽇志。

docker logs -f -t --since="2023-1-1" --tail=10 tomcat

 4 Docker数据卷

4.1 Docker数据卷概述 

4.1.1 什么是Docker数据卷 

数据卷(Volumes)是宿主机中的⼀个⽬录或⽂件,当容器⽬录和数据卷⽬录绑定后,对⽅的修改会⽴即同步。⼀ 个数据卷可以被多个容器同时挂载,⼀个容器也可以被挂载多个数据卷。简单来说数据卷本质其实是共享⽂件夹, 是宿主机与容器间数据共享的桥梁。 

数据卷特性:

外部机器和容器间接通信容器之间数据交换。数据卷可以在容器之间共享和重⽤对数据卷的修改会⽴⻢⽣效对数据卷的更新,不会影响镜像容器数据持久化。数据卷默认会⼀直存在,即使容器被删除 

4.1.2 为什么需要Docker数据卷 

这得从Docker容器的⽂件系统说起。出于效率等⼀系列原因,Docker容器的⽂件系统在宿主机上存在的⽅式很复 杂,这会带来下⾯⼏个问题: 

不能在宿主机上很⽅便地访问容器中的⽂件⽆法在多个容器之间共享数据当容器删除时,容器中产⽣的数据将丢失 

为了解决这些问题,Docker引⼊了数据卷机制。数据卷是存在于⼀个或多个容器中的特定⽂件或⽂件夹,这个⽂件 或⽂件夹以独⽴于Docker⽂件系统的形式存在于宿主机中。数据卷的最⼤特定是:其⽣存周期独⽴于容器的⽣存周 期。

使⽤数据卷的最佳场景: 

在多个容器之间共享数据,多个容器可以同时以只读或者读写的⽅式挂载同⼀个数据卷,从⽽共享数据卷中的 数据。当宿主机不能保证⼀定存在某个⽬录或⼀些固定路径的⽂件时,使⽤数据卷可以规避这种限制带来的问题。当你想把容器中的数据存储在宿主机之外的地⽅时,⽐如远程主机上或云存储上。当你需要把容器数据在不同的宿主机之间备份、恢复或迁移时,数据卷是很好的选择。 

4.2 Docker数据卷的应⽤ 

4.2.1 创建数据卷 

1.语法 

# 创建数据卷

docker volume create 数据卷名称

创建数据卷之后,默认会存放到⽬录:/var/lib/docker/volumes/数据卷名称/_data⽬录下。

2.实例 

docker volume create test_volume

cd /var/lib/docker/volumes/test_volume/_data

ls

 4.2.2 查看数据卷

1.语法 

# 查看全部数据卷信息

docker volume ls

# 查看某⼀个数据卷,根据数据卷名称来查看

docker volume inspect 数据卷名称

# 查看容器中挂载的数据卷

docker inspect 容器名称(容器ID)

 2.实例

docker volume ls

docker volume inspect test_volume

docker inspect tomcat

 4.2.3 删除数据卷

1.语法 

docker volume rm 数据卷名称

 2.实例

docker volume rm test_volume

 4.3 Docker数据卷配置⽅式

4.3.1 ⼀个容器挂载⼀个数据卷 

1.语法 

创建启动容器时,使⽤ –v 参数 设置数据卷。 

# 当映射数据卷时,如果数据卷不存,Docker会⾃动创建。数据会保存在默认⽬录

docker run -v 数据卷名称:容器内路径 镜像id

# 直接指定⼀个路径作为数据卷的存储位置

docker run -v 宿主机⽬录(⽂件):容器内⽬录(⽂件) 镜像id

 注意事项:

⽬录必须是绝对路径如果宿主机⽬录不存在,会⾃动创建可以挂载多个数据卷 

2.实例 

1.创建数据卷,将项⽬安全放⼊数据卷当中,启动Tomcat,来访问进⾏查看。

# 创建数据卷

[root@localhost ~]# docker volume create yx_vol

# 创建并运⾏容器

[root@localhost ~]# docker run -itd --name=tomcat -p 8080:8080 -v

yx_vol:/usr/local/tomcat/webapps

 2.将项⽬放⼊指定⽬录当中,-v数据卷。启动Tomcat,来访问并进⾏查看。

# 安装启动容器并挂载

[root@localhost ~]# docker run -itd --name=tomcat -v

/opt/volume_exam:/usr/local/tomcat/webapps/ tomcat

3.先拉取CentOS7镜像,再安装启动容器并挂载。

# 拉取CentOS7镜像

[root@localhost ~]# docker pull centos:7

# 安装启动容器并挂载

[root@localhost ~]# docker run -di --name=centos_1 -v /root/host_data1:/root/c1_data

centos:7 /bin/bash

 4.3.2 ⼀个容器挂载多个数据卷

我们可以通过以下命令,挂载多个数据卷。 

docker run -di --name=centos_1 -v /root/host_data1:/root/c1_data1 -v

/root/host_data2:/root/c1_data2 centos:7 /bin/bash

 4.3.3 多个容器挂载⼀个数据卷

多个容器挂载1个数据卷,实现数据共享。 

docker run -di --name=centos_2 -v /root/host_data_common:/root/c2_data centos:7

docker run -di --name=centos_3 -v /root/host_data_common:/root/c3_data centos:7

 登录centos_2和centos_3容器。

docker exec -it centos_2 /bin/bash

docker exec -it centos_3 /bin/bash

 多个容器挂载1个容器(这个容器挂载1个数据卷)。

# 创建启动centos_3数据卷容器,使⽤"-v 参数"设置数据卷

docker run -di --name=centos_3 -v /root/host_data_common:/root/c3_data centos:7

/bin/bash

# 创建启动centos_1、centos_2容器,使⽤"--volumes-from 参数"设置数据卷

docker run -di --name=centos_1 --volumes-from centos_3 centos:7 /bin/bash

docker run -di --name=centos_2 --volumes-from centos_3 centos:7 /bin/bash

5. Docker迁移与备份

5.1 应⽤场景

开发环境Docker,在Docker中安装很多的容器,进⾏对应的配置,将Docker中的运⾏的容器持久化为镜像,将对 应的镜像安装到⽣产环境中。 

1.将开发环境下的Docker中对应的容器持久化为镜像。 

2.将镜像保存为⼀个压缩包,发送到⽣产环境服务器中。 

3.⽣产环境中需要将压缩包解压为镜像,然后再通过镜像启动容器。 

5.2 容器保存为镜像 

docker commit:从容器创建⼀个新的镜像。 

5.2.1 语法 

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

 OPTIONS说明:

5.2.2 实例 

将容器Redis保存为新的镜像,并添加提交⼈信息和说明信息。 

docker commit -a "www.yx.com" -m "my redis" a404c6c174a2 redis:v1

docker images redis:v1

 5.3 镜像备份

docker save:将指定镜像保存成tar归档⽂件。即备份本地仓库的镜像。 

 5.3.1 语法

docker save [OPTIONS] IMAGE [IMAGE...]

 OPTIONS说明:

5.3.2 实例 

将镜像redis:v1⽣成redis_v1.tar⽂档。 

docker save -o redis_v1.tar redis:v1

 5.4 镜像恢复与迁移

docker load:导⼊使⽤docker save命令导出的镜像。即将本地⽬录下的镜像备份⽂件导⼊到本地Docker仓库。 

5.4.1 语法 

docker load [OPTIONS]

 OPTIONS说明:

5.4.2 实例 

1.先删除原有的redis:v1镜像。 

docker rmi bd9bed67af3f

 2.通过load命令导⼊Redis镜像。

docker load -i redis_v1.tar

 3.查看镜像。

docker images

 4.安装完成后,我们可以使⽤以下命令来运⾏Redis容器:

docker run -itd --name myredis -p 6379:6379 redis:v1

 6 Docker⽹络

在如下⽣产场景中,在商城系统中的商品搜索功能⾥,假设拆分成三个微服务,分别为商品搜索前台服务、搜索服 务、数据持久化服务。这三个服务采⽤容器化部署。如下图所示:

通过上图可以发现,前台搜索模块调⽤搜索服务,这⾥直接写IP地址,但是采⽤容器化部署,IP地址随时都有可能 发⽣变化的,万⼀IP地址发⽣变化,则会导致服务⽆法调通,程序⽆法维护。 

⽽利⽤Docker⽹络可以解决上述问题。下⾯开始⼀步⼀步学Docker相关的知识吧。 

6.1 Centos防⽕墙端⼝ 

开放8080端⼝(如下命令只针对Centos7以上), 如果是云服务器,则需要在安全组开放相关端⼝。 

查看已经开放的端⼝: 

firewall-cmd --list-ports

 开放端⼝:

firewall-cmd --zone=public --add-port=8080/tcp --permanent

 关闭端⼝:

firewall-cmd --permanent --zone=public --remove-port=8080/tcp

 开启防⽕墙:

systemctl start firewalld

 重启防⽕墙:

firewall-cmd --reload # 重启

firewall systemctl stop firewalld.service # 停⽌

firewall systemctl disable firewalld.service # 禁⽌firewall开机启动

 6.2 查看Docker的⽹络连接

此时保证Docker服务处于启动状态。 

使⽤ ifconfig 命令查看本机的连接。 

使⽤ ip addr 命令查看⽹络连接。 

重要说明: 

其中docker0表示虚拟⽹桥。通过命令查看的结果可能不⼀致,取决于⾃⼰的机器情况。 

6.3 Docker⽹络的相关命令 

6.3.1 Docker⽹络的相关命令介绍 

通过 docker network --help 命令,查看Docker相关⽹络的命令。 

docker network --help

 语法:

docker network COMMAND

 COMMAND命令说明:

6.3.2 Docker⽹络的相关命令使⽤ 

列出Docker的所有⽹络。 

docker network ls

 说明:默认有三个⽹络信息,分别是 bridge 、 host 、 none 。

创建⼀个简单的⽹络。并再次查看⽹络。 

# 语法:docker network create ⽹络名称

docker network create test_network

docker network ls

 查看详细的⽹络信息。

# 语法:docker network inspect NETWORK ID/NAME/DRIVER

docker network inspect test_network

 6.3.3 Docker⽹络解决的问题

1.容器间的互联和通信以及端⼝映射。 

2.容器的IP变动的时候,通过服务名称直接⽹络通信⽽不受影响。 

6.4 Docker的⽹络模式 

Docker的⽹络模式介绍⻅下表:

6.5 bridge模式 

6.5.1 容器实例默认⽹络⽣成规则介绍 

实例场景,启动两台CentOS容器,分别进⼊这两台容器当中,分别查看容器内的⽹络情况,查看两个容器的IP是 否相同。

# 1.拉取centos镜像

docker pull centos

# 2.启动两台centos容器

docker run -itd --name=centos01 centos

docker run -itd --name=centos02 centos

# 3.获取容器的元数据

docker inspect 33427c5a4805

docker inspect 3f8b139964ab

 Docker服务默认会创建⼀个docker0⽹桥,该⽹桥的名称是docker0 。它在内核层连通了其他的物理或者虚拟的⽹ 卡,这将所有容器和本地主机放到 同⼀个物理⽹络 。docker默认指定了docker0接⼝IP地址和⼦⽹掩码,让主机和 容器之间通过互相通信。

6.5.2 容器实例默认⽹络⽣成规则原理 

查看当前⽹络情况。 

ifconfig

ip addr

 基本原理:

(1) Docker使⽤Linux进⾏桥接,在宿主机虚拟出⼀个Docker⽹桥 docker0 。

(2) Docker在启动⼀个容器时会根据Docker⽹桥的⽹段分配给容器⼀个IP地址,称为 container-ip 。同时, Docker⽹桥是每个容器的默认⽹关。

(3) 在同⼀台宿主机内的容器都接⼊⼀个⽹桥,这样容器之间就能够通过容器的 container-ip 进⾏通信。

(4) 使⽤ docker run 命令启动容器的时候,如果没有指定 network 的话,则默认使⽤的是 bridge 模式,使⽤的 其实就是 docker0 ,在宿主机执⾏ ifconfig 的时候,就可以看到 docker0 和⾃⼰ create 的⽹络了, eth0、 eth1、eth2...代表⽹⽹卡⼀、⽹卡⼆、⽹卡三。

lo表示127.0.0.1地址,即本地⽹络。inet表示⽹卡的IP地址。

整个宿主机⽹络模式都是docker0,类似⼀个交换机有⼀⼤堆接⼝,每个接⼝称为veth,在本地主机和容器内分别 创建⼀个虚拟接⼝,并让他们彼此联通,这个⼀对接⼝称为veth pair。

每个容器实例内部都有⼀块⽹卡eth0。docker0上⾯的每个veth匹配某个容器内部的eth0,两两配对,⼀⼀匹配。

将宿主机上的所有容器都连接到这个内部⽹络上,两个容器在同⼀个⽹络下,会从这个⽹络拿到分配的IP,此时两 个容器的⽹络互通的。

bridge模式原理图:

6.5.3 验证⽹桥模式 

使⽤Tomcat验证⽹桥模式。操作步骤如下所示:

1.拉取Tomcat镜像。

docker pull tomcat

 2.创建两个容器,这⾥不指定⽹络模式默认就表示⽹桥模式。

docker run -d -p 8081:8080 --name=tomcat01 tomcat:latest

docker run -d -p 8082:8080 --name=tomcat02 tomcat:latest

# 完整写法,不省略⽹络模式

docker run -d -p 8081:8080 --network=bridge --name=tomcat01 tomcat:latest

docker run -d -p 8082:8080 --network=bridge --name=tomcat02 tomcat:latest

参数说明:-p表示将宿主机端⼝号映射到容器。

3.进⼊登录容器分别安装如下命令,⽤来查看Tomcat容器内的⽹络情况。 

# 登录tomcat01容器,并安装以下⼯具

docker exec -it 3d9a01ee82f7 /bin/bash

apt update

apt install -y iproute2

apt install -y net-tools

# 登录tomcat02容器,并安装以下⼯具

docker exec -it db9f30a0ea6f /bin/bash

apt update

apt install -y iproute2

apt install -y net-tools

 4.查看tomact01和tomact02以及宿主机的⽹络情况。

# 查看容器内⽹络情况,由于安装了ip addr⼯具,所以可以直接查看

root@3d9a01ee82f7:/usr/local/tomcat# ip addr

root@db9f30a0ea6f:/usr/local/tomcat# ip addr

# 查看宿主机⽹络情况

[root@localhost ~]# ip addr

 5.宿主机⽹络、容器⽹络关系展示。

6.6 host模式 

容器直接使⽤宿主机的IP地址及端⼝号与外界通信,不再需要额外进⾏nat转换(⽹络地址转换)。 

容器将不会获得⼀个独⽴的network namespace,⽽是和宿主机共⽤⼀个network namespace。简单来说,容器 将不会再虚拟出⾃⼰的⽹卡,⽽是使⽤宿主机的IP和端⼝号。 

1.创建tomcat容器,指定容器的⽹络模式为host模式,查看容器和宿主要的⽹络情况。 

# 指定⽹络模式为host模式,这⾥要特别注意,如果指定了network=host,则不能再⽤-p参数指定端⼝映射了,两

者只能使⽤⼀种,因为-p表示bridge模式。

# 如果同时指定,则在启动容器的时候得到⼀个警告,并通过-p参数设置的端⼝映射不⽣效。

[root@localhost ~]# docker run -itd --name=tomcat03 --network=host tomcat:latest

 2.查看容器的⽹络情况。

[root@localhost ~]# docker exec -it 33b6d7346e08 /bin/bash

root@33b6d7346e08:/usr/local/tomcat# apt update

root@33b6d7346e08:/usr/local/tomcat# apt install -y iproute2

root@33b6d7346e08:/usr/local/tomcat# apt install -y net-tools

root@33b6d7346e08:/usr/local/tomcat# ip addr

 3.查看宿主机的⽹络情况。对⽐宿主机的的⽹络和容器的⽹络情况,可以观察出,它们俩⼀样,也就表明,容器是 使⽤的宿主机的⽹络,并没有进⾏⽹络转换

ip addr

 4.查看容器的详细信息。

docker inspect 33b6d7346e08

 5.访问Tomcat服务,地址: http://IP:8080。IP是宿主机的IP地址;端⼝号是Tomcat默认端⼝号。例如http://192. 168.230.120:8080。只能在CentOS系统内访问该请求。

6.如果再启⼀台Tomcat容器,并且依然采⽤host模式,此时是启动不了。如下所示:

docker run -itd --name=tomcat04 --network=host tomcat:latest

7.结果启动不了,查看启动⽇志。 

docker logs tomcat04

 8.⽇志提示BindException异常,显示IP地址已经被使⽤。

总结:host模式与宿主机共⽤IP地址和端⼝号,通过 --network=host 来指定。开发当中不常⽤,因为同⼀镜像, ⽆法启动多个容器。 

6.7 none模式 

禁⽤容器的⽹络功能,只有lo⽹络,lo表示本地环回⽹络,即127.0.0.1地址。none模式下,并不为docker容器进 ⾏任何⽹络配置,容器当中并没有⽹卡、IP、路由等信息,需要我们⾃⼰为docker容器添加⽹卡、配置IP等。 

1.创建tomcat容器,并指定⽹络模式为none。 

docker run -itd --name=tomcat05 --network=none tomcat:latest

 2.查看宿主机⽹络情况。

ip addr

 3.查看容器的详细信息当中的⽹络信息。

docker inspect ab82468fb166

 4.进⼊容器,查看容器内的⽹络情况。

docker exec -it ab82468fb166 /bin/bash

 5.执⾏ apt update 时,会报错,因为并没有⽹络。

总结:none模式不做深⼊研究,了解即可。实际开发当中,⼏乎没有啥⽤。 

6.8 container模式 

container模式下,新建的容器不会创建⾃⼰的⽹卡和配置⾃⼰的IP,⽽是和⼀个指定的容器(已经存在的容器) 共享⼀个⽹络IP、端⼝号等,⽽不是和宿主机共享。但是需要注意的是,两个容器之间除了⽹络⽅⾯,⽽其它如⽂ 件系统、进程等依然是相互隔离的。其原理如下图所示: 

通过上图可以发现,docker container A的⽹络共享了docker container B⽹络。docker containe B和docker container C采⽤的都是bridge模式。 

使⽤Alpine Linux演示container模式。Alpine官⽅地址:https://www.alpinelinux.org。Alpine以其⼩巧、简单在 Docker容器中得到了⼴泛的应⽤。适合容器打包等操作,使⽤起来⼗分⽅便、快捷。对于Alpine只是使⽤,不做深 ⼊研究。感兴趣,⾃⼰通过官⽹学习即可。 

1拉取Alpine镜像。 

docker pull alpine:latest

2.创建两个Alpine容器,按如下操作。

# 启动容器apline1

docker run -itd --name=alpine1 alpine:latest

# 启动容器apline2

docker run -itd --network=container:alpine1 --name=alpine2 alpine:latest

 3.进⼊alpine1容器,查看⽹络情况。注意后⾯要写sh。

docker exec -it alpine1 sh

 4.进⼊alpine2容器,查看⽹络情况。可以发现,容器alpine2共享了alpine1的IP地址。

docker exec -it alpine2 sh

 5.关闭alpine1容器,再次观察alpine2⽹络情况。关闭alpine1容器。

docker stop alpine1

 6.再次查看alpine2容器的⽹络情况。

docker exec -it alpine2 sh

 6.9 ⾃定义⽹络模式

我们已经学习了关于Docker⽹络四种模式,包括bridge、host、none、container模式。其中bridge模式是为常 ⽤,⽽其它三种模式在实际开发当中⽤的较少。但是bridge模式依然不能满⾜开发当中的需求。设想以下场景,当 两个容器相互调⽤的时候,需要通过IP地址来相互通信,但是容器的IP地址可能会发⽣变化,最终导致服务不可 ⽤。正确的做法是不依赖于容器的IP地址,⽽是依赖于容器的服务名称,只有这样,不管容器的IP如何变化,只要 容器的服务名称不变,则服务依然可⽤。 

基于以上考量,我们必须要学习⾃定义⽹络配置,且这种⽹络⽅式必须要掌握。⾃定义bridge⽹络,⾃定义⽹络默 认使⽤的就是bridge模式。 

1.新建⾃定义⽹络。 

docker network create test_network

 2.新建两个Alpine容器,将创建的容器加⼊到新建的⽹络test_network当中。

# 创建容器。指定⽹络为⾃定义⽹络

docker run -itd --network=test_network --name=alpine1 alpine:latest

# 创建容器。指定⽹络为⾃定义⽹络

docker run -itd --network=test_network --name=alpine2 alpine:latest

 3.进⼊alpine1容器,使⽤ ip addr 查看⽹络情况。

docker exec -it alpine1 sh

 4.在alpine1容器中,使⽤ping命令,ping容器alpine2的服务名称。这⾥的服务名称指的就是容器的名称。

ping alpine2

 5.进⼊alpine2容器,使⽤ ip addr 查看⽹络情况。并在alpine2容器中,使⽤ping命令,ping容器alpine1的服务 名称。

docker exec -it alpine2 sh

 6.使⽤IP地址相互ping,看⼀下容器之间是否互通。在alpine1容器中ping容器alpine2的IP地址。

docker exec -it alpine1 sh

ping 172.18.0.3

 7.在alpine2容器中ping容器alpine1的IP地址。

docker exec -it alpine2 sh

ping 172.18.0.2

 ⾃定义⽹络本身就维护了主机名称与IP的对应关系,所以IP和域名都可以ping通。这⾥的主机名称、服务名称都是 指容器的名称。

⾃定义⽹络主要应⽤在容器编排、使⽤容器部署各个微服务的时候,微服务与微服务之间相互调⽤可以使⽤Docker 的⾃定义⽹络。 

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。