Docker的设计理念是:Build, Ship and Run Any App Anywhere。它由Go语言编写。它但愿对应用组件的封装,分发,部署,运行等生命周期进行管理,使得最终的Application能够在任何机器上顺利运行。linux
Docker就像货船同样:将各类APP以及他们所依赖的环境配置所有装入到独立集装箱中,而后将这些集装箱安全地运输到另外一处地方。 c++
Linux相关命令以及背景知识。程序员
对Maven/Git等有基本的认识。docker
🌏Docker官方网站:点此进入json
一个产品(代码)的开发环境和部署环境每每是不一样的。这其中可能包括了操做系统,运行环境,或者到应用配置的差别。这些差别颇有可能致使一个现象:在开发环境中运行正常的代码一旦在部署环境中就出现各类问题。vim
尤为是随着版本的不断迭代,运行环境的愈来愈复杂,开发人员和运维人员的沟通成本会愈来愈高。centos
那可不能够有这样一个方法,使得开发人员在交付代码时,将代码的运行环境(包括配置/数据/参数等等)也一并打包到部署环境中呢?安全
Docker正是为了解决这个问题而诞生的。它对此提供了一个标准化的解决方案,从2014年诞生之日起就发展迅速。bash
在从前,代码即应用。开发人员只管将程序编译完而后提交给运维,由运维去部署。而学习Docker以后,则不仅是简单提交代码,而是将运行文档,配置环境,运行环境,运行依赖包等等放置到一个集装箱中交付到运维(云平台)手中。服务器
因为互联网的野蛮生长,如今的网络应用已经统统采起了分布式集群来应对如此高并发的请求。
也就是说,若是按照传统的方式来部署应用,运维人员可能要手动地配置每一个分布式节点的安装环境,这样的人力和时间成本都是巨大的。
再好比,若是分布式集群要再次进行弹性扩容,运维人员要从新在新的机器上安装MySQL,JDK,Hadoop,ZooKeeper,固然尚未算上配置这些环境所须要的成本。
因此Docker的设计者就想作这样一件事情:将本身的代码+配置+环境打包成一个镜像,而后直接将整个镜像迁移到其它的运行机器当中。
这和JVM虚拟机的理念不谋而合:一次编译,处处运行。
假设某个App须要依赖Redis, MongoDB, MySQL才能正常运行,那么使用传统的方法,运维人员须要按照开发人员提供的开发手册,手动在部署环境中安装Redis,MongoDB,MySQL这些工具,同时开要考虑到版本不一样所带来的差别(好比MySQL5.7和MySQL8.0)。
在使用Docker以后,能够直接将这些工具打包成一个镜像文件,运维只须要将这个镜像运行在Docker中,就能够得到彻底同样的部署环境。
Docker是一个解决了运行环境和配置问题,方便作持续继承继承并有助于总体发布的容器虚拟化技术。
Docker带来了如下便捷:
想必咱们必定了解或使用过大名鼎鼎的VM Ware(或相似的工具)。咱们能够利用这个工具,在Windows系统中运行Linux, Unix系统,而运行在虚拟机内的程序对此毫无感知。
而对于咱们而言,虚拟机以及其内部全部的应用,配置只是一个普通的镜像文件。当不须要的时候就能够整个删掉。而且虚拟机内的环境发生变化时,对咱们真正的物理机毫无影响。
固然,虚拟机还模拟了内存,处理器,硬盘,网络适配器等硬件设备。至关于模拟了整套操做系统。这使得虚拟机也有它的局限性:资源占用多,冗余步骤多,启动慢。
基于上述的这些缘由,Linux后来又发展出了另外一种虚拟化技术:Linux 容器(Linux Containers,缩写为LXC)。它并非一个完整的操做系统,但保留了Linux的系统运行环境,并支持对不一样应用所运行的进程进行隔离。
另外,每一个容器之间是相互隔离的。每一个容器有本身的文件系统,容器之间的进程不会相互影响。
Docker使用Linux做为内核,那Windows用户怎么办?很遗憾,Windows系统首先须要安装一个Linux虚拟环境(若是你的Windows系统非专业版或旗舰版),而后再运行Docker。用起来要比Linux系统下更麻烦一些。不过别灰心,由于至少在国内,服务器咱们基本所有选择Linux内核的OS。
若是你想在Windows环境中学习如何运用Docker,则须要使用VM Ware模拟一个Linux虚拟机,并在此虚拟机中学习运用Docker。不要忘记配置虚拟机的网络设置,由于咱们会在虚拟机中使用yum或Docker pull命令从互联网上下载文件。
🌏参考连接:物理机,虚拟机,容器的比较
Docker基于C/S架构。客户端和Docker的守护进程相互交流,由Docker-Daemon进程负责Docker容器的构建,分发,以及运行。
客户端和守护进程经过sockets,或者是RESTful API进行沟通和交流。
Docker镜像是一个只读的模板。就比如咱们利用一个**.ISO**文件就能够建立不少份虚拟机同样,同一个模板也能够建立不少个容器。
容器是由镜像建立出来的运行实例。它能够被启动,中止,甚至删除。每一个容器都是相互隔离且保证安全的平台。能够把容器看做是一个简易的Linux环境(root用户权限,进程空间和网络空间等),以及运行在其中的应用程序。
🌏参考连接:深刻了解容器和镜像
就像管理代码/项目的GitHub仓库同样,Docker镜像也会集中存放在一个中央仓库中进行管理。最大的公开仓库就是Docker Hub。权限能够分为私有(Private)和公开(Public)。
相比Docker Hub,咱们对GitHub可能更为了解:咱们至关于将本身的工做/应用存储到了云端,以便本身在任意一台机器均可以经过clone
来继续完成本身的工做。
Docker Hub的工做实际上是相似的:开发人员将本身的配置+应用打包成的Docker镜像也存储到云端,运维人员能够直接在云端中获取该Docker镜像并部署。
🌏Docker Hub官方网站:点此进入
受网络限制,国内开发者通常都选择阿里云,网易云等做为云端仓库。不过咱们更倾向于前者,所以笔者以后的文章也所有以阿里云为平台进行操做的。
目前,Linux仅在发行版本(release)中的内核支持Docker。
Docker运行在CentOS 7上,要求系统为64位,系统内核版本是3.10以上。
Docker运行在CentOS 6.5或更高的版本,则要求系统是64位,系统内核版本为2.6.32-431或者更高的版本。
附带Docker官网安装教程:点此进入
笔者是在centOS 7环境下安装的Docker。即便在centOS 6.8环境中,安装Docker的步骤也可能有所不一样。
经过uname命令来查看CentOS系统的内核版本:
$ uname -r
复制代码
检查release文件:
$ cat /etc/redhat-release
复制代码
经过yum安装gcc相关依赖(若是是虚拟机进行的操做,须要先检查网络是否连通):
$ yum -y install gcc
$ yum -y install gcc-c++
复制代码
若是原来的系统装有旧版本的docker引擎,就复制下方命令将它们移除:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
复制代码
若是yum提示没有匹配参数,则说明目前机器中没有安装任何与docker相关依赖,不然就会将它们卸载。
随后咱们使用yum命令来安装Docker-CE版本。官网给出如下提示:
Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.
大意为:若是你是在新的机器中安装Docker引擎,首先须要配置Docker仓库,随后,你就能够在这个仓库中安装或者更新Docker了。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
复制代码
注❗:官网中提供的download.docker.com
仓库在国内的速度很是缓慢,所以接下来的stable镜像仓库须要配置为阿里云仓库。固然,也能够在上一步的--add-repo
参数中直接就进行替换。
$ yum-config-manager --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码
系统提示该配置信息被配置到了/etc/yum.repos.d/docker-ce.repo
文件中,可使用cat
查看该配置文件。
Docker中文官网推荐:更新yum的软件包索引。
$ yum makecache fast
复制代码
随后使用yum安装Docker-ce版本,可添加-y
参数跳过全部的问询(所有安装),随后须要稍等片刻。
$ yum -y install docker-ce
复制代码
最后,启动Docker-CE版,咱们就能够正式使用它了!
$ systemctl start docker
复制代码
经过version
参数检查Docker是否安装成功:
$ docker version
复制代码
登陆阿里云,选择注册新帐号,或者选择复用淘宝帐号。在服务中搜索:容器镜像服务,选择镜像加速器。咱们在Docker专题的最后,学习如何将本身的镜像上传到远程仓库时,也会使用阿里云的容器镜像服务。
$ mkdir -p/etc/docker
$ vim /etc/docker/daemon.json
复制代码
在json文件中配置加速器地址,保存并退出:
{
"registry-mirrors": ["这个值以你的加速器地址为准"]
}
复制代码
从新加载配置文件并启动:
$ systemctl daemon-reload
$ systemctl restart docker
复制代码
查看进程中是否已经启动了Docker:
ps -ef | grep docker
复制代码
🌏阿里云首页:点此登陆
按照惯例,在第一次安装完Docker以后咱们启动一个helloWorld实例。
$ docker run hello-world
复制代码
终端首先会提示:Unable to find image 'hello-world:latest' locally
。不过无需担忧,这是由于Docker引擎会优先在本地搜索是否有此镜像。当在本地找不到hello-world
镜像时,Docker才会会从远端仓库中将它下载下来。:latest
是一个标签,表示下载hello-world
镜像的最新版。
最终,Docker会从阿里云仓库中下载该镜像,并由此建立一个容器并运行(run)。
若是屏幕当中显示以下信息,则表示安装成功:
Hello from Docker!
This message shows that your installation appears to be working correctly.
复制代码