虚拟化技术是一种计算机资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的不可切割的障碍。使用户可以比原本的组态更好的方式,来应用这些资源。
虚拟化技术主要作用:
高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件。
软件跨环境迁移问题(代码的水土不服)。
在一台主机上实现多个操作系统,关键技术就是硬件的虚拟化。
首先,可以解决以下几个问题:
1.合作开发的时候,在本机可以跑,别人的电脑跑不起来。
这里我们以Java Web应用程序为例,一个Java Web应用程序涉及很多东西,比如JDK、Tomcat、Spring等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序直接打包成镜像,直接运行在容器中即可。
2.服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了。
这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
3.公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。
在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,这时就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给你跑多少容器,极大地提高了部署效率。
“Debug your app, not your environment!”。调试您的应用程序,而不是您的环境!
官网的介绍是“Docker is the world’s leading software container platform.”。官方给Docker的定位是一个应用容器平台。
Docker是一个开源的应用容器引擎,诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名为Docker Inc)。从17.03版本之后,Docker分为CE(Community Edition-社区版)和EE(Enterprise Edition-企业版)版本,Docker CE是免费版。
Docker可以让开发者打包他们的应用,以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。Docker容器是完全使用沙箱机制,相互隔离,性能开销也极低。
Docker通俗的讲是服务器中高性能的虚拟机,可以将一台物理机虚拟N多台虚拟机的机器,互相之间隔离,互不影响。
想要搞懂Docker ,其实看它的两句口号就行。第一句是“Build, Ship and Run”。也就是“搭建、发送、运行”,三板斧。
举个例子。我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、 画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。怎么样?是不是很神奇!
Docker的第二句口号就是“Build once, Run anywhere.”,意思是“搭建一次,到处能用”。
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上。也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
1.标准化交付:Docker将应用程序打包成一个标准的运行单元,用于交付、部署。
2.轻量级:容器包含了所有的运行所需的环境(JDK、Tomcat、MySQL…),非常轻量级。
3.高可用:容器化的应用程序,可以在任何Linux环境下来运行。
4.隔离性:容器的应用程序,具有隔离性,在同一台主机上可以共享同一台主机的系统资源,彼此独立、互不干扰。
1.Web应用程序自动打包和发布。
2.自动化测试、持续集成、发送。
3.在服务器环境中部署和调整服务器数据库和其他的应用后台。
4.搭建自己的Paas、SaaS平台。
5…
虚拟机:VMWare。直接在硬件的层面进行虚拟化实现的技术。
容器:Docker。是在操作系统层面进行虚拟化实现的技术。Docker是直接复用本地的操作系统。
Docker容器作为一种轻量级的虚拟化技术,和传统虚拟机技术的特性差异如下表所示:
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
存储占用 | MB级 | GB级 |
性能对比 | 接近原生级别 | 理论达不到原生级别 |
系统量级 | 单机可支持上千个 | 单机支持几十个 |
安全能力 | 依赖宿主系统安全能力 | 完全隔离 |
相同:容器和虚拟机都是虚拟化技术,具备资源隔离和分配优势。
不同:
Docker虚拟化的是操作系统,虚拟机虚拟化的是硬件。
传统虚拟机可以运行不同的操作系统,Docker主要运行同一类操作系统(Linux)。
比较上面两张图,我们发现虚拟机是携带操作系统的,本身很小的应用程序却因为携带了操作系统而变得非常大且很笨重。而Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
Docker采用C/S架构(Client、Server)。他们可以运行在同一台主机上。
Docker Server:负责搭建、运行、分发Docker镜像。
Docker Client:负责通过RestFul风格请求和其他的网络请求、网络远程通信。
Docker架构设计图:
从上图能够看到,Docker体系的核心组件包括如下几部分:
Docker Client:Docker客户端。
Docker Daemon:Docker守护进程。
Docker Container:Docker容器。
Docker Image:Docker镜像。
Docker Registry:Docker仓库(Docker镜像仓库,是用来存储Docker镜像的远程仓库)。
1.镜像Image
Docker镜像和虚拟机镜像的概念是一样的,可以将其理解为一个面向Docker引擎的只读模板,可用于批量创造可运行的容器实例。Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像是创建Docker容器的基础,而Docker体系能够提供一套简单的机制创建和更新已有的镜像,也可以从网上下载一个制作好的现成的镜像。
2.容器Container
Docker容器是一个运行时的概念,可以理解为一个简易的Linux系统环境(包括root用户权限、进程空间、网络空间等概念)以及运行在其中的应用程序。每个Docker容器本质上就是一个Linux进程,拥有自己的上下文环境,彼此隔离。Docker引擎能够对一个容器进行启动、停止、删除等操作。
3.仓库Reopsitory
Docker仓库类似代码仓库,是Docker体系集中存放镜像文件的场所。一般情况下,一个仓库会包含同一个软件不同版本的镜像,用“标签”的概念来标记版本。可以通过<仓库名>:<标签>
的格式来精确定位具体采用哪个镜像。如果不指定标签,则采用latest作为默认标签。
根据存储的镜像公开与否,可以分为公开仓库(Public)和私有仓库(Private),目前最大的公开仓库是Docker Hub,用户可以在自己的本地网络中创建私有仓库。
Docker利用仓库管理镜像的理念类似于Git,默认情况下Docker会在中央仓库(Docker Hub和Docker Cloud)寻找镜像文件。
4.客户端Client
Docker Client提供了命令行界面(CLI),是用户与Docker进行交互的主要窗口。通过Client可以构建、运行和停止容器,还可以与远程的Docker Server进行交互。
5.守护进程Daemon
Docker Daemon是最核心的后台服务进程,以Linux后台服务的方式运行,也称为守护进程。它负责响应来自Docker Client的请求,内部对请求进行路由分发,交给具体的管理模块进行处理。
先在本地电脑上安装虚拟机(Windows系统-VMware Workstation Pro虚拟机,Mac系统-VMware Fusion虚拟机),然后在虚拟机上搭建Linux操作系统,最后在Linux操作系统中安装Docker容器。
根据不同的本地操作系统,选择安装不同的虚拟机。例如,Windows系统上,安装VMware Workstation Pro虚拟机;Mac系统上,安装VMware Fusion虚拟机。
虚拟机的安装以及虚拟机上Linux操作系统的安装自行参考其他教程。在使用Docker的时候,需要从镜像仓库下载镜像,因此虚拟机上所搭载的Linux操作系统必须处于联网的状态。
网络适配器三种模式的介绍,具体见以下内容。
桥接模式的虚拟机,就像一个在路由器“民政局”那里“上过户口”的成年人,有自己单独的居住地址,虽然和主机住在同一个大院里,但好歹是有户口的人,可以大摇大摆地直接和外面通信。
NAT模式的虚拟机,纯粹就是一个没上过户口的黑户,路由器“民政局”根本不知道有这么个人,自然也不会主动和它通信。即使虚拟机偶尔要向外面发送点的信件,都得交给主机以主机的名义转发出去,主机还专门请了一位叫做NAT的老大爷来专门负责这些虚拟机的发信、收信事宜。
仅主机模式的虚拟机,纯粹是一个彻彻底底的黑奴,不仅没有户口、路由器“民政局”不知道这么号人,还被主机关在小黑屋里,连信件也不准往外发。
其中这个仅主机模式能够保障我们在拔掉网线的情况下继续连接我们的虚拟机,不依靠公网连接,而是依靠物理机和虚拟机的关系连接。在断网的情况下,利用这个模式,我们可以继续连接虚拟机,实现我们的操作。
Docker推荐在Ubuntu操作系统上安装Docker软件。
学习Docker在CentOS系统上来进行安装和编程的。CentOS建议使用7.x版本。
在CentOS中安装Docker软件:
1.在原有的CentOS克隆一台新的主机。
2.启动CentOS系统,使用root用户登录。
3.查看电脑上是否已经安装Docker软件。
yum list installed | grep docker
4.Docker要求CentOS系统的内核版本高于3.10 ,通过uname -r
命令查看你当前的内核版本是否支持安账Docker。
uname -r
5.安装Docker软件。
yum -y install docker
6.安装后查看Docker软件的版本。
# 查看Docker版本方式一
docker -v
# 查看Docker版本方式二
docker version
命令:systemctl管理Docker的进程。
1.启动Docker
systemctl start docker
2.查看Docker状态
systemctl status docker
3.停止Docker服务
systemctl stop docker
4.开机自启动
systemctl enable docker
5.重新启动
systemctl restart docker
6.查看信息:必须是运行状态查看信息
docker info
7.查看Docker的帮助文档
docker --help
8.查看Docker的版本
docker version
默认情况下,从Docker Hub(https://hub.docker.com)下载Docker镜像太慢,一般都会配置镜像加速器。
国内从Docker Hub(https://hub.docker.com)拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker官方和国内很多云服务商都提供了国内加速器服务,例如:
镜像提供商 | 镜像地址 |
---|---|
科大镜像 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://<你的ID>.mirror.aliyuncs.com |
网易 | https://hub-mirror.c.163.com |
七牛云加速器 | https://reg-mirror.qiniu.com |
当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了Docker镜像加速服务,建议根据运行Docker的云平台选择对应的镜像加速服务。
对于使用systemd的系统,请在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)。
1.中科大镜像
中国科学技术大学(University of Science and Technology of China,简称USTC)是老牌的Linux镜像服务提供者了,还在遥远的Ubuntu 5.04版本的时候就在用。USTC的Docker镜像加速器速度很快。USTC Docker Mirror的优势之一就是不需要注册,是真正的公共服务。
通过vim命令编辑daemon.json文件。
vim /etc/docker/daemon.json
在daemon.json文件中输入如下内容。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
2.阿里云镜像
使用阿里云Docker镜像,必须要先注册阿里云账号,然后可以自己从阿里云上申请Docker镜像地址,阿里云会为每个账户分配一个免费的Docker镜像加速地址,速度极快。
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了。
通过vim命令编辑daemon.json文件。
vim /etc/docker/daemon.json
在daemon.json文件中输入如下内容。
{
"registry-mirrors": ["https://3ad96kxd.mirror.aliyuncs.com"]
}
3.重新启动服务
配置完成后,需要重新启动服务。
systemctl daemon-reload
systemctl restart docker
4.检查加速器是否生效
检查加速器是否生效配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info
,如果从结果中看到了如下内容,说明配置成功。
docker info
Registry Mirrors:
https://docker.mirrors.ustc.edu.cn
1.语法
表示从Docker配置的镜像仓库查看镜像。必须要保证操作系统CentOS可以联网。
docker search [option] term
term表示镜像名称(tomcat)。
OPTIONS说明:
参数 | 描述 |
---|---|
–automated | 只列出automated build类型的镜像 |
–no-trunc | 显示完整的镜像描述 |
-f <过滤条件> | 列出收藏数不小于指定值的镜像 |
参数说明:
属性 | 描述 |
---|---|
NAME | 镜像仓库源的名称 |
DESCRIPTION | 镜像的描述 |
STARS | 类似GitHub里面的star,表示点赞、喜欢的意思 |
OFFICIAL | 是否Docker官方发布,如果该项取值为OK表示是Docker官网推出的镜像 |
AUTOMATED | 自动构建,如果取值为OK表示可以自动构建 |
1.语法
表示从Docker镜像仓库拉取镜像或者更新指定的镜像。
docker pull [option] name[:tag]
:tag表示下载的镜像版本。默认情况下,会下载最新版本的镜像。
注意:在下载镜像的时候,如果产生未完成,重新在执行加载的命令。
1.语法
查看本地下载的所有镜像。
docker images [option] name[:tag]
2.参数
OPTIONS说明:
参数 | 描述 |
---|---|
-a | 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) |
–digests | 显示镜像的摘要信息 |
-f | 显示满足条件的镜像 |
–format | 指定返回值的模板文件 |
–no-trunc | 显示完整的镜像信息 |
-q | 只显示镜像ID |
1.语法
表示从本地镜像库中删除一个或多个镜像。
docker rmi [option] image [...]
OPTIONS说明:
参数 | 描述 |
---|---|
-f | 强制删除 |
–no-prune | 不移除该镜像的过程镜像,默认移除 |
2.案例
删除本地仓库中的tomcat镜像。
docker rmi -f tomcat jdk
docker rmi -f tomcat:8
1.表示列出所有的容器
docker ps [option]
如果在ps关键字后没有任何参数,默认只会查询出所有运行着的容器。
option参数列表:
参数 | 描述 |
---|---|
-a | 显示所有的容器,包括未运行的 |
-f | 根据条件过滤显示的内容 |
–format | 指定返回值的模板文件 |
-l | 显示最近创建的容器 |
-n | 列出最近创建的n个容器 |
–no-trunc | 不截断输出 |
-q | 静默模式,只显示容器编号 |
-s | 显示总的文件大小 |
容器的状态分为7种类型:
Docker run: 创建一个新的容器并运行一个容器。
1.语法。
docker run [option...] image
option参数说明:
参数 | 描述 |
---|---|
-a stdin | 指定标准输入输出内容类型,可选STDIN/STDOUT/STDERR三项 |
-d | 后台运行容器,并返回容器ID |
-i | 以交互模式运行容器,通常与-t同时使用 |
-P | 随机端口映射,容器内部端口随机映射到主机的端口 |
-p | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与-i同时使用 |
–name=“nginx-lb” | 为容器指定一个名称 |
–dns 8.8.8.8 | 指定容器使用的DNS服务器,默认和宿主一致 |
–dns-search example.com | 指定容器DNS搜索域名,默认和宿主一致 |
-h “mars” | 指定容器的hostname |
-e username=“ritchie” | 设置环境变量 |
–env-file=[] | 从指定文件读入环境变量 |
–cpuset=“0-2” or --cpuset=“0,1,2” | 绑定容器到指定CPU运行 |
-m | 设置容器使用内存最大值 |
–net=“bridge” | 指定容器的网络连接类型,支持bridge/host/none/container四种类型 |
–link=[] | 添加链接到另一个容器 |
–expose=[] | 开放一个端口或一组端口 |
–volume, -v | 绑定一个卷 |
2.案例。
启动nginx分配一个名称mynginx01.
启动nginx分配一个随机端口,名称mynginx02。
启动nginx交互的方式来启动,名称mynginx03。
启动nginx映射主机的端口8001,名称mynginx05。
3.完整的写法:
docker run -it --name mynginx -p 8002:80 -d nginx /bin/bash
语法。
docker start name:表示启动一个或者多个已经被停止的容器
docker stop name: 表示停止一个运行中的容器
docker restart: 重启一个容器
docker exec:在运行的容器中执行命令操作。
1.语法。
docker exec [option] contianer
option参数:
2.案例。
在nginx服务器中开启一个交互式的终端。
在后台运行nginx服务。
Docker inspect: 获取容器或者是镜像的元数据信息。
1.语法。
docker inspect [option] name或id
option参数:
2.案例。
Docker rm: 删除一个或者多个容器。
1.语法。
docker rm [option] contianer ...
option参数:
docker cp: 表用用于从容器和主机之间进行文件的数据拷贝操作(双向)。
1.语法。
docker cp [option] 资源 容器:路径
参数:-L。保存源目标中的连接。
2.案例。
mkdir /root/test01/docker.txt
docker exec -it mysql-test /bin/bash
ll # Docker容器的目录结果和Linux系统的目录结果相同
cd /root
ll
docker cp mysql-test:/root/docker.txt /tmp/
cd /tmp/
ll
docker.txt
在创建容器的时候,将主机的一个目录与容器的一个目录指定映射关系,这样我们可以通过修改主机目录的文件从而去影响容器的内容。
在创建容器的时候添加一个-v参数。表示在创建容器的时候来指定目录的挂载。
-v后面跟的参数是:宿主机的目录:容器目录
主机:/root/test01
容器:/root/test01
docker run -di -v /root:/root --privileged=true --name mysql02 mysql
表示:–privileged=true表示开放映射目录的访问权限。
数据卷表示的是主机中的一个目录或者一个文件。当容器目录和主机目录绑定后,对方的修改都会立即生效同步。一个数据卷可以同时被多个容器挂载,一个容器可以挂载多个数据卷。数据卷本质上就是一个共享的文件夹或者文件。目的是在主机和容器之间高效的共享数据来使用的。
数据卷作用:
容器数据持久化
外部主机和容器之间进行通信
容器之间数据交换(容器间的数据通信)
1.一个容器挂载一个数据卷
1.在创建容器的时候,通过参数-v来指定一对一的挂载关系。
docker run ... -v 宿主机目录(文件):容器内的目录(文件) ...
2.语法注意:
3.案例。
拉取CentOS镜像。
docker pull centos:7
启动容器,并指定一对一的映射。
docker run -di --name=centos_1 -v /root/host_data1:/root/c1_data --privileged=true centos:7 /bin/bash
查看容器中是否有指定的数据卷目录。
docker inspect 容器名称/容器id
docker inspect centos_1
数据结果:
"Mounts": [
{
"Type": "bind",
"Source": "/root/host_data1",
"Destination": "/root/c1_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
....
}
],
2.一个容器挂载多个数据卷
挂载方式。
... -v 映射2 -v 映射2 ...
在创建容器时,同时指定过个数据卷的挂载。
docker run -di --name centos_2 -v /root/host_data2:/root/c2_data -v /root/host_data3:/root/c3_data centos:7 /bin/bash
查询挂载的结果:
"Mounts": [
{
"Type": "bind",
"Source": "/root/host_data2",
"Destination": "/root/c2_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/root/host_data3",
"Destination": "/root/c3_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
3.多个容器挂载一个数据卷
多个容器挂载一个数据卷,实现容器之间数据共享。
[root@localhost ~]# docker run -di --name=centos_3 -v /root/host_data_common:/root/c3_data centos:7
39e4bb264edf3d71725d2f9cfb3d3427be650aff956af66c872eae56dd64b37c
[root@localhost ~]# docker run -di --name=centos_4 -v /root/host_data_common:/root/c4_data centos:7
451381a550425d26a7c231845b68b54274d63c53b2133e0ecccf67be54116f1d
[root@localhost ~]#
Docker通过镜像安装成一个可以运行的程序,就把这个程序称之为该镜像的一个实例。
1.在Docker Hub搜索。
2.在本地的命令行客户端搜索。
3.拉取MySQL镜像。
docker pull mysql:latest
4.运行。通过该镜像来运行一个此镜像的容器。
docker run -itd --name mysql-test -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
参数说明:
参数 | 描述 |
---|---|
-p 3306:3306 | 映射容器服务的3306端口到宿主机的3306端口,外部主机可以直接通过宿主机ip:3306 访问到MySQL的服务 |
MYSQL_ROOT_PASSWORD=123456 | 设置MySQL服务root用户的密码 |
mysql-test | 是您要分配给容器的名称 |
/var/lib/mysql | 默认情况下MySQL将在其中写入其数据文件 |
/root/mysql/data | 在主机系统上的合适卷上创建一个数据目录 |
/logs | MySQL日志数据目录 |
/root/mysql/logs | 在主机系统上的合适卷上创建一个日志目录 |
5.查看是否有容器。
[root@localhost network-scripts]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4584141265e6 mysql "docker-entrypoint..." About a minute ago Up 59 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp mysql-test
6.通过登录MYSQL容器,然后通过命令行访问MySQL数据库。
docker exec -it mysql /bin/bash
Nginx是一个高性能的HTTP和反向代理的Web服务器(前端项目部署在Nginx上),同时也提供了POP3/SMTP/IMAP服务。
1.拉去Nginx镜像。
docker pull nginx:1.23.2
docker pull nginx
docker pull nginx:latest
2.查看本地镜像。
docker images
3.启动Nginx一个容器(运行了一个Nginx实例 - Nginx容器)。
docker run --name mynginx -p 80:80 -d nginx
语法:端口1:端口2。端口2表示Docker内给Nginx分配的端口号。端口1表示主机的映射端口。
4.查看当前有哪些容器。
docker ps
5.在浏览器的地址栏来访问Nginx的主页。
http://ip:80
Redis是一个key-value结构的非关系型数据(NoSQL)。Redis是一个基于ANSIC编程语言、支持网络、是基于内存操作的数据库。
1.拉去Redis镜像。
docker pull redis
2.运行Redis容器。
docker run -itd --name myredis -p 6379:6379 redis
3.通过Docker容器打开一个Redis交互窗口。
docker exec -it myredis /bin/bash
4.进入Redis终端。
redis-cli # 表示进入Redis命令行终端
127.0.0.1:6379> info server # 表示查看Redis数据库的基本信息
1.将开发环境下Docker中对应的容器(mysql容器)持久化成一个新的镜像。
2.将将镜像保存成一个压缩包(tar),发送给对应的生产环境下的服务器。
3.在生产环境下的服务器中解压该压缩包,解压后是一个镜像,可以通过该镜像去实例化出一个新的容器。
docker commit: 通过一个容器创建出一个镜像。
语法:
docker commit [option] contianer
option参数说明:
参数 | 描述 |
---|---|
-a | 提交的镜像作者 |
-c | 使用Dockerfile指令来创建镜像 |
-m | 提交时的说明文字 |
-p | 在commit时,将容器暂停 |
将myredis容器做成一个镜像,镜像名称:redis:v1。
镜像备份其实就是把一个镜像打包一个tar压缩包文件。
docker save:表示将指定的一个镜像保存成一个压缩包(tar归档文件)。
docker save -o image
-o表示压缩后的tar文件的名称。
使用:
[root@localhost ~]# docker save -o redis_v1.tar redis:v1
迁移就是表示,把之前打包的redis_v1.tar发送给目标服务器。
恢复就表示将redis_v1.tar解压后得到的镜像,通过该镜像实例化一个容器。
docker load: 将指定通过save保存的镜像到处一个镜像。
语法:
docker load [option]
参数解析
参数 | 描述 |
---|---|
–input或-i | 指定导入的文件,代替STDIN,表示解压那一个压缩包 |
–quiet或-q | 精简输出信息 |
1.删除原有镜像。
docker rmi redis:v1
2.通过load将redis_v1.tar进行解压。
[root@localhost ~]# docker load -i redis_v1.tar # 解压指定的压缩包,获取了一个镜像
1ccdfc9f2656: Loading layer [==================================================>] 5.12 kB/5.12 kB
Loaded image: redis:v1
[root@localhost ~]# docker images # 查询是否有该指定的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
redis v1 7e80f711b8cb 14 minutes ago 111 MB
docker.io/mysql latest e8ff7e619492 6 days ago 550 MB
docker.io/redis latest 2718634043dc 2 weeks ago 111 MB
docker.io/nginx latest 6b3e1257976b 3 weeks ago 135 MB
docker.io/tomcat latest 352636988d47 3 weeks ago 469 MB
docker.io/centos 7 c9a1fdca3387 9 months ago 301 MB
[root@localhost ~]# docker run -itd --name=myredis01 -P redis:v1 # 通过run启动一个redis容器
5d30589fe18503599f77fa2c406ef22502dfde28108a0660f9474fe3a8bde71f
[root@localhost ~]# docker ps # 查询redis容器是否启动
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d30589fe185 redis:v1 "docker-entrypoint..." 8 seconds ago Up 8 seconds 0.0.0.0:32768->6379/tcp myredis01
451381a55042 centos:7 "/bin/bash" 52 minutes ago Up 52 minutes centos_4
39e4bb264edf centos:7 "/bin/bash" 53 minutes ago Up 53 minutes centos_3
f8018f2c815e centos:7 "/bin/bash" 59 minutes ago Up 59 minutes centos_2
15654a6b10b1 centos:7 "/bin/bash" About an hour ago Up About an hour centos_1
29be86829992 tomcat:latest "/bin/bash" 11 hours ago Up About an hour 0.0.0.0:8081->8080/tcp tomcat
2cf77d9e73d5 redis "docker-entrypoint..." 17 hours ago Up 19 minutes 0.0.0.0:6379->6379/tcp myredis
[root@localhost ~]#