相信不少技术同窗在开发时都会使用虚拟机,配置好一个开发环境,之后使用时只须要启动虚拟机就行了。但虚拟机动辄几个GB,大一点儿的甚至几百个GB,并且只要其中任意的虚拟机文件损坏,整个虚拟机就没办法启动了。你可能说应该常常备份,这的确是个好主意。但有没有更好的办法呢?今天钢哥就带着你们了解一下Docker(容器),看看它是否比传统的虚拟机更适合咱们。html
顾名思义,容器就是用来装东西的。咱们平时喝水的杯子就是容器,只不过杯子这个“容器”是用来装水的,而咱们这里的容器装的是应用程序。linux
不少同窗会以为,容器能作的事虚拟机也能作啊,到底有什么区别呢?nginx
虚拟机
的缺点容器
的优势下面是 Docker 官网截图(后文会解释什么是 Docker)git
从这张图咱们能够看出,传统的虚拟机很是重,每个虚拟机都是一台独立的操做系统。而 Docker 则不一样,它会重用宿主机已有的系统资源,同时又完美地隔离了不一样的容器,因此实现起来很是轻,也便于被标准化。有同窗会说,这跟传统虚拟机也没什么本质差异啊,新的虚拟机罢了。其实否则,正是这种“轻量级”的特性,使其有机会成为新的标准化的应用发布方式。github
上世纪五六十年代出现了集装箱,看上去也没什么技术含量。但正是由于集装箱是一种标准化的物流方式,从而全球的海陆空运输、码头装卸等都围绕着集装箱造成了整个一个高效的物流体系,最终改变了世界贸易,促成了全球化。
Google的 Kubernetes(K8)如今已经成为即成容器编排标准了,另外主流的容器编排工具还有 Docker Swarm 以及 Marathon/Mesos 。docker
终于回到咱们今天的正题了,究竟什么是 Docker ?Docker 是使用 Go 语言开发的一种 Linux 容器封装,提供简单易用的使用接口,是目前最流行的 Linux 容器解决方案。ubuntu
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,我的开发者通常用不到。下面的介绍都针对社区版。windows
Docker CE 的安装很是简单,具体步骤可参考官方文档。centos
docker version
咱们能够去 Docker Hub 站点拉取公共的 Docker 镜像。好比:搜索 nginx
,拉取官方的 nginx 镜像。浏览器
docker pull nginx
docker images
docker run -it -v /Users/kwang/docker:/usr/share/nginx/html/hello -p 80:80 -d nginx:latest
-i
以交互模式运行容器,一般与 -t 同时使用;
-t
为容器从新分配一个伪输入终端,一般与 -i 同时使用;
-p
本机端口:容器端口 映射;
-d
后台运行,并返回容器ID;
-v
能够将本机目录映射到容器内。好比这里我就把我本机的/home/kwang/docker
目录映射到/usr/share/nginx/html/hello/
目录下;我在
/home/kwang/docker/
目录下建立了一个静态页面index.html
,内容仅仅输出hello world!
。而/usr/share/nginx/html/
目录是容器内的 nginx 网页根目录,这样设置的目的是为了演示目录映射。
运行成功后,命令行返回一个 Docker 容器的 ID(这个ID是随机生成的,因此你看到的确定跟个人不同)。
docker ps -a
能够看到咱们刚才的镜像已经成功启动起来了,而且本机0.0.0.0:80
端口已经成功映射到容器里的80
端口了,该容器ID的前几位是7fcac910ad6a
打开本机浏览器,输入:http://localhost:80
,能够看到nginx已经启动好了
若是更改浏览器地址:http://localhost/hello/
,则能够看到我事先准备好的index.html
。
docker stop 7fcac910ad6a
7fcac910ad6a
是要暂停的容器ID,能够看到容器状态已经变成Exited
退出状态了。
docker start 7fcac910ad6a
docker rm -f 7fcac910ad6a
-f
参数是强行删除。
你能够用命令行模式进入到容器内部,就好像登陆到一台新的 Linux 同样。
docker exec -it 9ca4f91d4027 bash
exec
是在运行中的容器中运行一个命令,该命令须要接受两个参数。第一个是容器ID(这里是9ca4f91d4027
),第二个参数是要执行的命令(这里是bash
)。执行完毕后,咱们就以bash
命令行模式进入到了容器内部。
固然,你随时能够用
exit
命令从容器中退出。
docker commit -m "kenny nginx" -a "kenny" 9ca4f91d4027 kenny/nginx:1.0
-m
是说明信息
-a
是用户信息
kenny/nginx:1.0
分别是镜像的用户名、仓库名和tag信息
能够看到 Docker 镜像已成功生成。
咱们能够建立一个名为Dockerfile
的文件,编辑内容以下:
# 基于哪一个Docker镜像生成新镜像 FROM nginx:latest # 构建者的基本信息 MAINTAINER kenny.wang # 在build这个镜像时执行的操做 RUN apt-get update # 拷贝本地文件到镜像中 COPY ./index.html /usr/share/nginx/html/
执行build
命令生成 Docker 镜像。
docker build -t="kenny/nginx:2.0" .
-t
用来指定用户信息、tag等
.
是当前目录,用来寻找 Dockerfile
再次用docker images
查看,新的镜像已成功生成。
docker rmi -f 83a85d2939a2
-f
表示强行删除
83a85d2939a2
是 docker image id
docker save -o kenny_nginx.tar kenny/nginx:2.0
docker load -i kenny_nginx.tar
Docker 是个好东西,以上仅仅是一些经常使用基本操做,但它就像通往新世界的大门,为大规模集群化部署提供了可能,之后有空再写一下容器编排的文章,敬请关注!