Docker安装
Docker导入和导出镜像
一、Docker概述
1.1 Docker简介
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是:Build, Ship and Run Any App, Anywhere,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行Build once,Run anywhere。
应用部署的环境问题
大型项目组件较多,运行环境也较为复杂,部署时会遇到一些问题
-
依赖关系复杂,容易出现兼容性问题
-
开发、测试、生产环境有差异
一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
Docker解决依赖兼容
而Docker却巧妙的解决了这些问题,Docker是如何实现的呢?
Docker为了解决依赖的兼容问题的,采用了两个手段:
-
将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
-
将每个应用放到一个容器去运行,避免互相干扰。
1.2 传统虚拟机和容器
传统虚拟机(virtual machine):
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如VirtualBox、VMware等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
缺点:资源占用多、冗余步骤多、启动慢
Linux容器(Linux Container,简称LXC):
Linux容器是与系统其他部分分隔开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行。
对比:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
大小 | 一般为Mb | 一般为Gb |
速度 | 接近原生 | 比较慢 |
系统支持数量 | 单机支持上千个容器 | 一般几十个 |
1.3 优势
作为一种虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
-
更高效的利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。
-
更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
-
一致的运行环境: Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
-
持续交付和部署:使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。
-
更轻松的迁移
-
更轻松的维护和扩展
Docker运行速度快的原因
Docker有比虚拟机更少的抽象层:
由于Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势。
Docker利用的是宿主机的内核,而不需要加载操作系统OS内核:
当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较耗时耗资源的过程。当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
Docker容器的本质就是一个进程。
1.4 Docker组成
Docker并非一个通用的容器工具,它依赖于已经存在并运行的Linux内核环境。(在Windows上安装Docker时需要依赖WLS,也即Windows下的Linux子系统)。
Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。
Docker的基本组成部分:
-
镜像(image)
-
容器(container)
-
仓库(repository)
1.4.1 Docker镜像
Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
1.4.2 Docker容器
Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
镜像和容器的区别
镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。所以镜像以文件形式保存在硬盘中,可以独立存在。
而容器是个进程,只能靠运行镜像而存在,没有能够脱离于镜像而存在的容器。
从一个镜像可以发起多个容器,而一个容器肯定只能从一个镜像产生。
1.4.3 Docker仓库
Docker仓库是集中存放镜像文件的场所。
仓库分为公开仓库和私有仓库两种。
最大的公开仓库是Docker官方的Docker Hub:https://hub.docker.com/
举个例子:
我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。
这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。
刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而背包,就是Docker仓库。在空地上,用魔法造好的房子,就是一个Docker容器。
Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。
每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!
也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。
这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?
于是乎,就变成了一个大的公共仓库。
负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。
不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?
所以,Docker Registry服务对镜像的管理是非常严格的。
最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。
1.5 Docker架构
Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。
Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。
Docker运行的基本流程为:
-
用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
-
Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
-
Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在
-
Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
-
当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
-
当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
-
Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作
二、Docker安装
2.1 卸载旧版本
如果之前没有安装过docker就不需要进行卸载
如果之前安装过Docker,需要先卸载旧版本:
# 查看安装得docker [root@localhost ~]# rpm -qa | grep docker # 卸载 [root@localhost ~]# sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2.2 安装Docker
2.1 卸载旧版本
如果之前没有安装过docker就不需要进行卸载
如果之前安装过Docker,需要先卸载旧版本:
# 查看安装得docker
[root@localhost ~]# rpm -qa | grep docker# 卸载
[root@localhost ~]# sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
配置资源库(阿里)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
查看版本
Docker version
配置镜像加速
/etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
重启docker
Systemctl restart docker
三. 拉取镜像
Docker pull 镜像的名字
Docker pull nginx
查看镜像
Docker images
创建容器
Docker create --name 容器的名字 -p 暴露的端口号:原本的端口号 镜像的名字
例:Nginx 的镜像 容器 mynginx docker create --name=mynginx -p 80:80 nginx
创建完成容器 并没有运行 想要运行
查看所有的容器
Docker ps -a
启动容器
Docker start 容器的id/容器的名字
根据容器的名字启动
docker start mynginx1
根据容器的id启动
docker start 809308bc1fb3
访问容器
删除容器
根据id 和名字进行删除
容器名字不能重复
语法: docker rm 容器的名字
进入容器
语法:
Docker exec -it 容器的名字/容器的id bash
docker exec -it mynginx bash
修改文件
需要vim 容器中是没有的
安装工具
执行命令:
apt-get update
apt-get install vim
修改首页的信息
四. 导入和导出镜像
导出
docker save -o 名字.tar 镜像id:版本号
导出镜像之后将镜像复制到另外一个服务器中
例: scp ./test.tar root@192.168.184.35/usr
导入
导入镜像
在新的服务器(192.168.184.35)中导入镜像
docker load -i test.tar
查看镜像
[root@hostM1 nginx]# systemctl start docker
[root@hostM1 nginx]# docker load -i test.tar
[root@hostM1 nginx]# docker images