Docker服务详解
Docker 是一种基于 容器技术 的开源平台,用于打包、分发和运行应用程序。
它可以把应用程序及其依赖环境一起封装到容器中,从而实现:
一次构建,到处运行。
一、Docker 是什么?
Docker 可以理解为一种轻量级虚拟化技术。
传统部署方式中,一个应用可能依赖:
- 操作系统版本
- 运行时环境
- 软件库
- 配置文件
- 网络环境
- 启动脚本
如果环境不一致,就容易出现:
text
在我电脑上能跑,服务器上跑不了
Docker 通过容器解决这个问题。
容器中包含:
- 应用代码
- 运行时环境
- 系统依赖库
- 环境变量
- 启动命令
二、Docker 的核心概念
- 镜像 Image
镜像是一个只读模板,用于创建容器。
可以理解为:
text
镜像 = 应用程序 + 运行环境 + 依赖库 + 配置
例如:
bash
nginx:latest
mysql:8.0
redis:7
ubuntu:22.04
查看本地镜像:
bash
docker images
拉取镜像:
bash
docker pull nginx
删除镜像:
bash
docker rmi nginx
- 容器 Container
容器是镜像运行后的实例。
关系类似于:
text
镜像 Image = 类 / 模板
容器 Container = 对象 / 实例
运行容器:
bash
docker run nginx
查看运行中的容器:
bash
docker ps
查看所有容器:
bash
docker ps -a
停止容器:
bash
docker stop container_id
删除容器:
bash
docker rm container_id
- 仓库 Registry
仓库用于存放和分发镜像。
常见仓库:
| 仓库 | 说明 |
|---|---|
| Docker Hub | 官方公共镜像仓库 |
| Harbor | 企业私有镜像仓库 |
| GitHub Container Registry | GitHub 镜像仓库 |
| 阿里云镜像仓库 | 国内常用 |
| 腾讯云/华为云镜像仓库 | 国内云厂商提供 |
拉取镜像:
bash
docker pull redis:7
推送镜像:
bash
docker push username/image:tag
- Dockerfile
Dockerfile 是构建镜像的配置文件。
示例:
dockerfile
FROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
构建镜像:
bash
docker build -t my-nginx:1.0 .
- Docker Compose
Docker Compose 用于管理多个容器服务。
例如一个 Web 项目可能需要:
- Nginx
- MySQL
- Redis
- 后端服务
可以用一个 docker-compose.yml 文件统一管理。
启动服务:
bash
docker compose up -d
停止服务:
bash
docker compose down
三、Docker 架构
Docker 采用 C/S 架构:
text
Docker Client <----> Docker Daemon <----> Container Runtime
- Docker Client
用户操作 Docker 的命令行工具,例如:
bash
docker run
docker build
docker ps
这些命令会发送请求给 Docker Daemon。
- Docker Daemon
Docker Daemon 是 Docker 后台服务进程,通常叫:
text
dockerd
它负责:
- 管理镜像
- 创建容器
- 启停容器
- 管理网络
- 管理数据卷
- 与容器运行时交互
查看 Docker 服务状态:
bash
systemctl status docker
启动 Docker:
bash
sudo systemctl start docker
设置开机启动:
bash
sudo systemctl enable docker
重启 Docker:
bash
sudo systemctl restart docker
- Container Runtime
容器运行时负责真正运行容器。
常见组件:
| 组件 | 作用 |
|---|---|
| containerd | 高级容器运行时 |
| runc | 底层 OCI 容器运行时 |
| dockerd | Docker 守护进程 |
| shim | 管理容器进程生命周期 |
现代 Docker 底层通常是:
text
Docker CLI → dockerd → containerd → runc → container
四、Docker 服务管理
Docker 在 Linux 中通常作为 systemd 服务运行。
- 查看 Docker 服务状态
bash
sudo systemctl status docker
常见状态:
text
active (running)
表示 Docker 正在运行。
- 启动 Docker
bash
sudo systemctl start docker
- 停止 Docker
bash
sudo systemctl stop docker
注意:
停止 Docker 服务后,正在运行的容器通常也会受到影响。
- 重启 Docker
bash
sudo systemctl restart docker
- 设置开机自启
bash
sudo systemctl enable docker
取消开机自启:
bash
sudo systemctl disable docker
- 查看 Docker 日志
bash
journalctl -u docker
实时查看:
bash
journalctl -u docker -f
查看最近 100 行:
bash
journalctl -u docker -n 100
五、Docker 常用命令
- 镜像相关命令
bash
docker images
docker pull nginx
docker rmi nginx
docker build -t myapp:1.0 .
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0
说明:
| 命令 | 功能 |
|---|---|
docker images |
查看本地镜像 |
docker pull |
拉取镜像 |
docker rmi |
删除镜像 |
docker build |
构建镜像 |
docker tag |
打标签 |
docker push |
推送镜像 |
- 容器相关命令
bash
docker run -d --name web -p 80:80 nginx
docker ps
docker ps -a
docker stop web
docker start web
docker restart web
docker rm web
docker logs web
docker exec -it web bash
说明:
| 命令 | 功能 |
|---|---|
docker run |
创建并运行容器 |
docker ps |
查看运行中的容器 |
docker ps -a |
查看所有容器 |
docker stop |
停止容器 |
docker start |
启动已停止容器 |
docker restart |
重启容器 |
docker rm |
删除容器 |
docker logs |
查看容器日志 |
docker exec |
进入运行中的容器 |
- 网络相关命令
bash
docker network ls
docker network inspect bridge
docker network create mynet
docker network rm mynet
说明:
| 命令 | 功能 |
|---|---|
docker network ls |
查看网络 |
docker network inspect |
查看网络详情 |
docker network create |
创建网络 |
docker network rm |
删除网络 |
- 数据卷相关命令
bash
docker volume ls
docker volume create mydata
docker volume inspect mydata
docker volume rm mydata
说明:
| 命令 | 功能 |
|---|---|
docker volume ls |
查看数据卷 |
docker volume create |
创建数据卷 |
docker volume inspect |
查看详情 |
docker volume rm |
删除数据卷 |
六、docker run 常用参数
示例:
bash
docker run -d \
--name nginx-web \
-p 8080:80 \
-v /data/html:/usr/share/nginx/html \
--restart always \
nginx
参数解释:
| 参数 | 含义 |
|---|---|
-d |
后台运行 |
--name |
指定容器名称 |
-p |
端口映射 |
-v |
挂载目录或数据卷 |
--restart |
重启策略 |
-e |
设置环境变量 |
--network |
指定网络 |
--rm |
容器退出后自动删除 |
-it |
交互式终端 |
--privileged |
特权模式,不建议随意使用 |
七、Docker 网络详解
Docker 常见网络模式:
- bridge
默认网络模式。
bash
docker run -d --name web nginx
默认会连接到 bridge 网络。
特点:
- 容器之间可通过 IP 通信
- 容器访问外网通常通过 NAT
- 宿主机访问容器需要端口映射
查看:
bash
docker network ls
docker network inspect bridge
- host
容器直接使用宿主机网络。
bash
docker run --network host nginx
特点:
- 性能高
- 没有端口映射
- 容器和宿主机共享网络命名空间
- 隔离性较弱
常用于:
- 高性能网络服务
- 监控服务
- 网络诊断工具
- none
无网络模式。
bash
docker run --network none alpine
特点:
- 容器没有网络连接
- 适合高隔离场景
- 自定义 bridge 网络
推荐多容器应用使用。
bash
docker network create app-net
docker run -d --name redis --network app-net redis
docker run -d --name app --network app-net myapp
优点:
- 容器可通过名称互相访问
- 网络隔离更清晰
- 适合微服务或 Compose 项目
八、Docker 数据卷详解
容器默认文件系统是临时的,容器删除后数据可能丢失。
因此需要使用数据卷或绑定挂载。
- volume 数据卷
Docker 管理的数据卷。
bash
docker volume create mysql-data
docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=your_password \
mysql:8
优点:
- Docker 自动管理
- 适合数据库持久化
- 迁移和备份方便
查看位置:
bash
docker volume inspect mysql-data
- bind mount 绑定挂载
把宿主机目录挂载到容器中:
bash
docker run -d \
-v /host/path:/container/path \
nginx
示例:
bash
docker run -d \
--name web \
-p 80:80 \
-v /data/html:/usr/share/nginx/html \
nginx
优点:
- 直观
- 方便开发调试
- 可直接编辑宿主机文件
缺点:
- 依赖宿主机路径
- 权限问题更常见
九、Docker Compose 示例
docker-compose.yml 示例:
yaml
services:
nginx:
image: nginx:latest
container_name: nginx-web
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: always
redis:
image: redis:7
container_name: redis-cache
restart: always
启动:
bash
docker compose up -d
查看:
bash
docker compose ps
停止:
bash
docker compose down
查看日志:
bash
docker compose logs -f
十、Dockerfile 常用指令
| 指令 | 说明 |
|---|---|
FROM |
指定基础镜像 |
RUN |
构建镜像时执行命令 |
COPY |
复制文件到镜像 |
ADD |
复制文件,支持解压和 URL |
WORKDIR |
设置工作目录 |
ENV |
设置环境变量 |
EXPOSE |
声明端口 |
CMD |
容器默认启动命令 |
ENTRYPOINT |
容器入口命令 |
USER |
指定运行用户 |
VOLUME |
声明数据卷 |
ARG |
构建参数 |
示例:
dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
构建:
bash
docker build -t python-app:1.0 .
运行:
bash
docker run -d -p 8000:8000 python-app:1.0
十一、容器生命周期
Docker 容器常见状态:
| 状态 | 含义 |
|---|---|
| Created | 已创建但未启动 |
| Running | 正在运行 |
| Paused | 暂停 |
| Exited | 已退出 |
| Restarting | 重启中 |
| Dead | 异常状态 |
生命周期示例:
bash
docker create nginx
docker start container
docker stop container
docker restart container
docker pause container
docker unpause container
docker rm container
十二、日志管理
查看容器日志:
bash
docker logs container_name
实时查看:
bash
docker logs -f container_name
查看最近 100 行:
bash
docker logs --tail 100 container_name
查看带时间戳:
bash
docker logs -t container_name
限制 Docker 日志大小,可以配置:
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
配置文件通常是:
bash
/etc/docker/daemon.json
修改后重启 Docker:
bash
sudo systemctl restart docker
十三、Docker 重启策略
--restart 参数控制容器异常退出后的行为。
| 策略 | 含义 |
|---|---|
no |
默认,不自动重启 |
always |
总是自动重启 |
unless-stopped |
除非手动停止,否则自动重启 |
on-failure |
非 0 退出码时重启 |
示例:
bash
docker run -d --restart always nginx
推荐:
bash
--restart unless-stopped
更适合长期服务。
十四、Docker 安全建议
- 避免使用 privileged
不推荐:
bash
docker run --privileged ...
--privileged 会给容器非常高的权限,容易造成安全风险。
- 不要在容器中使用 root
Dockerfile 中建议指定普通用户:
dockerfile
RUN useradd -m appuser
USER appuser
- 使用最小基础镜像
推荐:
dockerfile
FROM alpine
FROM debian:stable-slim
FROM python:3.11-slim
减少攻击面。
- 不要把敏感信息写进镜像
不要这样:
dockerfile
ENV API_KEY=真实密钥
推荐使用环境变量或 Secret 管理:
bash
docker run -e API_KEY=your_placeholder myapp
生产环境应使用专门的 Secret 管理方案。
- 限制资源
bash
docker run -d \
--memory 512m \
--cpus 1 \
nginx
避免单个容器耗尽宿主机资源。
十五、Docker 常见问题排查
- Docker 服务无法启动
查看状态:
bash
systemctl status docker
查看日志:
bash
journalctl -u docker -n 100
常见原因:
- 配置文件
/etc/docker/daemon.jsonJSON 格式错误 - 存储目录空间不足
- containerd 未启动
- 权限问题
- 容器启动后立刻退出
查看容器状态:
bash
docker ps -a
查看日志:
bash
docker logs container_name
常见原因:
- 启动命令执行完毕
- 配置错误
- 端口冲突
- 应用报错
- 缺少环境变量
- 端口无法访问
检查容器端口映射:
bash
docker ps
检查宿主机端口:
bash
ss -tulnp
检查防火墙:
bash
sudo firewall-cmd --list-all
sudo ufw status
- 磁盘空间不足
查看 Docker 占用:
bash
docker system df
清理无用资源:
bash
docker system prune
清理未使用镜像、容器、网络、缓存:
bash
docker system prune -a
注意:
-a 会删除未使用镜像,生产环境谨慎使用。
- 容器无法联网
查看网络:
bash
docker network ls
docker network inspect bridge
检查 DNS:
bash
docker run --rm busybox nslookup google.com
可在 Docker daemon 配置 DNS:
json
{
"dns": ["8.8.8.8", "1.1.1.1"]
}
十六、Docker 与虚拟机区别
| 对比项 | Docker 容器 | 虚拟机 |
|---|---|---|
| 虚拟化层级 | 操作系统级虚拟化 | 硬件级虚拟化 |
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 少 | 多 |
| 系统内核 | 共享宿主机内核 | 每个 VM 独立内核 |
| 隔离性 | 较弱 | 更强 |
| 镜像大小 | 通常 MB/GB 级 | 通常 GB 级 |
| 适用场景 | 微服务、CI/CD、快速部署 | 强隔离、多系统环境 |
十七、Docker 常用实战示例
- 快速启动 Nginx
bash
docker run -d \
--name nginx \
-p 8080:80 \
nginx
访问:
text
http://服务器IP:8080
- 启动 Redis
bash
docker run -d \
--name redis \
-p 6379:6379 \
redis:7
- 启动 MySQL
bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_password \
-v mysql-data:/var/lib/mysql \
mysql:8
- 进入容器
bash
docker exec -it nginx bash
如果镜像没有 bash:
bash
docker exec -it nginx sh
- 从容器复制文件
从容器复制到宿主机:
bash
docker cp nginx:/etc/nginx/nginx.conf ./nginx.conf
从宿主机复制到容器:
bash
docker cp ./index.html nginx:/usr/share/nginx/html/
十八、Docker 学习路线
| 阶段 | 学习内容 |
|---|---|
| 入门 | 镜像、容器、docker run、docker ps |
| 基础 | 端口映射、数据卷、日志、exec |
| 进阶 | Dockerfile、Compose、多容器应用 |
| 运维 | systemd、日志限制、镜像清理、服务排查 |
| 安全 | 非 root 用户、资源限制、镜像扫描 |
| 高阶 | Swarm、Kubernetes、CI/CD、私有仓库 |
十九、常用命令速查
bash
# 查看 Docker 版本
docker version
# 查看 Docker 系统信息
docker info
# 查看镜像
docker images
# 拉取镜像
docker pull nginx
# 运行容器
docker run -d --name web -p 80:80 nginx
# 查看运行中容器
docker ps
# 查看所有容器
docker ps -a
# 查看日志
docker logs -f web
# 进入容器
docker exec -it web bash
# 停止容器
docker stop web
# 启动容器
docker start web
# 重启容器
docker restart web
# 删除容器
docker rm web
# 删除镜像
docker rmi nginx
# 查看网络
docker network ls
# 查看数据卷
docker volume ls
# 查看资源占用
docker stats
# 查看 Docker 占用空间
docker system df
# 清理无用资源
docker system prune
总结
Docker 服务的核心可以概括为:
text
镜像 Image 负责打包
容器 Container 负责运行
仓库 Registry 负责分发
Dockerfile 负责构建
Compose 负责编排
dockerd 负责管理
containerd/runc 负责底层运行
如果你掌握了:
docker rundocker psdocker logsdocker execdocker builddocker compose- Docker 网络
- Docker 数据卷
- Dockerfile
- Docker 服务管理
就已经具备了 Docker 日常开发和运维的核心能力。