Docker
约 1464 字大约 5 分钟
dockerserver
2026-04-08
1. Docker 是什么
Docker 是一个开源的容器化平台,它将应用程序及其依赖(代码、运行时、系统工具、库)打包到一个标准化的"容器"中,实现"一次构建,到处运行"。
与虚拟机相比,容器共享宿主机内核,因此更轻量、启动更快、资源占用更少。
核心概念
| 概念 | 说明 |
|---|---|
| Image(镜像) | 只读模板,包含运行应用所需的全部内容,是容器的"安装包" |
| Container(容器) | 镜像的运行实例,可以启动、停止、删除 |
| Dockerfile | 描述如何构建镜像的文本文件 |
| Registry(仓库) | 存放镜像的服务,如 Docker Hub、阿里云容器镜像服务 |
| Volume(数据卷) | 用于容器数据持久化和共享 |
| Network(网络) | 容器之间、容器与宿主机之间的通信机制 |
2. 安装
macOS
推荐使用 Docker Desktop 或 OrbStack(更轻量、性能更好):
# 通过 Homebrew 安装 Docker Desktop
brew install --cask docker
# 或安装 OrbStack(推荐)
brew install --cask orbstackLinux
# Ubuntu / Debian
curl -fsSL https://get.docker.com | sh
# 将当前用户加入 docker 组,免 sudo
sudo usermod -aG docker $USER验证安装:
docker version
docker run hello-world3. 常用命令
镜像管理
docker images # 列出本地镜像
docker pull nginx:latest # 拉取镜像
docker rmi nginx:latest # 删除镜像
docker build -t myapp:v1 . # 通过 Dockerfile 构建镜像
docker tag myapp:v1 registry/myapp:v1 # 给镜像打标签
docker push registry/myapp:v1 # 推送镜像到仓库
docker image prune -a # 清理无用镜像容器管理
docker ps # 列出运行中的容器
docker ps -a # 列出所有容器(包括已停止)
docker run -d --name web -p 8080:80 nginx # 后台运行容器
docker stop web # 停止容器
docker start web # 启动已停止的容器
docker restart web # 重启容器
docker rm web # 删除容器
docker rm -f web # 强制删除运行中的容器
docker logs -f web # 查看容器日志(持续输出)
docker exec -it web sh # 进入容器内部
docker inspect web # 查看容器详细信息
docker stats # 实时查看资源占用
docker cp ./file.txt web:/app/ # 在宿主机和容器之间拷贝文件docker run 常用参数
| 参数 | 说明 |
|---|---|
-d | 后台运行 |
--name | 指定容器名称 |
-p 主机端口:容器端口 | 端口映射 |
-v 主机路径:容器路径 | 挂载数据卷 |
-e KEY=VALUE | 设置环境变量 |
--network | 指定网络 |
--restart=always | 容器退出时自动重启 |
--rm | 容器停止后自动删除 |
-it | 交互式终端 |
4. Dockerfile 详解
Dockerfile 是构建镜像的脚本,常见指令:
# 基础镜像
FROM node:20-alpine
# 维护者信息(已废弃,建议用 LABEL)
LABEL maintainer="ZhenYu"
# 工作目录
WORKDIR /app
# 复制文件
COPY package*.json ./
# 执行命令(构建时)
RUN npm install --production
COPY . .
# 暴露端口(仅声明,不会真正映射)
EXPOSE 3000
# 设置环境变量
ENV NODE_ENV=production
# 容器启动命令
CMD ["node", "server.js"]多阶段构建
通过多阶段构建可以显著减小镜像体积:
# 第一阶段:构建
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 第二阶段:运行
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]构建优化建议
- 选择合适的基础镜像,优先使用
alpine等精简版本 - 利用层缓存:将变动较少的指令(如依赖安装)放在前面
- 使用
.dockerignore排除无关文件(如node_modules、.git) - 合并
RUN指令,减少镜像层数 - 使用多阶段构建分离构建环境和运行环境
5. 数据卷与网络
数据卷(Volume)
# 创建数据卷
docker volume create mydata
# 挂载数据卷到容器
docker run -d -v mydata:/var/lib/mysql mysql
# 绑定宿主机目录
docker run -d -v $(pwd)/data:/app/data myapp
# 列出数据卷
docker volume ls
# 清理无用数据卷
docker volume prune网络
# 列出网络
docker network ls
# 创建自定义网络(推荐用于多容器互通)
docker network create mynet
# 容器加入网络后,可通过容器名互相访问
docker run -d --name db --network mynet mysql
docker run -d --name app --network mynet myapp6. Docker Compose
Docker Compose 用于编排多容器应用,通过 docker-compose.yml 一键启动整套服务。
version: '3.8'
services:
web:
build: .
ports:
- "8080:3000"
environment:
- NODE_ENV=production
depends_on:
- db
restart: always
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db_data:常用命令:
docker compose up -d # 后台启动所有服务
docker compose down # 停止并移除所有服务
docker compose ps # 查看服务状态
docker compose logs -f web # 查看指定服务日志
docker compose restart web # 重启指定服务
docker compose build # 重新构建镜像7. 实用技巧
清理空间
# 一键清理所有无用资源(停止的容器、无用镜像、网络、构建缓存)
docker system prune -a --volumes
# 查看磁盘占用
docker system df进入运行中的容器
docker exec -it <container> sh
docker exec -it <container> bash # 如果镜像有 bash导出/导入镜像
docker save -o myapp.tar myapp:v1 # 导出镜像
docker load -i myapp.tar # 导入镜像查看镜像构建历史
docker history myapp:v18. 常见问题
Q:容器启动后立即退出?
容器的生命周期取决于主进程,主进程结束容器就退出。确保 CMD 中的命令是前台运行(如 nginx -g 'daemon off;')。
Q:如何让容器自动重启?
使用 --restart 策略:no(默认)、on-failure、always、unless-stopped。
Q:镜像越来越大怎么办?
使用多阶段构建、选用 alpine 基础镜像、合并 RUN 指令、清理 apt/yum 缓存。
Q:宿主机如何访问容器内服务?
通过 -p 端口映射,或加入同一个自定义网络通过容器名访问。
