Docker - 通往新世界的大门
引言
相信很多技术同学在开发时都会使用虚拟机,配置好一个开发环境,以后使用时只需要启动虚拟机就好了。但虚拟机动辄几个GB,大一点儿的甚至几百个GB,而且只要其中任意的虚拟机文件损坏,整个虚拟机就没办法启动了。你可能说应该经常备份,这的确是个好主意。但有没有更好的办法呢?今天钢哥就带着大家了解一下Docker(容器),看看它是否比传统的虚拟机更适合我们。
什么是容器?
顾名思义,容器就是用来装东西的。我们平时喝水的杯子就是容器,只不过杯子这个“容器”是用来装水的,而我们这里的容器装的是应用程序。
容器有什么特点?
- 自包含性:它打包了应用程序的所有依赖,可以直接运行;
- 可移植性:容器可以在几乎任何地方以相同的方式运行,这就确保了在开发、测试和生产环境都可以拥有完全一样的运行环境;
- 相互隔离性:多个容器间默认是相互隔离的,即使运行在同一台主机上;
- 轻量级特性:秒级启动,占用资源少;
容器与虚拟机有什么区别?
很多同学会觉得,容器能做的事虚拟机也能做啊,到底有什么区别呢?
虚拟机
的缺点
- 占用资源多;
- 冗余步骤多;
- 启动慢;
容器
的优点
- 占用资源少;
- 提及小;
- 启动快;
下面是 Docker 官网截图(后文会解释什么是 Docker)
从这张图我们可以看出,传统的虚拟机非常重,每一个虚拟机都是一台独立的操作系统。而 Docker 则不同,它会重用宿主机已有的系统资源,同时又完美地隔离了不同的容器,所以实现起来非常轻,也便于被标准化。有同学会说,这跟传统虚拟机也没什么本质差别啊,新的虚拟机罢了。其实不然,正是这种“轻量级”的特性,使其有机会成为新的标准化的应用发布方式。
上世纪五六十年代出现了集装箱,看上去也没什么技术含量。但正是因为集装箱是一种标准化的物流方式,从而全球的海陆空运输、码头装卸等都围绕着集装箱形成了整个一个高效的物流体系,最终改变了世界贸易,促成了全球化。
Google的 Kubernetes(K8)现在已经成为即成容器编排标准了,另外主流的容器编排工具还有 Docker Swarm 以及 Marathon/Mesos 。
什么是Docker?
终于回到我们今天的正题了,究竟什么是 Docker ?Docker 是使用 Go 语言开发的一种 Linux 容器封装,提供简单易用的使用接口,是目前最流行的 Linux 容器解决方案。
Docker 的使用场景
- 创建一致的开发、测试、生产环境;
- 创建资源隔离的运行时环境;
- 创建多用户的平台即服务(PaaS)的基础设施;
- 创建软件即服务(SaaS)的应用程序;
- 高性能、超大规模宿主机部署;
如何安装 Docker
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker CE 的安装非常简单,具体步骤可参考官方文档。
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 是个好东西,以上仅仅是一些常用基本操作,但它就像通往新世界的大门,为大规模集群化部署提供了可能,以后有空再写一下容器编排的文章,敬请关注!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Docker 修改镜像源地址
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80417198 我的Docker 版本为 1.12.6宿主机为CentOS7 从网上找了几个速度比较快的镜像地址: Docker 官方中国区 https://registry.docker-cn.com 1 网易 http://hub-mirror.c.163.com 1 ustc https://docker.mirrors.ustc.edu.cn 1 修改方法 直接设置 –registry-mirror 参数,仅对当前的命令有效docker run hello-world --registry-mirror=https://docker.mirrors.ustc.edu.cn 修改 /etc/default/docker,加入 DOCKER_OPTS=”镜像地址”,可以有多个DOCKER_OPTS="--registry-mirror=https://docker.mirrors.ustc.edu.cn" 支持 systemct...
- 下一篇
容器开启数据服务之旅系列(三):Kubernetes QoS助力在线运用与大数据离线运用的混部
容器开启数据服务之旅系列(三) (三):Kubernetes QoS助力在线运用与大数据离线运用的混部 概述 本文是2018年大数据峰会上的一些分享,关于在线业务,离线业务在ACK(阿里云容器服务Kubernetes)的平台上通过对namespace, cgroup, quota的灵活组合完成在线,离线业务场景的混合部署,来提高总体资源的使用率,以及支资源限制动态分配调整,来伸缩离线部分的资源水位。结合HPA和资源监控,可以完成自动化的离线资源挤出。 在线业务Web应用/数据库 QoS class: Guaranteed:limit = request 离线业务 Spark/MapReduce/Deep Learning QoS class:Burstablerequest < limit 通过namespace的Guaranteed Qo
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启