想象一个场景,你要部署一个服务,然后它对环境有很多依赖,不同的操作系统又是不同的需求,而且还可能遇到有些源不能使用,又得一番折腾,折腾完上线后,假设要在新的环境再来一套,又得再来一遍。
那么有没有什么办法可以解决呢?有办法,docker就是干这个的。
什么是docker?Docker是一个开源平台,可以将应用程序打包到轻量级、独立的容器中运行,使其与底层环境隔离,便于开发、部署和管理。实现就像管理应用程序一样去管理你的基础设施。
你品品,你细品,这不就是我们前面需要的操作嘛。
我们可以用docker干什么?前面聊了这么多,那么docker究竟能够带来什么?
它可以快速、一致的交付应用程序docker支持高度的可移植性,几乎支持任何平台,可以快速的部署及扩展docker足够轻量级,所以它可以在原有的硬件上启动更多的实例它是如何工作的?聊完它是什么?能够干什么?接下来就是最激动的时刻它是如何工作的?我们先从它的架构聊起
docker架构docker是典型的client-server架构,docker client可以与本机的守护进程交互,也可以与远程的docker daemon交互,除了常规的docker client,还有一种客户端是docekr-compose。docker守护进程负责构建、运行和分配容器工作。客户端与守护进程通过REST API、UNIX 套接字或网络接口进行通信。
docker build、docker pull、docker run在client端,用到最多的就是这三条命令
docker build用于根据指定的 Dockerfile 创建一个新的镜像。
docker pull 用于从 Docker 镜像仓库(如 Docker Hub)拉取指定的镜像到本地。
docker run用于基于镜像创建并启动一个新的容器。
docker daemon作为整个docker架构中最繁忙的组件就是docker daemon,它侦听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。
iamges在docker世界中,镜像你可以理解为是创建容器的说明,它一般是基于某个镜像再加上一些自定义内容构建(比如一些特定的配置、特定的依赖等),在这个过程中会涉及到后面介绍的dockerfile。
你可以创建自己的镜像,也可以使用容器仓库中已有的镜像。
containers容器就是镜像的运行状态,可以通过docker-cli来启动,你可以将容器连接到一个或多个网络,默认情况下,不同的容器之间是隔离的,但是可以通过控制网络等来调整隔离程度。
你也可以利用现有的容器来构建新的镜像。
docker registry聊完了镜像、容器,那就不得不提另外一个核心组建,它是用来存放镜像的地方,就是docker registry。 只要网络通,你可以在任何地方拉取你存储在仓库中的镜像,这也是docker可以快速扩容、快速部署的原因之一。
docker hub是一个可以任何人访问的公共仓库,你也可以部署属于自己的私有仓库,现在也有很多云厂商有自己的仓库。
dockerfile如果你想在基础镜像上做一些变更,加入一些自定义的内容,怎么操作?这就需要用到dockerfile
dockerfile是一个用来定义如何构建 Docker 镜像的文本文件,包含了一系列指令(Instructions),用于指定镜像的构建步骤。
每一条指令都会在镜像中创建一层。例如:
RUN:运行命令,比如安装软件或配置环境。
COPY/ADD:将文件从主机复制到镜像中。
CMD 或 ENTRYPOINT:定义容器运行时的默认命令。
代码语言:bash复制# 使用 Ubuntu 作为基础镜像
FROM ubuntu:latest
# 安装必要的软件包
RUN apt-get update && apt-get install -y python3
# 复制本地代码到镜像中
COPY app.py /app/
# 设置工作目录
WORKDIR /app
# 运行应用程序
CMD ["python3", "app.py"]docker-compose前面的介绍我们已经了解了使用docker需要用到的大部分内容,我们继续进一步,如果你想要在一台主机上运行多个镜像,比如前端、后端、中间件等,这就要用到另外一个工具docker-compose。
它是一个可以用来运行多个容器的工具,它由一个配置文件docker-compose.yml来来描述应用程序的服务、网络和存储卷,简化了多容器的管理和操作。
但如果想要在更多的主机上、运行更多的容器有什么办法呢?没错k8s是一个更为强大的容器调度工具,我们后面会介绍。
底层技术这部分内容,不会用到,但是有助于你更好的理解docker。docker在底层实际上是调用了linux内核功能,Docker 使用一种称为namespace的技术来隔离不同的容器。当运行容器时,Docker 会为该容器创建一组namespace。
这些namespace提供了一个隔离层。容器的每个方面都在单独的namespace中运行,其访问权限仅限于该namespace。
执行一条docker run 命令发生了什么?它首先会从仓库中拉取需要的镜像然后会创建一个容器容器创建的过程中会分配读写文件系统然后会创建一个网络接口,将容器连接到默认网络。最后启动容器docker究竟是什么?所以docker到底是什么?你的心里是否已经有了更为清晰的答案?
docker是一个将程序和环境打包为可以在任何平台运行的工具,你可以通过dockerfile定义属于自己的镜像,你也可以直接通过pull去公共仓库拉取镜像,然后可以在世界的任意角落启动你的服务,并且不需要care对方环境的各类依赖是否满足。