Docker 是干什么的?
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观
先来看下官网的介绍,原文如下:
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
翻译一下,意思如下:
Docker 是一个开源的平台,我们可以用 Docker 来开发、部署和运行我们的应用程序。Docker 可以帮助我们将应用程序和底层基础设施进行分离,以帮助我们更快的实现交付。通过 Docker 技术,我们可以像管理我们的应用一样管理我们的基础设施(比如操作系统、依赖的开发包等)。通过 Docker 技术,可以精简我们的整个开发和交互流程。
说人话,要怎么理解官方的定义?
做过开发的小伙伴,在工作中肯定也遇到过下面的场景:
测试工程师:"你的代码有 Bug,测试不通过!"
开发工程师: "放屁 ! 我在自己机器上测试都是 OK 的 !你会用吗?"
小哈就碰到过类似情况,当时开发一个导出文件功能,本地测试功能没有任何问题,提交到测试环境后,测试小伙伴反馈报错。一番排查后,最终找到原因是 JDK 版本的原因,测试环境用的 Open JDK 版本, 而我本地测试用的 Oracle JDK 版本。Open JDK 作为 Oracle JDK 的阉割版本,少了某个字体,从而导致文件导出功能报错。
传统的软件开发模式是: 开发人员在本地先开发好应用,然后提交到测试环境,测试人员测试没有问题,最终部署到线上,供用户使用。
痛点:由于交付的单元是应用,但是应用又依赖于基础设施,比如依赖操作系统、开发包版本等等。这些因素的不确定性,导致了上面问题的发生。
有什么优雅的方式解决这个问题呢?
相信大家都安装过虚拟机,比如你想在 Windows 电脑上搭建一个 Linux 系统,需要提前下载好 Linux 系统的 ISO 镜像文件,然后通过它就可以安装一个 Linux 系统。
这和 Docker 有什么关系呢?Docker 其实是一个轻量级的虚拟化技术。Docker 可以让开发者在构建应用时,将应用与其依赖的环境一起打包到一个可移植的容器中, 然后很方便地发布到任意操作系统中。倘若,测试人员面向的是整个打包好的容器进行测试,那么,上述提到的问题将不会发生。
Docker 的历史
2010 年,下图这位名叫 Solomon Hykes 的帅气小伙在美国成立了 dotCloud 公司,从此开启了容器化时代。
后来,dotCloud 将自己公司多年积累的容器化技术进行了标准化,取名为 Docker, 也就是大家熟悉的鲸鱼 logo。
Docker 于 2013 年 3 月以 Apache 2.0 协议开源,并将源码放在了 GitHub 上进行维护。自从开源后,越来越多的工程师发现了它的优点,人气迅速攀升,成为当时最火爆的开源技术之一。
在 2013 年底,由于 Docker 太火了,dotCloud 公司干脆决定将公司名改为 Docker Inc。
Docker 架构
为了方便理解,先放一张官网的 Docker 架构图:
Docker 主要由以下部分组成:
- Docker Client;
- Docker Daemon;
- Docker Registry。
Docker Client
通过后面的章节学习,我们在安装好 Docker 后,可以通过在命令窗口中敲 docker
命令,来执行相关操作,如 docker run
等。这个操作就是通过 Docker Client 客户端来执行的。
Docker Client 用于和 Docker Daemon 交互。
Docker Daemon
Docker Daemon 是一个 Docker 后台运行的守护进程,我们的 Docker Client 的命令就是和 Docker Daemon 来进行交互的。
启动 Docker daemon 可以通过如下命令:
service docker start
或:
systemctl start docker.service
启动成功后,通过 ps
命令即可看到 docker daemon 进程:
$ ps aux | grep dockerd
root 10214 1.2 0.0 1014252 23768 ? Ssl 00:58 0:00 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
Docker Registry
Registry 意为注册中心,它是用来存储 Docker 镜像的地方,后续我们下载镜像都会从注册中心下载。需要注意,注册中心有很多,常见的如官方的 Docker Hub,另外,各大云厂商也提供了自己的注册中心,比如阿里云、腾讯云等,甚至你也可以搭建自己的私有注册中心。
Docker 默认使用 Docker Hub,比如我们执行 docker pull <image-name>
时,Docker 默认去 Docker Hub 中寻找名字为 image-name
的镜像。如果使用自己的 Registry 需要进行单独的配置。
Docker Images
Docker 镜像可以理解为存于磁盘上面可以通过特定方式执行的静态文件,可以类比传统虚拟机中的 ISO 文件。(Docker 镜像是可以被 Docker Daemon 识别并执行的特定文件)。
这里只做了解,会在后面章节具体学习。
Docker Container
Container 也就是容器。Docker 官方对容器的定义如下:
A container is a runnable instance of an image.
翻译过来,也非常好理解:
容器是镜像的运行实例。
为了方便理解,可以类比为通过 ISO 文件运行起来的一个操作环境。后面章节中会具体学习。