Docker - 通往新世界的大门

简介: 这是一篇关于Docker的科普文,帮助还不了解Docker的同学快速入门。

引言

相信很多技术同学在开发时都会使用虚拟机,配置好一个开发环境,以后使用时只需要启动虚拟机就好了。但虚拟机动辄几个GB,大一点儿的甚至几百个GB,而且只要其中任意的虚拟机文件损坏,整个虚拟机就没办法启动了。你可能说应该经常备份,这的确是个好主意。但有没有更好的办法呢?今天钢哥就带着大家了解一下Docker(容器),看看它是否比传统的虚拟机更适合我们。

什么是容器?

顾名思义,容器就是用来装东西的。我们平时喝水的杯子就是容器,只不过杯子这个“容器”是用来装水的,而我们这里的容器装的是应用程序。

容器有什么特点?

  • 自包含性:它打包了应用程序的所有依赖,可以直接运行;
  • 可移植性:容器可以在几乎任何地方以相同的方式运行,这就确保了在开发、测试和生产环境都可以拥有完全一样的运行环境;
  • 相互隔离性:多个容器间默认是相互隔离的,即使运行在同一台主机上;
  • 轻量级特性:秒级启动,占用资源少;

容器与虚拟机有什么区别?

很多同学会觉得,容器能做的事虚拟机也能做啊,到底有什么区别呢?

虚拟机的缺点

  • 占用资源多;
  • 冗余步骤多;
  • 启动慢;

容器的优点

  • 占用资源少;
  • 提及小;
  • 启动快;

下面是 Docker 官网截图(后文会解释什么是 Docker)

从这张图我们可以看出,传统的虚拟机非常重,每一个虚拟机都是一台独立的操作系统。而 Docker 则不同,它会重用宿主机已有的系统资源,同时又完美地隔离了不同的容器,所以实现起来非常轻,也便于被标准化。有同学会说,这跟传统虚拟机也没什么本质差别啊,新的虚拟机罢了。其实不然,正是这种“轻量级”的特性,使其有机会成为新的标准化的应用发布方式。

上世纪五六十年代出现了集装箱,看上去也没什么技术含量。但正是因为集装箱是一种标准化的物流方式,从而全球的海陆空运输、码头装卸等都围绕着集装箱形成了整个一个高效的物流体系,最终改变了世界贸易,促成了全球化。

Google的 KubernetesK8)现在已经成为即成容器编排标准了,另外主流的容器编排工具还有 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 是个好东西,以上仅仅是一些常用基本操作,但它就像通往新世界的大门,为大规模集群化部署提供了可能,以后有空再写一下容器编排的文章,敬请关注!


王方钢 | 智叟网络

相关文章
|
3月前
|
Ubuntu Shell 网络架构
网络工程师的秘密武器:为何他们必须掌握Docker的基础知识?
【8月更文挑战第20天】在IT领域,Docker作为主流容器化平台,简化了应用部署与管理。网络工程师虽不必精通Docker,但需了解其基本概念如镜像、容器等,及如何创建、运行容器,还需掌握Docker网络模式如bridge、overlay等。这有助于与开发团队协作,设计高效网络架构。例如,通过`docker pull ubuntu`和`docker run -it ubuntu /bin/bash`即可拉取并启动Ubuntu容器。了解这些基础知识能促进跨团队沟通,适应快速发展的IT行业需求。
33 0
|
2月前
|
Java 编译器 Maven
【颠覆你的认知!】当Quarkus邂逅GraalVM本机镜像,应用启动竟快到飞起——背后的技术秘密等你揭秘!
Quarkus框架因轻量级与高性能而在Java开发社区广受关注。结合GraalVM使用能显著提升应用启动速度与运行效率,这得益于GraalVM的本机镜像支持。本文将介绍如何利用Quarkus和GraalVM构建高效应用,并提供示例代码演示具体步骤。首先需安装GraalVM环境并配置Maven支持构建本机镜像。接着创建一个简单的RESTful服务端点作为示例,通过命令行编译生成本机可执行文件并运行。这种方式能够大幅提升应用性能,但需注意构建时间和部分Java特性兼容性问题。
29 1
|
27天前
|
存储 Java 编译器
【C++篇】迈入新世界的大门——初识C++(下篇)
【C++篇】迈入新世界的大门——初识C++(下篇)
12 0
|
3月前
|
监控 安全 网络协议
【网络工程师必备神器】锐捷设备命令大全:一文在手,天下我有!
【8月更文挑战第22天】锐捷网络专攻网络解决方案,其设备广泛应用在教育、政府及企业等领域。本文汇总了锐捷设备常用命令及其应用场景:包括登录与退出设备、查看系统状态、接口与VLAN配置、路由与QoS设定、安全配置及日志监控等。通过示例如telnet/ssh登录、display命令查看信息、配置IP地址与VLAN、设置静态路由与OSPF、限速与队列调度、端口安全与ACL、SNMP监控与重启设备等,助力工程师高效管理与维护网络。
130 4
|
6月前
|
Kubernetes Cloud Native Linux
Docker已死?听听他怎么说(开课吧)
Docker已死?听听他怎么说(开课吧)
92 0
|
Kubernetes Linux Go
docker 与 podman 的故事:一个方兴未艾,一个异军突起
podman 虽然与 docker 有替代关系,但是在“弃用 docker”事件中,podman 并非是主角。Kubernetes 所进行的“弃用 docker”的主角是 CRI 的其他实现方式,而由 RedHat 推出的 podman 则更加前沿。在现实的应用中,docker 方兴未艾,podman 却已经异军突起。
315 1
docker 与 podman 的故事:一个方兴未艾,一个异军突起
|
人工智能 算法 架构师
计算机学习路线规划,和我一同打开计算机学习的大门吧!
计算机学习路线规划,和我一同打开计算机学习的大门吧!
216 0
计算机学习路线规划,和我一同打开计算机学习的大门吧!
|
缓存 JSON NoSQL
公司要新招美女跟我学docker,你来吗?(1)
公司要新招美女跟我学docker,你来吗?(1)
|
Cloud Native 关系型数据库 MySQL
【云原生Docker系列项目实战第一篇】dockerfile+lnmp+workpress(星星温柔泛滥,人间至善)
【云原生Docker系列项目实战第一篇】dockerfile+lnmp+workpress(星星温柔泛滥,人间至善)
150 0
【云原生Docker系列项目实战第一篇】dockerfile+lnmp+workpress(星星温柔泛滥,人间至善)
|
负载均衡 NoSQL JavaScript
公司要新招美女跟我学docker,你来吗?(3)
公司要新招美女跟我学docker,你来吗?(3)