Docker服务详解

Docker服务详解

Docker 是一种基于 容器技术 的开源平台,用于打包、分发和运行应用程序。

它可以把应用程序及其依赖环境一起封装到容器中,从而实现:

一次构建,到处运行。

一、Docker 是什么?

Docker 可以理解为一种轻量级虚拟化技术。

传统部署方式中,一个应用可能依赖:

  • 操作系统版本
  • 运行时环境
  • 软件库
  • 配置文件
  • 网络环境
  • 启动脚本

如果环境不一致,就容易出现:

text 复制代码
在我电脑上能跑,服务器上跑不了

Docker 通过容器解决这个问题。

容器中包含:

  • 应用代码
  • 运行时环境
  • 系统依赖库
  • 环境变量
  • 启动命令

二、Docker 的核心概念

  1. 镜像 Image

镜像是一个只读模板,用于创建容器。

可以理解为:

text 复制代码
镜像 = 应用程序 + 运行环境 + 依赖库 + 配置

例如:

bash 复制代码
nginx:latest
mysql:8.0
redis:7
ubuntu:22.04

查看本地镜像:

bash 复制代码
docker images

拉取镜像:

bash 复制代码
docker pull nginx

删除镜像:

bash 复制代码
docker rmi nginx
  1. 容器 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
  1. 仓库 Registry

仓库用于存放和分发镜像。

常见仓库:

仓库 说明
Docker Hub 官方公共镜像仓库
Harbor 企业私有镜像仓库
GitHub Container Registry GitHub 镜像仓库
阿里云镜像仓库 国内常用
腾讯云/华为云镜像仓库 国内云厂商提供

拉取镜像:

bash 复制代码
docker pull redis:7

推送镜像:

bash 复制代码
docker push username/image:tag
  1. 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 .
  1. 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
  1. Docker Client

用户操作 Docker 的命令行工具,例如:

bash 复制代码
docker run
docker build
docker ps

这些命令会发送请求给 Docker Daemon。

  1. 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
  1. Container Runtime

容器运行时负责真正运行容器。

常见组件:

组件 作用
containerd 高级容器运行时
runc 底层 OCI 容器运行时
dockerd Docker 守护进程
shim 管理容器进程生命周期

现代 Docker 底层通常是:

text 复制代码
Docker CLI → dockerd → containerd → runc → container

四、Docker 服务管理

Docker 在 Linux 中通常作为 systemd 服务运行。

  1. 查看 Docker 服务状态
bash 复制代码
sudo systemctl status docker

常见状态:

text 复制代码
active (running)

表示 Docker 正在运行。

  1. 启动 Docker
bash 复制代码
sudo systemctl start docker
  1. 停止 Docker
bash 复制代码
sudo systemctl stop docker

注意:

停止 Docker 服务后,正在运行的容器通常也会受到影响。

  1. 重启 Docker
bash 复制代码
sudo systemctl restart docker
  1. 设置开机自启
bash 复制代码
sudo systemctl enable docker

取消开机自启:

bash 复制代码
sudo systemctl disable docker
  1. 查看 Docker 日志
bash 复制代码
journalctl -u docker

实时查看:

bash 复制代码
journalctl -u docker -f

查看最近 100 行:

bash 复制代码
journalctl -u docker -n 100

五、Docker 常用命令

  1. 镜像相关命令
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 推送镜像
  1. 容器相关命令
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 进入运行中的容器
  1. 网络相关命令
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 删除网络
  1. 数据卷相关命令
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 常见网络模式:

  1. bridge

默认网络模式。

bash 复制代码
docker run -d --name web nginx

默认会连接到 bridge 网络。

特点:

  • 容器之间可通过 IP 通信
  • 容器访问外网通常通过 NAT
  • 宿主机访问容器需要端口映射

查看:

bash 复制代码
docker network ls
docker network inspect bridge
  1. host

容器直接使用宿主机网络。

bash 复制代码
docker run --network host nginx

特点:

  • 性能高
  • 没有端口映射
  • 容器和宿主机共享网络命名空间
  • 隔离性较弱

常用于:

  • 高性能网络服务
  • 监控服务
  • 网络诊断工具
  1. none

无网络模式。

bash 复制代码
docker run --network none alpine

特点:

  • 容器没有网络连接
  • 适合高隔离场景
  1. 自定义 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 数据卷详解

容器默认文件系统是临时的,容器删除后数据可能丢失。

因此需要使用数据卷或绑定挂载。

  1. 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
  1. 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 安全建议

  1. 避免使用 privileged

不推荐:

bash 复制代码
docker run --privileged ...

--privileged 会给容器非常高的权限,容易造成安全风险。

  1. 不要在容器中使用 root

Dockerfile 中建议指定普通用户:

dockerfile 复制代码
RUN useradd -m appuser
USER appuser
  1. 使用最小基础镜像

推荐:

dockerfile 复制代码
FROM alpine
FROM debian:stable-slim
FROM python:3.11-slim

减少攻击面。

  1. 不要把敏感信息写进镜像

不要这样:

dockerfile 复制代码
ENV API_KEY=真实密钥

推荐使用环境变量或 Secret 管理:

bash 复制代码
docker run -e API_KEY=your_placeholder myapp

生产环境应使用专门的 Secret 管理方案。

  1. 限制资源
bash 复制代码
docker run -d \
  --memory 512m \
  --cpus 1 \
  nginx

避免单个容器耗尽宿主机资源。

十五、Docker 常见问题排查

  1. Docker 服务无法启动

查看状态:

bash 复制代码
systemctl status docker

查看日志:

bash 复制代码
journalctl -u docker -n 100

常见原因:

  • 配置文件 /etc/docker/daemon.json JSON 格式错误
  • 存储目录空间不足
  • containerd 未启动
  • 权限问题
  1. 容器启动后立刻退出

查看容器状态:

bash 复制代码
docker ps -a

查看日志:

bash 复制代码
docker logs container_name

常见原因:

  • 启动命令执行完毕
  • 配置错误
  • 端口冲突
  • 应用报错
  • 缺少环境变量
  1. 端口无法访问

检查容器端口映射:

bash 复制代码
docker ps

检查宿主机端口:

bash 复制代码
ss -tulnp

检查防火墙:

bash 复制代码
sudo firewall-cmd --list-all
sudo ufw status
  1. 磁盘空间不足

查看 Docker 占用:

bash 复制代码
docker system df

清理无用资源:

bash 复制代码
docker system prune

清理未使用镜像、容器、网络、缓存:

bash 复制代码
docker system prune -a

注意:
-a 会删除未使用镜像,生产环境谨慎使用。

  1. 容器无法联网

查看网络:

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 常用实战示例

  1. 快速启动 Nginx
bash 复制代码
docker run -d \
  --name nginx \
  -p 8080:80 \
  nginx

访问:

text 复制代码
http://服务器IP:8080
  1. 启动 Redis
bash 复制代码
docker run -d \
  --name redis \
  -p 6379:6379 \
  redis:7
  1. 启动 MySQL
bash 复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -v mysql-data:/var/lib/mysql \
  mysql:8
  1. 进入容器
bash 复制代码
docker exec -it nginx bash

如果镜像没有 bash:

bash 复制代码
docker exec -it nginx sh
  1. 从容器复制文件

从容器复制到宿主机:

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 run
  • docker ps
  • docker logs
  • docker exec
  • docker build
  • docker compose
  • Docker 网络
  • Docker 数据卷
  • Dockerfile
  • Docker 服务管理

就已经具备了 Docker 日常开发和运维的核心能力。

相关推荐
zjeweler2 小时前
开发者资源一站式获取:高效查找服务器折扣与学习资料指南
运维·服务器
实心儿儿2 小时前
Linux —— 基础IO - 一切皆文件 + 缓冲区
linux·运维·服务器
zjeweler2 小时前
云服务搭建游戏服务器实战指南
运维·服务器·游戏
深邃-2 小时前
【Web安全】-Kali,Linux基础(3):Linux路径操作,Linux文件权限,Linux文件下载
linux·运维·安全·web安全·网络安全·系统安全
张小凡vip2 小时前
Docker安装EFK日志系统完整指南
运维·docker·容器·efk
原来是猿3 小时前
Linux线程同步与互斥(四):日志系统与策略模式
linux·运维·开发语言·策略模式
立莹Sir4 小时前
商品中台架构设计与技术落地实践——基于Spring Cloud微服务体系的完整解决方案
分布式·后端·spring cloud·docker·容器·架构·kubernetes
九皇叔叔10 小时前
Ubuntu 22.04 版本常用设置
linux·运维·ubuntu
雨奔11 小时前
Kubernetes 联邦 Deployment 指南:跨集群统一管理 Pod
java·容器·kubernetes