Docker 最初 dotCloud 公司内部的一个业余项目mysql
Docker 基于 Go 语言nginx
Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案web
Docker 的基础是 Linux 容器(LXC)等技术redis
Docker 容器的启动能够在秒级实现,这相比传统的虚拟机方式要快得多sql
Docker 对系统资源的利用率很高,一台主机上能够同时运行数千个 Docker 容器docker
容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机能够理解为模拟运行的一整套操做系统(提供了运行态环境和其余系统环境)和跑在上面的应用。shell
容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机能够理解为模拟运行的一整套操做系统(提供了运行态环境和其余系统环境)和跑在上面的应用。数据库
打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操做的也是集装箱,这个集装箱就静态而言就是一个应用镜像文件,就动态而言,就是一个容器。centos
Docker从狭义上来说就是一个进程,从广义上来说是一个虚拟容器,其实更专业的叫法是应用容器( Application Container ),Docker进程和普通的进程没有任何区别,它就是一个普通的应用进程。不过是用来操做镜像文件的。因此Docker进程+构建的应用镜像文件就等于Docker容器。本文全部讲的Docker都是指Docker容器哦。bash
注意 :
当利用 docker run 来建立容器时,Docker 在后台运行的标准操做包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像建立并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
能够利用 docker start 命令,直接将一个已经终止的容器启动运行。
虚拟化,是目前比较火爆的技术,用于将物理资源转变为逻辑上能够管理的资源,以打破物理结构之间的壁垒,计算元件运行在虚拟的设备上,而不是真实的设备上;
虚拟化的原理,虚拟化的底层是要进行虚拟化的物理机器,基于虚拟化技术将物理机虚拟生成N个虚拟机资源,应用程序、软件(Nginx、Apache、Tomcat、Redis、Memcached等)运行在虚拟机中;
虚拟化的意义,虚拟化的技术不仅仅是将某台物理机虚拟生成N台虚拟机,更广义的含义是将多组物理机资源转变为逻辑资源,同时能够实现统一的资源管理和调度分配;
虚拟化最终的目的,实现高配物理机硬件资源的合理的利用,将物理资源最大化的使用,不浪费任何的资源,淘汰一些效率比较低的服务器硬件,保证IT信息高速的发展;
虚拟化技术,主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能太低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件资源。
docker与传统虚拟化(KVM,XEN等)对比:
Docker容器是在操做系统层面上实现虚拟化,直接复制本地主机的操做系统,而传统方式则是在硬件的基础上,虚拟出本身的系统,再在系统上部署相关的 APP应用。
假设公司需求,须要部署100个Nginx服务,有以下的方案:
采购100台低配物理机,每台物理机部署一个Nginx服务;
采购10台高配物理机,每台物理机虚拟10台虚拟机(配置同低配物理机),每一个虚拟机部署一个Nginx服务(每一个虚拟机部署一个WEB服务);(企业推荐)
Docker虚拟化技术,三个概念:Docker镜像,Docker容器,Docker仓库;
Docker镜像Docker images,相似ISO镜像文件,静止的,不能被修改,一个模板文件;就相似于VM虚拟机里面的快照,可是可比快照轻量化多了。经过ID或者易识别的名字+tag来确认惟一的目标镜像。ImagesID是一个64位的字符,可是通常咱们都是使用前面12位就足够区别了。
镜像是分层的,有基础镜像,仅仅包含操做系统,好比centos镜像;有中间件镜像,好比redis等数据库镜像;最后是应用镜像,就是指具体的应用服务了,应用镜像能够很是丰富,随时能够发布,这三者之间依次叠加。
使用 Docker构建镜像的时候,每个命令都会在前一个命令的基础上造成一个新镜像层。以下图,基础镜像就是centos镜像,中间件镜像就是两个红色圈,应用镜像就是紫色圈。其中redis+centos这样叠加组合的中间件镜像就能够供A服务或者B服务使用,这样叠加组合更加灵活。仍和一种镜像均可以从Docker hub公共仓库中拉取。
Docker容器Docker containers,基于Docker镜像运行的实体,相似程序和进程的关系,进程是程序(软件)运行的实体;从镜像中建立容器,这如同从快照中建立虚拟机; 打个比方,你首先下载了一个Ubuntu的镜像,而后又安装mysql和Django应用及其依赖,来完成对它Ubutun镜像的修改,很是完美应用镜像生成了
Docker容器,基于Docker镜像运行后的实体,相似程序和进程的
镜像就生成一个容器。容器启动以后就会运行Django服务了。
容器就是一个个独立的封闭的集装箱,可是也须要对外提供服务的,因此Docker容许公开容器的特定端口,在启动Docker的时候,咱们就能够将容器的特定端口映射到宿主机上面的任意一个端口,因此,若是几个服务都须要80端口,那么容器的对外端口是80,可是映射到宿主机上面就是任意端口,就不会产生冲突,因此就不须要经过代理来解决冲突。容器对外端口与宿主机的端口映射能够经过下面的命令来完成。
启动docker容器 docker run -d -p 2222:22 --name 容器名 镜像名 -d 守护容器,就是后台运行,退出命令窗口容器也不会中止 -it 交互式容器 退出命令窗口容器就中止运行了 -p宿主机端口和容器端口映射 8081:80 宿主机端口:容器公开的端口
Docker仓库Docker registeries,存储镜像的仓库,存储镜像的地方,分为公共仓库(Public)、私有仓库(Private);公有仓库docker hub提供了很是多的镜像文件,这些镜像直接拉取下来就能够运行了,你也能够上传本身的镜像到docker hub上面。同时也能够本身搭建私有仓库用于团队项目管理。
1:开发构建镜像并将镜像push到Docker仓库;
2:测试或者运维从Docker仓库拷贝一份镜像到本地;
3:经过镜像文件开启Docker容器并提供服务。
1:构建容易分发简单;
2:隔离应用解除依赖;
3:快速部署测完就销。
VM 的 Hypervisor 须要实现对硬件的虚拟化,而且还要搭载本身的操做系统,其中虚拟机操做系统占用内存是比较大的,一个操做系统有好几个G,天然在启动速度和资源利用率以及性能上有很是大的开销
Docker 应用容器相对于 VM 有如下几个优势:
1:启动速度快,容器启动本质就是一个开启一个进程而已,所以都是秒启,而 VM 一般要更久;
2:资源利用率高,一台普通 PC 能够跑成百上千个容器,你跑十个 VM 试试;
3:性能开销小, VM 一般须要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源。
Docker 容器只是一个运行于宿主操做系统host OS上的应用进程,因此你须要一个镜像来运行它。Docker 镜像以进程的方式运行时就叫作 Docker 容器。你能够加载本地 Docker 镜像,也能够从 Docker Hub 上下载。Docker Hub 是一个提供公有和私有镜像来进行拉取pull操做的集中仓库。官方的 Docker Hub 位于 hub.docker.com。 当你指示 Docker 引擎运行容器时,它会首先搜索本地镜像,若是没有找到,它会从 Docker Hub 上拉取相应的镜像。
运行一个 Apache web 服务器的 Docker 镜像,好比 httpd 进程。你须要运行 docker container run 命令。旧的命令为 docker run, 但后来 Docker 添加了子命令部分,因此新版本支持下列命令:
Docker 的 run 命令将镜像名做为强制参数,另外还有不少可选参数。经常使用的参数有:
-d:从当前 shell 脱离容器
-p X:Y:绑定容器的端口 Y 到宿主机的端口 X
--name:命名你的容器。若是未指定,它将被赋予随机生成的名字
-e:当启动容器时传递环境编辑及其值
经过上面的图片, 将 httpd 做为镜像名来运行容器。接着,本地镜像没有找到,Docker 引擎从 Docker Hub 拉取了它。注意,它下载了镜像 httpd:latest, 其中 :后面跟着版本号。若是你须要运行特定版本的容器,你能够在镜像名后面注明版本名。若是不提供版本名,Docker 引擎会自动拉取最新的版本。
输出的最后一行显示了你新运行的 httpd 容器的惟一 ID。
在第一步咱们使用了 -d 参数来将容器,在它一开始运行的时候,就从当前的 shell 中脱离出来。在这种状况下,咱们不知道容器里面发生了什么。因此为了查看容器的历史纪录,Docker 提供了 logs 命令。它采用容器名称或 ID 做为参数。
这里使用了容器名称做为参数。你能够看到httpd 容器中与 Apache 相关的历史纪录。
容器是一个使用宿主资源来运行的进程。这样,你能够在宿主系统的进程表中定位容器的进程。让咱们在宿主系统上肯定容器进程。
Docker 使用著名的 top 命令做为子命令的名称,来查看容器产生的进程。它采用容器的名称或 ID 做为参数。在旧版本的 Docker 中,只可运行 docker top 命令。在新版本中,docker top 和 docker container top 命令均可以生效。
在第一个输出中,列出了容器产生的进程的列表。它包含了全部细节,包括用户号uid、进程号pid,父进程号ppid、开始时间、命令,等等。这里全部的进程号你均可以在宿主的进程表里搜索到。这就是咱们在第二个命令里作得。这证实了容器确实是宿主系统中的进程
采用容器名称或 ID 做为参数。
列出中止的或不活动的 Docker 容器
如今中止了容器,这时若是使用 ls 命令,它将不会出如今列表中。
在这种状况下,若是想要查看中止的或不活动的容器,你须要在 ls 命令里同时使用 -a 参数。
在这种状况下,若是想要查看中止的或不活动的容器,你须要在 ls 命令里同时使用 -a 参数。
从新启动 Docker 容器
启动和运行的区别。当你运行一个容器时,你将启动一个全新的容器。当你启动一个容器时,你将开始一个已经中止并保存了当时运行状态的容器。它将以中止时的状态从新开始运行。
移除 Docker 容器
注意:不能够移除运行中的容器。移除以前须要先中止容器。你可使用 -f 参数搭配 rm 命令来强制移除容器,但并不推荐这么作。
一旦移除了容器,即便再使用 ls -a 命令也查看不到容器了。
互联网主流的虚拟化技术:KVM、ESXI、HP-V、XEN、Docker、Virtual Box等,使用量最多:Docker、KVM、ESXI、。
彻底虚拟化技术:经过软件实现对操做系统的资源再分配,比较成熟,例如,KVM,virtualBOX.
半虚拟化技术:是经过代码修改已有的系统,造成一种新的可虚拟化的系统,调用硬件资源去安装多个系统,总体速度上相对高一点,表明产品有Xen.
轻量级虚拟化:Docker(介于彻底虚拟化、半虚拟化之间)
Docker技术的产物是Docker容器(集装箱),容器中存放各类依赖文件、库、应用软件,能够打包繁杂的库文件、依赖程序到容器中,能够方便迁移到其余的平台;
例子:物理机8C16G,最多虚拟 : 7台+ 1台4c +1台2C 虚拟机
云计算和虚拟化有什么关系?虚拟化是云计算的基础,虚拟化是云计算组成部分,是云计算中负责虚拟化资源管理的模块。
二、Docker虚拟化概念
五、以下为Docker虚拟化方案:à须要部署Nginx,无需部署OS系统,基于Docker引擎直接部署Nginx;
四、基于CentOS7.x安装部署Docker平台,
setenforce 0 #先关闭防火墙
yum install epel-release docker* -y
五、基于CentOS6.x安装部署Docker平台,若是系统版本低于CentOS6.5话,须要先升级内核,
而后运行命令:
setenforce 0 #先关闭防火墙
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm #扩展源
yum install epel-release lxc docker-io device-map* cgroup lxc libcgroup device-mapper-event-libs device-mapper* -y
一、启动docker 容器命令:/etc/init.d/docker start
二、查看docker进程 :ps -ef | grep docker
三、启动nginx容器命令:docker run -itd nginx = /usr/local/nginx/sbin/nginx
四、进入nginx容器指令:docker exec -it b43031c78a5d /bin/bash
六、Docker软件引擎安装完毕,重启Docker服务,service docker restart
七、同时查看Docker引擎的版本,客户端和服务端的版本信息:
注意:Docker启动容器,必须先有镜像,镜像比如是一个模板!容器
八、启动Docker引擎独立服务,指令以下:
service docker restart #用于CentOS6.x
systemctl restart docker.service #用于CentOS7.x
ps -ef | grep docker #通用CentOS6和7;查看容器是否启动
九、从官网仓库搜索而且下载镜像的指令如
docker search nginx 搜索外网仓库Nginx镜像;
docker pull docker.io/nginx 下载外网仓库Nginx镜像;
docker images 查看本地服务器镜像列表;
十、从Docker官网下载Nginx、CentOS镜像,下载以前先搜索镜像:docker search nginx 或者docker search centos;
docker run -itd docker.io/nginx
2.如何访问Docker Nginx容器的80服务呢?首先获取Docker容器的IP地址:docker inspect 容器ID |grep -i ipaddr,如图所示:
开启一百台nginx服务,从20台到120台,端口从6020到60120,启动80端口的nginx服务。
#for i in 'seq 20 120';do docker run -itd -p 60$i:80 docker.io/nginx;done
进入容器以后,,使用ifconfig 查看IP地址。下面有docker的IP地址
启动22端口,开启远程链接。
#/etc/init.d/ssh restart
#netstat -lntp #查看22端口有没有开启
在另外一台虚拟机上登陆,命令:ssh -l root 172.17.0.1
参考连接:https://mp.weixin.qq.com/s/lMVzelHgm2neLKuUQ91r7g
https://mp.weixin.qq.com/s/LeaYn-CUeu3wognse1fSzw
更多操做连接 : https://mp.weixin.qq.com/s/xjkW8O-YasgCNJeX2jR4ZQ