Docker ⼊入⻔门之个⼈人博客搭建教程
引⾔言
Docker ⾃自2013年年以来⾮非常⽕火热,⽆无论是从 Github 上的代码活跃度,还是
Redhat 在 RHEL6.5 中集成对 Docker 的⽀支持, 就连 Google 的 Compute
Engine 也⽀支持 Docker。京东 618,使⽤用了了 15 万个 Docker 实例例,并将所
有业务全部容器器化。腾讯和阿⾥里里也早在 2015 年年就实现了了万台 Docker 应
⽤用实践。归根结底还是依赖于 Docker 的简单部署,解放运维。
本场针对 Docker ⼊入⻔门⽽而⾔言,讲讲如何搭建属于你的个⼈人博客,如果您还
在⽤用常规⽅方式去部署安装 PHP?Tomocat?MySQL?WordPress?那你就
Out 了了。赶快来⼀一起学习吧!
通过本 Chat 您将学到:
Docker 是什什么?
Docker 思想与核⼼心技术;
Docker 镜像、容器器、仓库介绍;
Docker 的安装;
Docker 之 HelloWorld;
Docker 的⽹网络⽅方式;
Docker 安装 WordPress;
Docker学习总结。
基于本 Chat 主题,我们可以很快的完成博客的搭建,但是为了了读者能够
更更加清楚的知道 docker 是什什么 ,前⾯面我们使⽤用了了⼤大量量的篇幅去介绍
docker 的含义以及特性。
本⽂文针对读者为 docker 未⼊入⻔门或者刚⼊入⻔门的朋友,如果您是⽼老老⻦鸟,⼤大可
以忽略略本篇⽂文章。如果您仅想知道博客搭建,那么请移步⾄至 Docker 安装
WordPress 篇章即可。 【如果您有任何疑问,欢迎移步⾄至问答圈或者笔
者 QQ 群(524557245)交流。】
Docker 是什什么
Docker 最初是 dotCloud 公司创始⼈人 Solomon Hykes 在法国期间发起的
⼀一个公司内部项⽬目,它是基于 dotCloud 公司多年年云服务技术的⼀一次⾰革
新,并于 2013 年年 3 ⽉月以 Apache 2.0 授权协议开源,主要项⽬目代码在
GitHub 上进⾏行行维护。Docker 项⽬目后来还加⼊入了了 Linux 基⾦金金会,并成⽴立推
动 开放容器器联盟(OCI)。
Docker ⾃自开源后受到⼴广泛的关注和讨论,⾄至今其 GitHub 项⽬目已经超过 4
万九千个星标和⼀一万多个 fork。甚⾄至由于 Docker 项⽬目的⽕火爆,在 2013
年年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu
12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进⾏行行⽀支持;
Google 也在其 PaaS 产品中⼴广泛应⽤用 Docker。
Docker 使⽤用 Google 公司推出的 Go 语⾔言 进⾏行行开发实现,基于 Linux 内核
的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进⾏行行
封装隔离,属于 操作系统层⾯面的虚拟化技术。由于隔离的进程独⽴立于宿
主和其它的隔离的进程,因此也称其为容器器。最初实现是基于 LXC,从
0.7 版本以后开始去除 LXC,转⽽而使⽤用⾃自⾏行行开发的 libcontainer,从 1.11 开
始,则进⼀一步演进为使⽤用 runC 和 containerd。
Docker 在容器器的基础上,进⾏行行了了进⼀一步的封装,从⽂文件系统、⽹网络互联
到进程隔离等等,极⼤大的简化了了容器器的创建和维护。使得 Docker 技术⽐比
虚拟机技术更更为轻便便、快捷。
下⾯面的图⽚片⽐比较了了 Docker 和传统虚拟化⽅方式的不不同之处。传统虚拟机技
术是虚拟出⼀一套硬件后,在其上运⾏行行⼀一个完整操作系统,在该系统上再运
⾏行行所需应⽤用进程;⽽而容器器内的应⽤用进程直接运⾏行行于宿主的内核,容器器内没
有⾃自⼰己的内核,⽽而且也没有进⾏行行硬件虚拟。因此容器器要⽐比传统虚拟机更更为
轻便便。
Docker 思想
传统的⽅方式中,在服务器器中搭建⼀一个常⻅见的 LAMP(Linux+Apache+
Mysql+PHP)⽹网站的步骤:
下载安装 Apache,Mysql 和 PHP 以及其它的相关依赖环境。
分别进⾏行行配置和测试。
整合到⼀一起进⾏行行功能测试。
这种⽅方式操作枯燥繁琐,将不不同的软件集成起来的过程中有很多不不可控的
⻛风险,最⽆无法忍受的是,⼀一旦需要重新迁移服务器器或者重新部署⼀一套环
境,这样的琐碎和⽆无趣的“体⼒力力活”还将重新执⾏行行⼀一遍。
针对这个问题,以前我们通常⽤用虚拟机集成部署好⼀一套环境,然后做成⼀一
个虚拟机模版来解决。不不过这种⽅方式有资源利利⽤用率低,灵活性差和迁移平
台限制等问题。例例如,我们想要的仅仅是⼀一个 LAMP 环境,但是⽤用这种⽅方
式却必须集成打包⼀一个完整的操作系统(每个虚拟机需要单独分配独占的
内存,磁盘等资源)。此外,这样打包后的⼀一套 LAMP 环境中,软件之间
版本依赖性强,很难进⾏行行变更更更更新。最后,通常这样的虚拟机还需要绑定
特定的虚拟化管理理程序来管理理,这样对于迁移的平台就有了了限制。
如今,Docker 通过对 Linux 容器器技术 LXC(Linux Containers)等进⼀一步
优化,提供了了各种容器器管理理⼯工具,通过容器器来管理理应⽤用,这样便便可以达到
“ Build Once, Works Everywhere ” 的⽬目的。也就是说对于开发和部署来
说,使⽤用 Docker 可以:
更更快速的交付和部署应⽤用环境。
更更⾼高效的资源利利⽤用率。
更更便便捷的迁移和扩展性。
更更便便捷的应⽤用更更新管理理。
那么我们接来下说⼀一下 Docker 核⼼心技术。
Docker 镜像、容器器、仓库
镜像
docker 镜像是⼀一个特殊的⽂文件系统,除了了提供容器器运⾏行行时所需的程序、
库、资源、配置等⽂文件外,还包含了了⼀一些为运⾏行行时准备的⼀一些配置参数
(如匿匿名卷、环境变量量、⽤用户等)。镜像不不包含任何动态数据,其内容在
构建之后也不不会被改变。
容器器
镜像(Image)和容器器(Container)的关系,就像是⾯面向对象程序设计中
的 类 和 实例例 ⼀一样,镜像是静态的定义,容器器是镜像运⾏行行时的实体。容器器
可以被创建、启动、停⽌止、删除、暂停等。
容器器的实质是进程,但与直接在宿主执⾏行行的进程不不同,容器器进程运⾏行行于属
于⾃自⼰己的独⽴立的 命名空间。因此容器器可以拥有⾃自⼰己的 root ⽂文件系统、⾃自
⼰己的⽹网络配置、⾃自⼰己的进程空间,甚⾄至⾃自⼰己的⽤用户 ID 空间。容器器内的进
程是运⾏行行在⼀一个隔离的环境⾥里里,使⽤用起来,就好像是在⼀一个独⽴立于宿主的
系统下操作⼀一样。这种特性使得容器器封装的应⽤用⽐比直接在宿主运⾏行行更更加安
全。
仓库
镜像构建完成后,可以很容易易的在当前宿主机上运⾏行行,但是,如果需要在
其它服务器器上使⽤用这个镜像,我们就需要⼀一个集中的存储、分发镜像的服
务,Docker Registry 就是这样的服务。
⼀一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以
包含多个标签(Tag);每个标签对应⼀一个镜像。
通常,⼀一个仓库会包含同⼀一个软件不不同版本的镜像,⽽而标签就常⽤用于对应
该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体
是这个软件哪个版本的镜像。如果不不给出标签,将以 latest 作为默认标
签。
Docker 的安装
这边仅以 Linux Centos7 为例例:
Docker 要求 CentOS 系统的内核版本⾼高于 3.10 ,查看本⻚页⾯面的前提条件
来验证你的 CentOS 版本是否⽀支持。
通过 uname - r 命令查看你当前的内核版本。
[root@centos ~]# uname -r ==》查看内核版本
[root@centos ~]# yum -y install docker ==》 安装docker
[root@centos ~]# service docker start ==》 启动docker服务
镜像加速
鉴于国内⽹网络问题,后续拉取 Docker 镜像⼗十分缓慢,我们可以需要配置
加速器器来解决,我使⽤用的是⽹网易易的镜像地址:http://hub-
mirror.c.163.com。
新版的 Docker 使⽤用 /etc/docker/daemon.json(Linux) 来配置
Daemon。
在该配置⽂文件中加⼊入(没有该⽂文件的话,请先建⼀一个):
{
"registry-mirrors": ["https://c.163.com/hub#/m/home/"]
}
Docker ⽹网络
docker ⽹网络具备四种⽹网络模式:
bridge 模式,使⽤用 –net=bridge 指定,默认设置。
none 模式, 使⽤用 –net=none 指定。
host 模式,使⽤用 –net=host 指定。
container 模式,使⽤用 –net=container: 容器器名称或 ID 指定
bridge 模式
docker ⽹网络隔离基于⽹网络命名空间,在物理理机上创建 docker 容器器时会为
每⼀一个 docker 容器器分配⽹网络命名空间,并且把容器器IP桥接到物理理机的虚
拟⽹网桥上。
none模式
故名思议,none ⽹网络就是什什么都没有的⽹网络。挂在这个⽹网络下的容器器除
了了 lo,没有其他任何⽹网卡。
host模式
连接到 host ⽹网络的容器器共享 docker host 的⽹网络栈,容器器的⽹网络配置与
host 完全⼀一样。
container 模式
此模式和 host 模式很类似,只是此模式创建容器器共享的是其他容器器的 IP
和端⼝口⽽而不不是物理理机,此模式容器器⾃自身是不不会配置⽹网络和端⼝口,创建此模
式容器器进去后,你会发现⾥里里边的 IP 是你所指定的那个容器器 IP 并且端⼝口也
是共享的,⽽而且其它还是互相隔离的,如进程等。
docker ⽹网络初始化的过程如下:
初始化设备 —> 初始化 bridge —> 初始化 iptables —> 初始化 ip
foward(内核路路由转发) — > register network job function —> end
如果需要更更加详细了了解 Docker 的⽹网络模型可以参考这篇⽂文章:docker 四
种⽹网络模型,我们这边就不不再累述。
Docker Hello World
上⽂文中 Docker 环境,我们已经搭建完毕,下⾯面我们来运⾏行行⼀一个示例例看看
我们得环境到底正不不正确。我们知道在学习各种语⾔言时候,我们⾸首先学会
的就是如何运⾏行行 hello,world。
通过他,我们来认识这个世界。
docker 的 hello,world 其实很简单,使⽤用 docker 指令 直接从远端拉取镜
像运⾏行行:
具体指令:
[root@centos ~]# docker run hello-world
我们先不不管 为什什么镜像名称为 hello-world,我们先看运⾏行行效果:如果出
现了了以下画⾯面,则可以认为我们得 Docker 环境搭建成功。
好了了,我们来分析⼀一下,运⾏行行 hello-world 之后的打印信息。
⾸首先我们看到 "Hello from Docker!",说明我们之前的配置没有问
题。
为了了产⽣生这些信息,docker 经过了了这些步骤
docker 客户端连接 docker daemon 进程。
docker daemon 向 docker hub 请求 "hello-world"镜像。
docker daemon 从这个镜像,创建⼀一个新的容器器并产⽣生了了你看到
的输出内容。
docker daemon 流输出到 docker 客户端 ,并输出到你的终端。
下⾯面我们通过⼀一张图,来看⼀一下 docker 运⾏行行的流程: