Docker 教程
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
主要概念
- 镜像(Image):Docker 镜像是一个只读模板,用于创建容器
- 容器(Container):镜像的运行实例,可以被启动、停止、删除等
- 仓库(Repository):集中存放镜像文件的场所
二、Docker 安装
Linux 系统安装
- 卸载旧版本(如果有):
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-agent \
software-properties-common
- 添加 Docker 官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 添加稳定版仓库:
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
- 安装 Docker Engine:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 验证安装:
sudo docker run hello-world
Windows/Mac 安装
从 Docker 官网下载 Docker Desktop 并安装:
https://www.docker.com/products/docker-desktop
三、Docker 基本命令
镜像相关命令
- 搜索镜像:
docker search 镜像名称
- 拉取镜像:
docker pull 镜像名称:标签
- 查看本地镜像:
docker images
- 删除镜像:
docker rmi 镜像ID/名称
- 构建镜像:
docker build -t 镜像名称:标签 Dockerfile路径
容器相关命令
- 运行容器:
docker run [选项] 镜像名称 [命令]
常用选项:
-d
:后台运行-p
:端口映射(主机端口:容器端口)-v
:卷挂载(主机目录:容器目录)--name
:指定容器名称-e
:设置环境变量--rm
:容器退出后自动删除- 查看运行中的容器:
docker ps
- 查看所有容器(包括停止的):
docker ps -a
- 停止容器:
docker stop 容器ID/名称
- 启动已停止的容器:
docker start 容器ID/名称
- 重启容器:
docker restart 容器ID/名称
- 删除容器:
docker rm 容器ID/名称
- 进入运行中的容器:
docker exec -it 容器ID/名称 /bin/bash
- 查看容器日志:
docker logs 容器ID/名称
- 查看容器详细信息:
docker inspect 容器ID/名称
四、Dockerfile 详解
Dockerfile 是一个文本文件,包含了一条条指令,用于构建 Docker 镜像。
常用指令
- FROM:指定基础镜像
FROM ubuntu:20.04
- RUN:执行命令
RUN apt-get update && apt-get install -y python3
- COPY:复制文件
COPY ./app /app
- ADD:类似 COPY,但可以解压 tar 文件
ADD ./app.tar.gz /app
- WORKDIR:设置工作目录
WORKDIR /app
- ENV:设置环境变量
ENV PYTHON_VERSION=3.8
- EXPOSE:声明端口
EXPOSE 8080
- CMD:容器启动命令(可被覆盖)
CMD ["python3", "app.py"]
- ENTRYPOINT:容器入口点(不可被覆盖)
ENTRYPOINT ["python3"]
- VOLUME:定义匿名卷
VOLUME /data
构建镜像示例
- 创建 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
- 构建镜像:
docker build -t my-python-app .
- 运行容器:
docker run -d -p 5000:5000 my-python-app
五、Docker 网络
网络类型
- bridge:默认网络类型,容器通过虚拟网桥连接
- host:容器共享主机网络
- none:禁用网络
- overlay:用于 Swarm 集群
- macvlan:为容器分配 MAC 地址
网络命令
- 查看网络:
docker network ls
- 创建网络:
docker network create my-network
- 连接容器到网络:
docker network connect my-network container-name
- 断开容器网络:
docker network disconnect my-network container-name
- 查看网络详情:
docker network inspect my-network
六、Docker 数据管理
数据卷(Volume)
- 创建数据卷:
docker volume create my-volume
- 查看数据卷:
docker volume ls
- 使用数据卷:
docker run -v my-volume:/data my-image
挂载主机目录
docker run -v /host/path:/container/path my-image
七、Docker Compose
Docker Compose 用于定义和运行多容器 Docker 应用程序。
安装
sudo apt-get install docker-compose-plugin
基本使用
- 创建
docker-compose.yml
文件:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
- 启动服务:
docker compose up
- 后台启动:
docker compose up -d
- 停止服务:
docker compose down
- 查看运行状态:
docker compose ps
八、Docker 实践技巧
使用 .dockerignore 文件:减少构建上下文大小
node_modules .git *.log
- 多阶段构建:减小镜像大小
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
- 健康检查:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
- 使用环境变量:
ENV MYSQL_ROOT_PASSWORD=secret
- 清理无用资源:
docker system prune
九、常见问题解决
- 权限问题:
sudo usermod -aG docker $USER
- 端口冲突:
netstat -tulnp | grep 端口号
- 容器无法启动:
docker logs 容器ID
- 磁盘空间不足:
docker system df
docker system prune -a
- 时区设置:
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
十、进阶学习
- Docker Swarm:原生集群管理工具
- Kubernetes:容器编排系统
- CI/CD 集成:与 Jenkins/GitLab CI 等工具集成
- 安全最佳实践:镜像扫描、最小权限原则等
- 监控与日志:Prometheus、ELK 等工具的集成
希望这份详细的 Docker 教程能帮助你快速掌握 Docker 技术!