内容简介:相信很多技术同学在开发时都会使用虚拟机,配置好一个开发环境,以后使用时只需要启动虚拟机就好了。但虚拟机动辄几个GB,大一点儿的甚至几百个GB,而且只要其中任意的虚拟机文件损坏,整个虚拟机就没办法启动了。你可能说应该经常备份,这的确是个好主意。但有没有更好的办法呢?今天钢哥就带着大家了解一下Docker(容器),看看它是否比传统的虚拟机更适合我们。
引言
相信很多技术同学在开发时都会使用虚拟机,配置好一个开发环境,以后使用时只需要启动虚拟机就好了。但虚拟机动辄几个GB,大一点儿的甚至几百个GB,而且只要其中任意的虚拟机文件损坏,整个虚拟机就没办法启动了。你可能说应该经常备份,这的确是个好主意。但有没有更好的办法呢?今天钢哥就带着大家了解一下Docker(容器),看看它是否比传统的虚拟机更适合我们。
什么是容器?
顾名思义,容器就是用来装东西的。我们平时喝水的杯子就是容器,只不过杯子这个“容器”是用来装水的,而我们这里的容器装的是应用程序。
容器有什么特点?
- 自包含性:它打包了应用程序的所有依赖,可以直接运行;
- 可移植性:容器可以在几乎任何地方以相同的方式运行,这就确保了在开发、测试和生产环境都可以拥有完全一样的运行环境;
- 相互隔离性:多个容器间默认是相互隔离的,即使运行在同一台主机上;
- 轻量级特性:秒级启动,占用资源少;
容器与虚拟机有什么区别?
很多同学会觉得,容器能做的事虚拟机也能做啊,到底有什么区别呢?
虚拟机的缺点
- 占用资源多;
- 冗余步骤多;
- 启动慢;
容器的优点
- 占用资源少;
- 提及小;
- 启动快;
下面是 Docker 官网截图(后文会解释什么是 Docker)
从这张图我们可以看出,传统的虚拟机非常重,每一个虚拟机都是一台独立的操作系统。而 Docker 则不同,它会重用宿主机已有的系统资源,同时又完美地隔离了不同的容器,所以实现起来非常轻,也便于被标准化。有同学会说,这跟传统虚拟机也没什么本质差别啊,新的虚拟机罢了。其实不然,正是这种“轻量级”的特性,使其有机会成为新的标准化的应用发布方式。
上世纪五六十年代出现了集装箱,看上去也没什么技术含量。但正是因为集装箱是一种标准化的物流方式,从而全球的海陆空运输、码头装卸等都围绕着集装箱形成了整个一个高效的物流体系,最终改变了世界贸易,促成了全球化。
Google的 Kubernetes( K8 )现在已经成为即成容器编排标准了,另外主流的容器编排 工具 还有 Docker Swarm 以及 Marathon/Mesos 。
什么是Docker?
终于回到我们今天的正题了,究竟什么是 Docker ?Docker 是使用 Go 语言开发的一种 Linux 容器封装,提供简单易用的使用接口,是目前最流行的 Linux 容器解决方案。
Docker 的使用场景
- 创建一致的开发、测试、生产环境;
- 创建资源隔离的运行时环境;
- 创建多用户的平台即服务(PaaS)的基础设施;
- 创建软件即服务(SaaS)的应用程序;
- 高性能、超大规模宿主机部署;
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker 常用命令
查看 Docker 版本
docker version
拉取 Docker 镜像
我们可以去 Docker Hub 站点拉取公共的 Docker 镜像。比如:搜索 nginx ,拉取官方的 nginx 镜像。
docker pull nginx
查看 Docker 镜像
docker images
运行 Docker 镜像
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 容器
docker ps -a
可以看到我们刚才的镜像已经成功启动起来了,并且本机0.0.0.0:80端口已经成功映射到容器里的80端口了,该容器ID的前几位是7fcac910ad6a
打开本机浏览器,输入:http://localhost:80,可以看到nginx已经启动好了
如果更改浏览器地址:http://localhost/hello/,则可以看到我事先准备好的index.html。
暂停运行中的 Docker 容器
docker stop 7fcac910ad6a
7fcac910ad6a是要暂停的容器ID,可以看到容器状态已经变成Exited退出状态了。
启动已暂停的 Docker 容器
docker start 7fcac910ad6a
删除运行中的 Docker 容器
docker rm -f 7fcac910ad6a
-f参数是强行删除。
以命令行模式进入容器
你可以用命令行模式进入到容器内部,就好像登录到一台新的 Linux 一样。
docker exec -it 9ca4f91d4027 bash
exec是在运行中的容器中运行一个命令,该命令需要接受两个参数。第一个是容器ID(这里是9ca4f91d4027),第二个参数是要执行的命令(这里是bash)。执行完毕后,我们就以bash命令行模式进入到了容器内部。
当然,你随时可以用exit命令从容器中退出。
从运行中的 Docker 容器生成 Docker 镜像
docker commit -m "kenny nginx" -a "kenny" 9ca4f91d4027 kenny/nginx:1.0
-m 是说明信息 -a 是用户信息 kenny/nginx:1.0 分别是镜像的用户名、仓库名和tag信息
可以看到 Docker 镜像已成功生成。
基于 Dockerfile 生成 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 镜像
docker rmi -f 83a85d2939a2
-f 表示强行删除 83a85d2939a2 是 docker image id
将 Docker 镜像保存成 tar 文件
docker save -o kenny_nginx.tar kenny/nginx:2.0
加载 Docker 镜像
docker load -i kenny_nginx.tar
结语
Docker 是个好东西,以上仅仅是一些常用基本操作,但它就像通往新世界的大门,为大规模集群化部署提供了可能
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Oracle Advance Queuing是否适合您?
- 如何确定敏捷是否适合你的团队?
- SOSP19' Ceph 的十年经验总结:文件系统是否适合做分布式文件系统的后端
- 适合移动端的省市区县选取器
- 如何找到适合自己的研发模式?
- Go语言适合干什么
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cyberwar
Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96
The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!