本文最后更新于 2025-02-11,墨迹未干时,知识正鲜活。随着时间推移,文章部分内容可能需要重新着墨,请您谅解。Contact

Docker教程:从安装到卸载

目录

  1. 什么是 Docker
  2. Docker安装
  3. 基础命令
  4. 中级命令
  5. 高级命令
  6. 进阶命令与概念
  7. 实用技巧
  8. 最佳实践
  9. 结语

什么是 Docker

AI解释:Docker 是一个开放平台,用于开发、传输和运行应用程序。它通过将应用程序及其依赖打包到一个可移植的容器中,确保应用程序能够在任何环境下一致运行。容器相比传统的虚拟机更加轻量、高效。

Docker安装

  • Windows: 下载 Docker Desktop 并按照安装向导进行安装。

  • macOS: 下载 Docker Desktop 并按照安装向导进行安装。

  • Linux: 根据不同发行版,使用包管理器安装 Docker。我主用Ubuntu和Debian系统,所以以 Ubuntu 为例:

    sudo apt update
    sudo apt install docker.io
    sudo systemctl start docker
    sudo systemctl enable docker
    

安装完成后,验证命令:

docker --version

一、基础命令

1. 查看 Docker 版本

docker --version

查看当前安装的 Docker 版本。

2. 拉取镜像

docker pull <镜像名>:<标签>

从 Docker Hub 或指定仓库拉取镜像。例如:

docker pull nginx:latest

常用标签示例

  • latest: 最新版本
  • 特定版本号,如 python:3.9

3. 列出本地镜像

docker images

查看本地存储的所有 Docker 镜像。

常用选项

  • -a--all: 显示所有镜像,包括中间镜像
  • --filter: 过滤结果,例如 docker images --filter "dangling=true"

4. 运行容器

docker run [选项] <镜像名>:<标签>

创建并启动一个新的容器。例如运行一个交互式的 Ubuntu 容器:

docker run -it ubuntu:latest /bin/bash

常用选项

  • -d: 后台运行容器(detached 模式)
  • -p <宿主机端口>:<容器端口>: 端口映射
  • --name <容器名称>: 指定容器名称
  • -v <宿主机路径>:<容器路径>: 绑定挂载卷
  • --rm: 容器停止后自动删除

示例:

docker run -d --name mynginx -p 8080:80 nginx:latest

5. 停止容器

docker stop <容器ID或名称>

停止正在运行的容器。

6. 启动已停止的容器

docker start <容器ID或名称>

启动一个已停止的容器。

7. 删除容器

docker rm <容器ID或名称>

删除一个或多个容器。注意:容器必须先停止才能删除。

常用选项

  • -f--force: 强制删除运行中的容器
  • -v: 删除与容器关联的卷

示例:

docker rm -f mynginx

8. 删除镜像

docker rmi <镜像名>:<标签>

删除一个或多个镜像。

常用选项

  • -f--force: 强制删除镜像
  • -no-prune: 不删除父镜像

示例:

docker rmi nginx:latest

二、中级命令

1. 列出正在运行的容器

docker ps

查看当前正在运行的容器。

常用选项

  • -a--all: 查看所有容器,包括已停止的
  • -q--quiet: 仅显示容器ID
  • --filter: 过滤结果,例如 docker ps --filter "status=exited"

2. 查看容器日志

docker logs <容器ID或名称>

查看指定容器的日志输出。

常用选项

  • -f--follow: 实时跟随日志
  • --tail <行数>: 显示最后的行数
  • -t: 显示时间戳

示例:

docker logs -f --tail 100 mynginx

3. 进入运行中的容器

docker exec -it <容器ID或名称> /bin/bash

以交互模式进入容器内部。

常用选项

  • -d--detach: 后台运行命令
  • -u <用户>: 以指定用户身份运行

示例:

docker exec -it mynginx /bin/bash

4. 构建镜像

docker build -t <镜像名>:<标签> <Dockerfile所在目录>

根据 Dockerfile 构建一个新的镜像。例如:

docker build -t myapp:latest .

常用选项

  • -f <Dockerfile路径>: 指定 Dockerfile 文件
  • --no-cache: 禁用缓存
  • --build-arg <变量>=<值>: 传递构建参数

示例:

docker build -t myapp:1.0 -f Dockerfile.prod .

5. 标记镜像

docker tag <源镜像> <目标镜像>

为镜像添加新标签。

示例:

docker tag myapp:latest myrepo/myapp:v1.0

6. 推送镜像到仓库

docker push <仓库地址>/<镜像名>:<标签>

将本地镜像推送到远程仓库。

前提:需要先登录到目标仓库。

docker login <仓库地址>

示例:

docker push myrepo/myapp:v1.0

7. 查看容器的资源使用情况

docker stats

实时查看各容器的 CPU、内存等资源使用情况。

常用选项

  • --no-stream: 仅显示一次
  • --format: 自定义输出格式

8. 复制文件到容器

docker cp <本地路径> <容器ID或名称>:<容器内路径>

将本地文件或目录复制到容器内。

示例:

docker cp ./config.json mynginx:/etc/nginx/conf.d/

9. 从容器复制文件

docker cp <容器ID或名称>:<容器内路径> <本地路径>

将容器内的文件或目录复制到本地。

示例:

docker cp mynginx:/var/log/nginx/access.log ./access.log

三、高级命令

1. 管理数据卷

数据卷用于持久化容器的数据。

  • 创建数据卷

    docker volume create <卷名>
    

    示例:

    docker volume create mydata
    
  • 列出数据卷

    docker volume ls
    
  • 查看数据卷详细信息

    docker volume inspect <卷名>
    
  • 删除数据卷

    docker volume rm <卷名>
    

    注意:卷不能被使用中时才能删除。

  • 清理未使用的卷

    docker volume prune
    

2. 网络管理

Docker 提供多种网络驱动,支持容器间的通信。

  • 创建自定义网络

    docker network create <网络名>
    

    常用网络驱动

    • bridge: 默认桥接网络
    • host: 容器使用宿主机网络
    • overlay: 用于 Swarm 集群中的跨主机网络
    • macvlan: 允许将容器分配到真实网络

    示例:

    docker network create mynetwork
    
  • 查看网络列表

    docker network ls
    
  • 查看网络详细信息

    docker network inspect <网络名>
    
  • 删除网络

    docker network rm <网络名>
    
  • 连接容器到网络

    docker network connect <网络名> <容器名>
    
  • 断开容器与网络的连接

    docker network disconnect <网络名> <容器名>
    

3. Docker Compose

Docker Compose 用于定义和管理多容器的 Docker 应用,通过 docker-compose.yml 文件进行配置。

  • 安装 Docker Compose

    对于较新的 Docker 版本,Docker Compose 已集成。如需单独安装,请参考官方文档

  • 编写 docker-compose.yml

    示例:

    version: '3'
    services:
      web:
        image: nginx:latest
        ports:
          - "8080:80"
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: example
    
  • 启动服务

    docker-compose up
    
  • 在后台运行服务

    docker-compose up -d
    
  • 停止服务

    docker-compose down
    
  • 构建服务

    docker-compose build
    
  • 查看服务状态

    docker-compose ps
    
  • 查看服务日志

    docker-compose logs
    docker-compose logs -f  # 实时跟随
    

4. Docker Swarm

Docker Swarm 是 Docker 提供的原生集群管理和容器编排工具。

  • 初始化 Swarm

    docker swarm init
    
  • 添加节点到 Swarm

    在管理节点执行:

    docker swarm join-token worker
    

    获取加入令牌后,在其他主机上执行:

    docker swarm join --token <token> <manager-ip>:<port>
    
  • 查看 Swarm 节点

    docker node ls
    
  • 部署服务到 Swarm

    docker service create --name <服务名> <镜像名>
    

    示例

    docker service create --replicas 3 --name myweb nginx:latest
    
  • 查看服务

    docker service ls
    docker service ps <服务名>
    
  • 更新服务

    docker service update <选项> <服务名>
    

    示例:更新镜像版本

    docker service update --image nginx:1.19 myweb
    
  • 删除服务

    docker service rm <服务名>
    

5. 多阶段构建

多阶段构建可用于优化镜像大小,通过在 Dockerfile 中使用多个 FROM 指令。

示例

# 第一阶段:构建应用
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 第二阶段:运行应用
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]

构建镜像:

docker build -t myapp:latest .

6. 使用 Secret 和 Config

在 Swarm 模式下,管理敏感信息(如密码、密钥)和配置文件。

  • 创建 secret

    echo "my_password" | docker secret create my_password -
    
  • 查看 secrets

    docker secret ls
    
  • 在服务中使用 secret

    docker-compose.yml 中指定 secrets。

    示例

    version: '3.7'
    services:
      db:
        image: mysql:5.7
        secrets:
          - db_password
    secrets:
      db_password:
        external: true
    
  • 创建 config

    docker config create my_config ./config_file.conf
    
  • 查看 configs

    docker config ls
    

7. 性能优化与调试

  • 查看镜像层次结构

    docker history <镜像名>:<标签>
    
  • 分析镜像大小

    使用工具如 Dive 进行镜像分析。

    安装并使用:

    dive <镜像名>:<标签>
    
  • 容器资源限制

    运行容器时设置 CPU 和内存限制:

    docker run -m 512m --cpus=1.0 <镜像名>
    

    选项解释

    • -m--memory: 设置内存限制
    • --cpus: 设置 CPU 限制
  • 监控容器性能

    使用 docker stats 实时监控,或集成 Prometheus 等监控工具。

  • 调试容器

    • 使用 docker inspect 查看容器详细信息:

      docker inspect <容器ID或名称>
      
    • 使用 docker events 监听 Docker 守护进程事件:

      docker events
      
    • 使用 docker top 查看容器内的进程:

      docker top <容器ID或名称>
      

四、进阶命令与概念

1. 插件管理

Docker 支持多种插件(如网络插件、存储插件等),用于扩展其功能。

  • 安装插件

    docker plugin install <插件名>
    

    示例:

    docker plugin install vieux/sshfs
    
  • 列出已安装插件

    docker plugin ls
    
  • 启用插件

    docker plugin enable <插件名>
    
  • 禁用插件

    docker plugin disable <插件名>
    
  • 删除插件

    docker plugin rm <插件名>
    

2. 镜像仓库管理

使用私有仓库存储和管理企业内部镜像。

  • 部署私有仓库

    docker run -d -p 5000:5000 --name registry registry:2
    

    访问镜像仓库localhost:5000

  • 推送镜像到私有仓库

    为镜像打标签:

    docker tag myimage localhost:5000/myimage
    docker push localhost:5000/myimage
    
  • 从私有仓库拉取镜像

    docker pull localhost:5000/myimage
    
  • 配置镜像仓库为不安全(仅用于测试):

    修改 Docker 守护进程配置文件(如 /etc/docker/daemon.json):

    {
      "insecure-registries" : ["localhost:5000"]
    }
    

    重启 Docker 服务:

    sudo systemctl restart docker
    

3. 安全性管理

确保 Docker 环境和容器的安全性是至关重要的。

  • 扫描镜像漏洞

    使用工具如 Trivy 来扫描镜像中的漏洞。

    安装 Trivy 并扫描镜像:

    trivy image <镜像名>:<标签>
    

    示例:

    trivy image nginx:latest
    
  • 用户命名空间

    配置 Docker 使用用户命名空间隔离容器权限,提高安全性。

    配置步骤

    1. 编辑 Docker 守护进程配置文件 /etc/docker/daemon.json

      {
        "userns-remap": "default"
      }
      
    2. 创建用户映射文件 /etc/subuid/etc/subgid,添加如下内容:

      docker:100000:65536
      
    3. 重启 Docker 服务:

      sudo systemctl restart docker
      
  • 限制容器权限

    使用 --cap-drop--cap-add 限制容器的 Linux 能力。

    示例:运行时移除所有能力,仅保留基本能力:

    docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:latest
    
  • 只读文件系统

    运行容器时设置文件系统为只读:

    docker run --read-only <镜像名>
    
  • 使用 AppArmor 或 SELinux

    配置 Docker 与安全模块集成,进一步限制容器行为。

4. 自动化与 CI/CD 集成

将 Docker 命令集成到持续集成和持续部署流程中,如使用 Jenkins、GitLab CI、GitHub Actions 等工具自动构建和部署镜像。

  • 示例:GitLab CI 配置

    .gitlab-ci.yml 中添加 Docker 构建与推送任务:

    stages:
      - build
      - push
    
    build_image:
      stage: build
      script:
        - docker build -t myrepo/myapp:$CI_COMMIT_SHA .
      tags:
        - docker
    
    push_image:
      stage: push
      script:
        - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
        - docker push myrepo/myapp:$CI_COMMIT_SHA
      only:
        - master
    
  • 示例:GitHub Actions 配置

    创建 .github/workflows/docker.yml

    name: CI
    
    on:
      push:
        branches: [ master ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
    
        - name: Set up Docker Buildx
          uses: docker/setup-buildx-action@v1
    
        - name: Login to Docker Hub
          uses: docker/login-action@v1
          with:
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
    
        - name: Build and push
          uses: docker/build-push-action@v2
          with:
            push: true
            tags: user/app:latest
    

五、实用技巧

1. 清理未使用的资源

docker system prune

清理未使用的容器、网络、镜像和缓存数据。

常用选项

  • -a: 删除所有未使用的镜像(非悬空镜像)
  • --volumes: 同时删除未使用的数据卷

示例:

docker system prune -a --volumes

2. 导出和导入镜像

  • 导出镜像为 tar 文件

    docker save -o myimage.tar <镜像名>:<标签>
    

    示例:

    docker save -o nginx_latest.tar nginx:latest
    
  • 从 tar 文件导入镜像

    docker load -i myimage.tar
    

    示例:

    docker load -i nginx_latest.tar
    
  • 导出容器为 tar 文件(仅文件系统,无历史记录):

    docker export -o mycontainer.tar <容器ID或名称>
    
  • 从 tar 文件导入容器为镜像

    cat mycontainer.tar | docker import - mynewimage:latest
    

3. 备份和恢复容器数据

  • 使用 docker commit 将容器的当前状态保存为新镜像

    docker commit <容器ID或名称> <新镜像名>:<标签>
    

    示例:

    docker commit mynginx mynginx_backup:latest
    
  • 备份数据卷

    1. 启动一个临时容器,将数据卷挂载到宿主机路径。

      docker run --rm -v mydata:/data -v $(pwd):/backup busybox tar cvf /backup/mydata_backup.tar /data
      
    2. 恢复数据卷:

      docker run --rm -v mydata:/data -v $(pwd):/backup busybox tar xvf /backup/mydata_backup.tar -C /data
      

4. 使用标签管理镜像版本

合理使用标签管理镜像版本,避免混淆和覆盖。

  • 列出所有标签的镜像

    docker images --all
    
  • 使用语义版本

    避免使用 latest 标签,采用明确的版本号,如 v1.0, v2.1.3

5. 利用 Docker Hub 和其他公共仓库

  • 搜索镜像

    docker search <关键词>
    

    示例:

    docker search redis
    
  • 查看镜像详情

    在浏览器中访问 Docker Hub 并搜索相关镜像,查看文档和使用说明。

6. 使用 Aliyun Docker Registry 加速器(中国用户)

由于网络限制,Docker Hub 在中国的访问速度较慢。您可以配置阿里云 Docker 加速器以提升速度。

  • 获取加速器地址

    登录阿里云控制台,找到容器镜像服务,获取加速器的URL,例如 https://<your-region>.mirror.aliyuncs.com

  • 配置 Docker 守护进程

    编辑 /etc/docker/daemon.json

    {
      "registry-mirrors": ["https://<your-region>.mirror.aliyuncs.com"]
    }
    
  • 重启 Docker

    sudo systemctl restart docker
    

六、最佳实践

1. 减少镜像层数

Dockerfile 中合并相关命令,减少镜像层数,有助于优化镜像大小和构建速度。

示例

RUN apt-get update && apt-get install -y \
    package1 \
    package2 && \
    rm -rf /var/lib/apt/lists/*

2. 使用 .dockerignore 文件

创建 .dockerignore 文件,排除不必要的文件和目录,减少上下文大小,加快构建速度。

示例

node_modules
.git
*.log

3. 最小化基础镜像

选择合适的基础镜像,尽量使用体积小、安全性高的镜像,如 alpine,避免使用不必要的软件包。

示例

FROM alpine:3.14

4. 定期更新镜像

保持镜像和依赖的更新,及时应用安全补丁,避免使用过时的组件。

5. 分层缓存优化

合理利用 Docker 分层缓存机制,将变化频率高的指令放在后面,减少无效的重建。

示例

# 安装依赖
COPY package.json .
RUN npm install

# 复制应用代码
COPY . .

6. 避免在容器内存储重要数据

使用数据卷或外部存储,确保数据的持久性和安全性。

7. 使用多用户模式

在容器内使用非 root 用户,增强安全性。

示例

FROM ubuntu:latest
RUN useradd -m myuser
USER myuser

8. 定期扫描镜像漏洞

使用工具如 Trivy、Clair 等定期扫描镜像中的漏洞,及时修复。


结语

想学好docker,还有后面的k8s,多看看官方文档,多尝试些开源项目对学习大有裨益。
官方文档:Docker Documentation