Docker
让开发者创建的应用脱离底层物理硬件的限制;能很方便通过网络进行传播,做到快速分发和部署。通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,通过将应用封装成镜像,实现了应用的“一次封装,到处运行”;并提供了快速部署、分发和迁移的能力。
基本概念
镜像(Image)
一个只读的模板,它包含了应用运行所需的操作系统环境、依赖、库文件等,可以把镜像看作是创建容器的“蓝图”。描述一个镜像需要包括"名称+标签"
信息;镜像本身是不可变的,只能通过特定的命令构建或拉取;以下是常用的命令:
1 | # 拉取镜像,如果不显式指定TAG,则默认会选择latest标签 |
使用 Dockerfile 创建镜像
那么如何将我们的应用制作成镜像方便后续的管理与分发呢?答案就是通过 Dockerfile。
Dockerfile 是一个文本格式的配置文件,用来定义镜像构建过程,通过 Dockerfile,开发者可以从基础镜像开始,并根据需求添加应用、依赖和环境配置等。基本的命令格式如下:
1 | docker build [OPTIONS] PATH | URL | - |
Docker 会根据 Dockerfile 中的指令一步步构建镜像,每执行一次指令,就会创建一个新的镜像层。最终镜像会返回一个唯一的 ID。
容器(Container)
容器是通过镜像创建的运行实例,可以理解为一个轻量级的沙箱;它和镜像不同,容器是可写的,并且是隔离的,多个容器之间互不干扰;容器从镜像启动时,会在镜像的最上层创建一个可写的层。常用的命令:
1 | # 创建容器 |
数据管理
在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,需要对容器的数据进行管理操作;我们可以通过数据卷对数据进行管理,数据卷是一个特殊的目录,它将宿主机的目录映射到容器中;数据卷可以在多个容器之间共享,而且对数据卷的修改不会影响镜像。
1 | # 创建数据卷 |
端口映射与容器互联
Docker 容器可以通过端口映射将容器内部的服务端口暴露到宿主机,从而实现对外访问。容器之间也可以通过容器名进行互联。例如,可以让一个容器访问另一个容器中的服务。
1 | # 端口映射 |
仓库
Docker 仓库用于存储和管理镜像;最常见的仓库是 Docker Hub,它提供了大量的公开镜像;可以在 Docker Hub 上找到官方镜像、第三方镜像,或者上传自己构建的镜像。
总结
Docker 容器化的优势:
- 隔离性:每个容器都是独立的,相互之间不会干扰,能够提供更高的安全性。
- 轻量级:容器不需要运行完整的操作系统,相比虚拟机,它占用的资源更少,启动速度更快。
- 移植性:通过 Docker 镜像,开发者可以在任何地方运行相同的应用,不管是在本地、云端还是不同的操作系统。
- 快速部署:镜像一旦构建完成,可以快速部署到任何支持 Docker 的平台,无需担心环境配置差异。