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