文章目录
Docker简介
简单来说,Docker是一个开源的应用容器引擎(Golang
编写),作用是把软件及其运行所需的环境统一封装起来,部署到任何支持Docker的平台上,实现一次构建,到处运行。
举例:传统web开发中经常会出现这样一个问题:代码在本地能跑,怎么部署到服务端就不能跑了。有很大一部分可能是因为环境差异(如系统版本、依赖冲突)导致的,而Docker通过提供一致的运行环境,可以完美解决这一问题。
Docker架构
Docker整体架构采用C/S模式,最核心的内容由两部分组成:Docker客户端与Docker服务端。
Docker客户端(Client): docker命令行工具是一个客户端程序,负责将用户的命令发送给Docker守护进程处理。
Docker守护进程(Docker daemon): docker守护进程(通常叫做dockerd,docker + dameon),是docker的核心服务,运行在后台,负责容器管理、镜像管理、网络与存储管理等等。
总结:
- Docker架构采用C/S模式,客户端通过RESTful API或Unix套接字通信与守护进程通信;
- Docker守护进程负责完成容器管理、镜像管理、网络与存储管理等等核心功能;
- 客户端只是接收并解析用户命令,并将命令传达给守护进程执行;
注1:Docker客户端不仅包括在 Linux 系统中使用的 docker
命令行工具,还包括基于 REST API 的编程接口(如 Python 的 docker SDK、Go SDK 等),以及图形化工具如 Docker Desktop等。
注2:Docker采用C/S架构的一个显著优势是,客户端与服务端可以部署在不同的主机上,从而支持远程容器管理和分布式场景。
docker核心概念/核心组件
1. 本节仅是简单介绍各组件的概念和作用,不会牵涉过多细节。
2. 个人理解,不一定准确。如有表述不当欢迎在评论区补充。
Docker中的核心组件/概念/工具包括:仓库(Registry)、镜像(Image)、容器(Container)、网络(Network)、数据卷(Volume)、Docker Compose、Docker Swarm。
仓库
Docker仓库用于存储和分发镜像。最常用的公共仓库是Docker Hub,也可以部署私有的Docker仓库。
操作命令示例:
docker pull ubuntu # 从docker仓库拉取ubuntu镜像
docker push myrepo/app # 推送镜像到仓库(需要登录)
docker login # 登录Docker仓库账户
注1:在不指定仓库地址时,默认仓库地址是Docker Hub(https://hub.docker.com,域名为docker.io),可以通过配置Docker守护进程的方式,修改默认仓库或设置镜像加速器,解决国内访问慢的问题:
Linux上编辑/etc/docker/daemon.json
:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
保存后执行以下命令:
sudo systemctl daemon-reexec # 让 systemd 重新加载自身,避免配置文件无效
sudo systemctl restart docker # 重启 Docker 服务,使配置生效
注2:镜像名称格式为:
[仓库地址]/[用户名或组织]/[镜像名]:[标签]
# docker pull registry.hub.docker.com/library/nginx:latest
# docker push registry.cn-hangzhou.aliyuncs.com/myuser/myapp:v1
镜像
镜像是构建 Docker 容器的基础模板,它包含了应用程序及其运行所需的环境依赖、配置文件、库和工具等。在运行容器时,Docker 会基于镜像加载文件系统,并在其上添加一层可写层,用于保存容器运行时的更改。
常用命令:
docker pull ubuntu # 拉取镜像
docker images # 查看本地镜像
docker rmi image_id # 删除镜像
docker save / docker load # 镜像导出与导入
docker build # 根据Dockerfile构建镜像
注:Docker镜像采用分层架构,多个镜像之间可以共享相同的底层 Layer,从而节省存储和构建/下载时间。
例如:多个 Spring Boot 项目如果采用相同的基础 JDK 镜像和构建流程,其镜像构建时会复用相同的 Layer,如 JDK 层、Maven 缓存层等,从而显著减少重复下载和构建时间。
容器
容器是镜像的运行实例,它基于镜像启动,并在其上添加一层可写层,用于保存运行时的文件更改。每个容器都是独立运行的进程环境,具有自己的文件系统、网络、进程空间等,但它们共享宿主机的操作系统内核。
常用命令:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
docker run -d -p 8080:80 nginx # 后台运行容器并映射端口
docker start container_id # 启动已停止的容器
docker stop container_id # 停止正在运行的容器
docker rm container_id # 删除容器(需先停止)
docker exec -it container_id bash # 进入容器交互式终端
docker attach container_id # 附着到容器的主进程(显示 stdout)
注1:容器是临时且可随时销毁的,如果不使用数据卷或持久化机制,容器删除后其内部数据也将一并清除。
注2:run
/ start
/ exec
/ attach
的作用不同:
docker run
: 创建并启动一个新容器,适用于首次启动镜像实例;每次执行都会新建容器。
docker start
: 启动一个已存在但停止的容器,不会新建容器。
docker exec
: 在已运行的容器中执行命令或打开新的终端,适合调试或交互式操作,如进入 Bash。
docker attach
: 附着到容器的主进程输出上,会显示容器的标准输出(stdout),适合查看程序输出,但按下 Ctrl+C 会关闭容器。
网络
Docker 网络用于实现容器之间、容器与主机之间、容器与外部世界之间的通信。每个容器在运行时都会被分配一个独立的网络命名空间(Network Namespace),从而实现网络隔离。
常用网络模式:
网络模式 | 说明 |
---|---|
bridge | 默认网络模式。为每个容器分配 IP,容器间通过桥接网络通信 |
host | 容器与宿主机共享网络命名空间,无隔离,端口与主机完全一致 |
none | 容器无网络功能,完全隔离 |
overlay | 用于 Docker Swarm 跨主机容器通信(集群场景) |
macvlan | 给容器分配与宿主机不同的物理网络地址,适用于接入物理网络的场景 |
常用命令:
docker network ls # 查看所有网络
docker network inspect bridge # 查看指定网络详情
docker network create my-net # 创建自定义网络
docker run --network my-net ... # 启动容器并指定网络
docker network connect my-net container # 将容器连接到指定网络
docker network disconnect my-net cont # 将容器从网络中断开
注:容器默认连接到 bridge 网络,可以通过容器名互相通信(DNS 解析)。若要完全控制通信规则,建议使用自定义网络,搭配 --network 参数进行配置。
数据卷
数据卷是 Docker 提供的持久化存储机制,用于将容器中的数据保存到宿主机文件系统,避免容器删除后数据丢失。数据卷可以被多个容器共享,且不受镜像或容器的生命周期影响。
docker volume create my-volume # 创建数据卷
docker volume ls # 查看所有数据卷
docker volume inspect my-volume # 查看数据卷详细信息
docker volume rm my-volume # 删除数据卷(需未被使用)
docker run -v my-volume:/data ubuntu # 挂载数据卷到容器中
docker run -v /host/path:/data ubuntu # 绑定主机目录(bind mount)
注:数据卷必须在容器创建时通过 -v
或 --mount
参数指定,Docker不支持在容器创建后再挂载新的数据卷。如果需要新增挂载路径,通常的做法是先备份数据,再通过相同镜像重新创建并挂载数据卷。
Docker Compose
Docker Compose 是用于定义和管理多容器应用的工具,通过一个 docker-compose.yml 文件描述应用中所有服务(如 Web 服务、数据库、缓存等)的配置,从而一条命令即可启动整个应用环境。
Compose 适用于开发、测试环境下的快速部署,也可用于本地模拟复杂服务协同运行。
常用命令:
docker-compose up -d # 后台启动所有服务
docker-compose down # 停止并删除所有容器、网络等资源
docker-compose ps # 查看服务状态
docker-compose logs # 查看日志输出
docker-compose build # 构建服务镜像
docker-compose exec web bash # 进入名为 web 的服务容器终端
注:Compose 默认会为所有服务创建一个共享的网络,并通过服务名作为 DNS 名称自动解析。相较于手动 docker run,Compose 更适合管理多个依赖服务并统一配置和版本控制。
Docker Swarm
Docker Swarm 是 Docker 官方提供的原生容器编排工具,用于将多台 Docker 主机组成一个集群(Swarm 集群),实现容器的集中部署、负载均衡与自动故障恢复。
与 Kubernetes 相比,Swarm 更轻量、易上手,适合中小规模的服务编排场景。
组件 | 说明 |
---|---|
Manager | 集群控制节点,负责调度任务、状态维护 |
Worker | 工作节点,接收 Manager 分配的任务并运行容器 |
Service | Swarm 中的服务单位,由一组任务(容器)构成 |
Task | Swarm 中具体运行的容器实例 |
注:Swarm 支持服务自动重启、滚动更新、服务发现等特性。虽然在生产环境中 Kubernetes 更为主流,但 Swarm 更适合快速搭建中小规模的集群测试与演示环境。
Docker常用命令总结
未完待续…
实战:打包并部署一个SpringBoot应用
未完待续…