0%

Docker 概念梳理

Docker 让开发者创建的应用脱离底层物理硬件的限制;能很方便通过网络进行传播,做到快速分发和部署。通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,通过将应用封装成镜像,实现了应用的“一次封装,到处运行”;并提供了快速部署、分发和迁移的能力。

基本概念

镜像(Image)

一个只读的模板,它包含了应用运行所需的操作系统环境、依赖、库文件等,可以把镜像看作是创建容器的“蓝图”。描述一个镜像需要包括"名称+标签"信息;镜像本身是不可变的,只能通过特定的命令构建或拉取;以下是常用的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 拉取镜像,如果不显式指定TAG,则默认会选择latest标签
docker pull IamgeName[:TAG]。
# 列出本地镜像
docker images
# 获取某镜像详细信息
docker inspect
# 搜索镜像
docker search <image_name>
# 删除镜像
docker rmi <image_name>
# 清理镜像
docker image prune # 使用Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像
# 上传镜像
docker push <image_name>

使用 Dockerfile 创建镜像

那么如何将我们的应用制作成镜像方便后续的管理与分发呢?答案就是通过 Dockerfile。

Dockerfile 是一个文本格式的配置文件,用来定义镜像构建过程,通过 Dockerfile,开发者可以从基础镜像开始,并根据需求添加应用、依赖和环境配置等。基本的命令格式如下:

1
docker build [OPTIONS] PATH | URL | -

Docker 会根据 Dockerfile 中的指令一步步构建镜像,每执行一次指令,就会创建一个新的镜像层。最终镜像会返回一个唯一的 ID。

容器(Container)

容器是通过镜像创建的运行实例,可以理解为一个轻量级的沙箱;它和镜像不同,容器是可写的,并且是隔离的,多个容器之间互不干扰;容器从镜像启动时,会在镜像的最上层创建一个可写的层。常用的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建容器
docker create # 命令选项包括容器运行模式相关、与容器环境配置相关、与容器资源限制和安全# 启动容器
docker start
# 查看正在运行的容器
docker ps
# 启动并创建容器
docker run <options> <image_name>
# 查看容器日志
docker logs <container_id>
# 终止容器
docker stop
# 进入容器
docker exec -it <container_id> /bin/bash
# 删除容器
docker rm <container_id>

数据管理

在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,需要对容器的数据进行管理操作;我们可以通过数据卷对数据进行管理,数据卷是一个特殊的目录,它将宿主机的目录映射到容器中;数据卷可以在多个容器之间共享,而且对数据卷的修改不会影响镜像。

1
2
3
4
5
6
# 创建数据卷
docker volume create <volume_name>
# 查看数据卷
docker volume ls
# 绑定数据卷
docker run -v <host_path>:<container_path>

端口映射与容器互联

Docker 容器可以通过端口映射将容器内部的服务端口暴露到宿主机,从而实现对外访问。容器之间也可以通过容器名进行互联。例如,可以让一个容器访问另一个容器中的服务。

1
2
# 端口映射
docker run -p <host_port>:<container_port>

仓库

Docker 仓库用于存储和管理镜像;最常见的仓库是 Docker Hub,它提供了大量的公开镜像;可以在 Docker Hub 上找到官方镜像、第三方镜像,或者上传自己构建的镜像。

总结

Docker 容器化的优势:

  • 隔离性:每个容器都是独立的,相互之间不会干扰,能够提供更高的安全性。
  • 轻量级:容器不需要运行完整的操作系统,相比虚拟机,它占用的资源更少,启动速度更快。
  • 移植性:通过 Docker 镜像,开发者可以在任何地方运行相同的应用,不管是在本地、云端还是不同的操作系统。
  • 快速部署:镜像一旦构建完成,可以快速部署到任何支持 Docker 的平台,无需担心环境配置差异。