Docker 教程

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

主要概念

  1. 镜像(Image):Docker 镜像是一个只读模板,用于创建容器
  2. 容器(Container):镜像的运行实例,可以被启动、停止、删除等
  3. 仓库(Repository):集中存放镜像文件的场所

二、Docker 安装

Linux 系统安装

  1. 卸载旧版本(如果有):
   sudo apt-get remove docker docker-engine docker.io containerd runc
  1. 安装依赖:
   sudo apt-get update
   sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg-agent \
     software-properties-common
  1. 添加 Docker 官方 GPG 密钥:
   curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. 添加稳定版仓库:
   sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
  1. 安装 Docker Engine:
   sudo apt-get update
   sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. 验证安装:
   sudo docker run hello-world

Windows/Mac 安装

从 Docker 官网下载 Docker Desktop 并安装:

https://www.docker.com/products/docker-desktop

三、Docker 基本命令

镜像相关命令

  1. 搜索镜像:
   docker search 镜像名称
  1. 拉取镜像:
   docker pull 镜像名称:标签
  1. 查看本地镜像:
   docker images
  1. 删除镜像:
   docker rmi 镜像ID/名称
  1. 构建镜像:
   docker build -t 镜像名称:标签 Dockerfile路径

容器相关命令

  1. 运行容器:
   docker run [选项] 镜像名称 [命令]

常用选项:

  • -d:后台运行
  • -p:端口映射(主机端口:容器端口)
  • -v:卷挂载(主机目录:容器目录)
  • --name:指定容器名称
  • -e:设置环境变量
  • --rm:容器退出后自动删除
    1. 查看运行中的容器:
   docker ps
  1. 查看所有容器(包括停止的):
   docker ps -a
  1. 停止容器:
   docker stop 容器ID/名称
  1. 启动已停止的容器:
   docker start 容器ID/名称
  1. 重启容器:
   docker restart 容器ID/名称
  1. 删除容器:
   docker rm 容器ID/名称
  1. 进入运行中的容器:
   docker exec -it 容器ID/名称 /bin/bash
  1. 查看容器日志:
   docker logs 容器ID/名称
  1. 查看容器详细信息:
    docker inspect 容器ID/名称

四、Dockerfile 详解

Dockerfile 是一个文本文件,包含了一条条指令,用于构建 Docker 镜像。

常用指令

  1. FROM:指定基础镜像
   FROM ubuntu:20.04
  1. RUN:执行命令
   RUN apt-get update && apt-get install -y python3
  1. COPY:复制文件
   COPY ./app /app
  1. ADD:类似 COPY,但可以解压 tar 文件
   ADD ./app.tar.gz /app
  1. WORKDIR:设置工作目录
   WORKDIR /app
  1. ENV:设置环境变量
   ENV PYTHON_VERSION=3.8
  1. EXPOSE:声明端口
   EXPOSE 8080
  1. CMD:容器启动命令(可被覆盖)
   CMD ["python3", "app.py"]
  1. ENTRYPOINT:容器入口点(不可被覆盖)
   ENTRYPOINT ["python3"]
  1. VOLUME:定义匿名卷
    VOLUME /data

构建镜像示例

  1. 创建 Dockerfile:
   FROM python:3.8-slim
   WORKDIR /app
   COPY requirements.txt .
   RUN pip install -r requirements.txt
   COPY . .
   EXPOSE 5000
   CMD ["python", "app.py"]
  1. 构建镜像:
   docker build -t my-python-app .
  1. 运行容器:
   docker run -d -p 5000:5000 my-python-app

五、Docker 网络

网络类型

  1. bridge:默认网络类型,容器通过虚拟网桥连接
  2. host:容器共享主机网络
  3. none:禁用网络
  4. overlay:用于 Swarm 集群
  5. macvlan:为容器分配 MAC 地址

网络命令

  1. 查看网络:
   docker network ls
  1. 创建网络:
   docker network create my-network
  1. 连接容器到网络:
   docker network connect my-network container-name
  1. 断开容器网络:
   docker network disconnect my-network container-name
  1. 查看网络详情:
   docker network inspect my-network

六、Docker 数据管理

数据卷(Volume)

  1. 创建数据卷:
   docker volume create my-volume
  1. 查看数据卷:
   docker volume ls
  1. 使用数据卷:
   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

基本使用

  1. 创建 docker-compose.yml 文件:
   version: '3'
   services:
     web:
       build: .
       ports:
         - "5000:5000"
       volumes:
         - .:/code
     redis:
       image: "redis:alpine"
  1. 启动服务:
   docker compose up
  1. 后台启动:
   docker compose up -d
  1. 停止服务:
   docker compose down
  1. 查看运行状态:
   docker compose ps

八、Docker 实践技巧

  1. 使用 .dockerignore 文件:减少构建上下文大小

    node_modules
    .git
    *.log
    
  2. 多阶段构建:减小镜像大小
   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"]
  1. 健康检查
   HEALTHCHECK --interval=30s --timeout=3s \
     CMD curl -f http://localhost/ || exit 1
  1. 使用环境变量
   ENV MYSQL_ROOT_PASSWORD=secret
  1. 清理无用资源
   docker system prune

九、常见问题解决

  1. 权限问题
   sudo usermod -aG docker $USER
  1. 端口冲突
   netstat -tulnp | grep 端口号
  1. 容器无法启动
   docker logs 容器ID
  1. 磁盘空间不足
   docker system df
   docker system prune -a
  1. 时区设置
   ENV TZ=Asia/Shanghai
   RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

十、进阶学习

  1. Docker Swarm:原生集群管理工具
  2. Kubernetes:容器编排系统
  3. CI/CD 集成:与 Jenkins/GitLab CI 等工具集成
  4. 安全最佳实践:镜像扫描、最小权限原则等
  5. 监控与日志:Prometheus、ELK 等工具的集成

希望这份详细的 Docker 教程能帮助你快速掌握 Docker 技术!









results matching ""

    No results matching ""