Docker技术详解:从入门到实践
一、Docker概述
1.1 什么是Docker
Docker是一个开源的应用容器引擎,基于Go语言开发,遵循Apache2.0协议开源。它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。
1.2 Docker与传统虚拟机的区别
特性 | Docker容器 | 传统虚拟机 |
---|---|---|
启动时间 | 秒级 | 分钟级 |
性能 | 接近原生 | 较差 |
系统资源 | 占用少 | 占用多 |
隔离性 | 进程级别 | 系统级别 |
镜像大小 | 通常为MB级 | 通常为GB级 |
可移植性 | 强 | 较弱 |
1.3 Docker的核心概念
- 镜像(Image):Docker镜像是一个只读模板,包含创建Docker容器的指令
- 容器(Container):容器是镜像的可运行实例
- 仓库(Registry):用于存放镜像的地方,分为公共仓库和私有仓库
- Dockerfile:文本文件,包含创建镜像所需的所有命令
二、Docker架构与组件
2.1 Docker架构图

2.2 核心组件
- Docker Client:用户与Docker交互的客户端
- Docker Daemon:Docker服务端,负责创建、运行、监控容器
- Docker Images:容器运行的只读模板
- Docker Containers:镜像的运行实例
- Docker Registry:镜像仓库服务
三、Docker安装与配置
3.1 在不同系统上的安装
Linux系统安装示例(Ubuntu):
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker run hello-world
3.2 配置Docker
- 用户组配置:将当前用户加入docker组,避免每次使用sudo
sudo usermod -aG docker $USER
- 镜像加速器配置:修改/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
- 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
四、Docker基本操作
4.1 镜像操作
# 搜索镜像
docker search ubuntu
# 拉取镜像
docker pull ubuntu:20.04
# 列出本地镜像
docker images
# 删除镜像
docker rmi ubuntu:20.04
# 导出镜像
docker save -o ubuntu.tar ubuntu:20.04
# 导入镜像
docker load -i ubuntu.tar
4.2 容器操作
# 运行容器
docker run -it --name my_ubuntu ubuntu:20.04 /bin/bash
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a
# 启动/停止/重启容器
docker start my_ubuntu
docker stop my_ubuntu
docker restart my_ubuntu
# 进入运行中的容器
docker exec -it my_ubuntu /bin/bash
# 删除容器
docker rm my_ubuntu
# 查看容器日志
docker logs my_ubuntu
# 查看容器资源使用情况
docker stats my_ubuntu
五、Dockerfile详解
5.1 Dockerfile指令
- FROM:指定基础镜像
- RUN:执行命令
- COPY/ADD:复制文件
- CMD:容器启动命令
- ENTRYPOINT:入口点
- ENV:设置环境变量
- ARG:构建参数
- VOLUME:定义匿名卷
- EXPOSE:声明端口
- WORKDIR:指定工作目录
- USER:指定当前用户
- HEALTHCHECK:健康检查
- LABEL:添加元数据
5.2 示例Dockerfile
# 使用官方Python运行时作为基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 将当前目录内容复制到容器的/app中
COPY . /app
# 安装requirements.txt中指定的包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 暴露端口80
EXPOSE 80
# 定义环境变量
ENV NAME World
# 容器启动时运行app.py
CMD ["python", "app.py"]
5.3 构建镜像
docker build -t my-python-app .
六、Docker网络
6.1 Docker网络模式
- bridge:默认网络模式,为每个容器分配IP
- host:容器直接使用宿主机的网络
- none:容器没有网络接口
- overlay:用于Swarm集群
- macvlan:为容器分配MAC地址
6.2 网络操作
# 列出网络
docker network ls
# 创建网络
docker network create my-network
# 运行容器时指定网络
docker run -it --network=my-network --name container1 ubuntu
docker run -it --network=my-network --name container2 ubuntu
# 连接/断开网络
docker network connect my-network container3
docker network disconnect my-network container3
# 删除网络
docker network rm my-network
七、Docker数据管理
7.1 数据卷(Volume)
# 创建数据卷
docker volume create my-vol
# 列出数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my-vol
# 使用数据卷
docker run -d --name my-app -v my-vol:/app nginx
# 删除数据卷
docker volume rm my-vol
7.2 挂载主机目录
# 挂载主机目录到容器
docker run -d --name my-app -v /path/on/host:/path/in/container nginx
# 只读挂载
docker run -d --name my-app -v /path/on/host:/path/in/container:ro nginx
八、Docker Compose
8.1 什么是Docker Compose
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件来配置应用的服务,然后使用一个命令即可创建并启动所有服务。
8.2 docker-compose.yml示例
version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- my-network
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- my-network
volumes:
postgres_data:
networks:
my-network:
driver: bridge
8.3 Compose常用命令
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs
# 构建或重新构建服务
docker-compose build
# 执行命令
docker-compose exec web bash
九、Docker在生产环境中的实践
9.1 最佳实践
- 使用官方镜像:优先选择官方镜像,确保安全性和稳定性
- 多阶段构建:减少最终镜像大小
- 最小化镜像:使用Alpine等小型基础镜像
- 合理使用缓存:将不常变化的指令放在前面
- 使用.dockerignore:排除不必要的文件
- 限制资源使用:设置CPU、内存限制
- 日志管理:配置日志驱动和日志轮转
9.2 多阶段构建示例
# 第一阶段:构建应用
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 第二阶段:运行应用
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
9.3 安全实践
- 避免使用root用户运行容器
- 定期更新基础镜像
- 扫描镜像中的漏洞
- 限制容器能力
- 使用只读文件系统
- 配置资源限制
十、Docker与CI/CD集成
10.1 与Jenkins集成
- 在Jenkins服务器上安装Docker
- 使用Docker作为构建环境
- 在Jenkinsfile中使用Docker
pipeline {
agent {
docker {
image 'maven:3.8.1-jdk-11'
args '-v $HOME/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
10.2 与GitLab CI集成
image: docker:19.03.12
services:
- docker:19.03.12-dind
build:
stage: build
script:
- docker build -t my-app .
- docker run my-app /script/to/run/tests
十一、Docker常见问题与解决方案
11.1 常见问题
- 容器启动失败:检查日志,查看错误信息
- 端口冲突:修改映射端口或停止占用端口的服务
- 磁盘空间不足:清理无用镜像和容器
- 网络连接问题:检查网络配置和防火墙设置
- 性能问题:调整资源限制,优化Dockerfile
11.2 常用排查命令
bash复制# 查看容器日志
docker logs <container_id>
# 检查容器配置
docker inspect <container_id>
# 查看资源使用情况
docker stats
# 清理无用数据
docker system prune