25.1 docker简介
Docker是一个开放源代码软件项目,自2013年开始,近些年发展迅猛,它让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、内存、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的 LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。” 。
简单来说Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。
- 不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
- 你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
- 在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。总之docker就是集装箱原理。
docker特点:
- Docker由go语言编写的,基于apache2.0协议发布。
- 基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现
docker的 官网地址:
docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09
Docker和传统的虚拟化比较:
Docker的优势:
- 启动非常快,秒级实现
- 资源利用率高,一台高配置服务器可以跑上千个docker容器
- 更快的交付和部署,一次创建和配置后,可以在任意地方运行
- 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率
- 易迁移,平台依赖性不强
Docker核心概念:
- 镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。
- 容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。
- 仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)
25.2 安装docker
由于docker的ee企业版是需要收取一定费用的,所以我们安装的是ce社区版,以下是官方的安装文档:
以下是我的安装步骤:
1.如果你的系统没有安装过docker的话,只需要两步就可以把docker安装上,首先使用以下命令下载docker的repo源:
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
2.然后直接通过yum安装即可:
yum install -y docker-ce
如果以上这种安装方式的速度比较慢的话,大家也可以直接下载rpm包:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载完之后也需要使用yum安装,yum可以自动解决依赖关系:
yum install -y docker-ce-xxxx.rpm
3.安装完成之后,启动docker:
[root@server ~]# systemctl start docker # 启动docker
[root@server ~]# ps aux |grep docker # 查看进程
root 5289 2.3 1.6 531968 30256 ? Ssl 23:16 0:00 /usr/bin/dockerd
root 5297 1.5 1.2 366740 22500 ? Ssl 23:16 0:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
root 5438 0.0 0.0 112652 964 pts/0 S+ 23:17 0:00 grep --color=auto docker
启动docker后,会自动生成一些iptables规则:
[root@server ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1022 packets, 421K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 828 packets, 382K bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-ISOLATION (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
[root@server ~]# iptables -t nat -nvL # 查看net表
Chain PREROUTING (policy ACCEPT 4 packets, 1040 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 4 packets, 1040 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 103 packets, 6545 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 103 packets, 6545 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
但是这生成的规则是临时的,如果想要保存,可以使用以下命令,不过一般没有这个必要:
service iptables save
25.3 镜像管理
1.首先我们需要从docker上拉取一个镜像,例如我要拉取一个centos的镜像,命令如下:
[root@server ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Pull complete
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Status: Downloaded newer image for centos:latest # 拉取完成
如果下载得很慢的话,我们需要配置一个docker加速器
我的配置如下:
[root@server ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["阿里云加速器地址"]
}
说明:这个url为加速器地址,需要自行去阿里云申请。
配置完之后重启docker。然后再进行拉取镜像速度就会快很多了。
把镜像拉取下来之后,就可以进行使用了,以下是一些常用的命令:
1.查看本地的镜像:
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
说明:
- REPOSITORY 仓库
- TAG 标签,相当于给这个镜像标上一个版本,用于区分这是新版本还是旧版本,或者用于区分这是什么环境的版本,总是就是作为一个标识符的存在
- IMAGE ID是这个镜像的唯一标识,用于区分系统中不同的镜像
- CREATED ,什么时候创建的
- SIZE,这个镜像的大小
2.搜索镜像命令,用于搜索哪些镜像可以提供下载,其中xxx是关键词:
[root@server ~]# docker search xxx
例如我要搜索centos的镜像,则格式如下:
[root@server ~]# docker search centos
3.我们可以给某一个镜像打标签或者说定义它的标识,打上标签后会新生成一个不同标签的镜像:
[root@server ~]# docker tag centos test_centos
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
test_centos latest ff426288ea90 3 weeks ago 207MB
虽然说会新生成一个镜像,但其实并不是,从上面的输出结果可以看到,这两个镜像使用的IMAGE ID是一样的,那它们其实就是同一个,不同的只是标签。
除了可以定义镜像的 REPOSITORY 之外,还可以定义镜像的TAG:
[root@server ~]# docker tag centos test_centos2:171104
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
test_centos2 171104 ff426288ea90 3 weeks ago 207MB
test_centos latest ff426288ea90 3 weeks ago 207MB
[root@server ~]#
4.我们说了docker是容器,所以下载到镜像后,还需要把镜像启动为容器:
[root@server ~]# docker run -itd centos
79fab4540315f6eb2b5616a2f8c8fabbcba7f3b5dffd46d52f98473c323594e9
-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面。
5.查看运行中的容器:
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79fab4540315 centos "/bin/bash" 46 seconds ago Up 44 seconds friendly_chatterjee
加上-a选项后可以查看所有容器,包括未运行的。
6.删除指定镜像:
[root@server ~]# docker rmi test_centos
Untagged: test_centos:latest
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
test_centos2 171104 ff426288ea90 3 weeks ago 207MB
后面的参数可以是 REPOSITORY 也可以是 TAG,如果是TAG时,实际上是删除该TAG。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除。
或者 REPOSITORY 和 TAG 一起使用:
[root@server ~]# docker rmi test_centos2:171104
Untagged: test_centos2:171104
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
25.4 通过容器创建镜像
我们从仓库上拉取到一个镜像后,启动为容器就可以使用了,但是,可能这个容器里面的环境不是我需要的,所以我们需要自己进行定制,例如在里面配置自己需要的环境什么的,配置好之后把这个容器生成一个镜像就可以拿到其他机器上使用了。
1.想要定制容器的环境,首先要进入到容器里,命令如下:
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79fab4540315 centos "/bin/bash" 27 minutes ago Up 27 minutes friendly_chatterjee
[root@server ~]# docker exec -it 79fab4540315 bash
[root@79fab4540315 /]# ls # 进入成功
anaconda-post.log dev home lib64 mnt proc run srv tmp var bin etc lib media opt root sbin sys usr
这个拉取下来的centos镜像,是一个阉割的操作系统,很多东西都没有的,需要自己通过yum去安装。
说明:
- 其中 79fab4540315 为运行时该容器的id,这个id使用docker ps命令可以查看到
- 最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端
2.进入到该容器后,我们可以做一些变更,比如安装一些东西,搭建自己需要的环境,然后针对这个容器进行创建新的镜像:
## 随便装点东西
[root@79fab4540315 /]# yum install -y net-tools
[root@79fab4540315 /]# yum install vim
3.安装完成后Ctrl + d退出该容器,然后执行以下命令生成一个镜像:
[root@server ~]# docker commit -m "install net-tools and vim" -a "author" 79fab4540315 test_centos
sha256:0749459e3be3d66c787217bc7842c0856f7452e286f38e7e7979218787c1842a
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_centos latest 0749459e3be3 11 seconds ago 359MB
centos latest ff426288ea90 3 weeks ago 207MB
说明:
- docker commit创建镜像命令
- -m指定该镜像的描述信息
- -a指定镜像作者的信息
- 79fab4540315为该容器的id
- test_centos则是生成的新镜像的名称
如果熟悉git或svn的命令行操作的话,会发现这和它们的命令格式很像。
以上我们就通过容器创建了一个新的、由自己自定义环境的镜像,之后使用该镜像时,就不需要再去搭建环境了。而且我们可以把这个镜像放到一个仓库上,这样其他机器也可以下载。这就和集装箱一样,把东西都封装到一个箱子里,不仅方便移动,还可以开箱即用。