目 录CONTENT

文章目录

Docker 教程

Administrator
2025-07-01 / 0 评论 / 0 点赞 / 9 阅读 / 0 字

Docker 核心概念

在深入功能之前,我们先来理解几个 Docker 的核心概念:

  • 镜像 (Image):Docker 镜像是一个轻量级、独立、可执行的软件包,包含运行应用程序所需的一切,包括代码、运行时、系统工具、系统库和设置。可以理解为面向对象编程中的“类”。

  • 容器 (Container):容器是镜像的运行实例。每个容器都是相互隔离的,拥有自己的文件系统、网络接口、进程空间等。可以理解为面向对象编程中的“对象”。

  • 仓库 (Registry):仓库是集中存放镜像的地方,例如 Docker Hub。可以理解为存放代码的 GitHub。

  • Dockerfile:Dockerfile 是一个文本文件,包含一系列的指令,用于自动构建 Docker 镜像。

Docker 主要功能教程

0. 前置条件:配置镜像站!!!

配置daemon.json文件

sudo vi /etc/docker/daemon.json

复制以下内容

{
  "registry-mirrors": [
      "https://docker.m.daocloud.io",
      "https://docker.1panel.live",
      "https://hub.rat.dev"
  ]
}

重启docker

sudo service docker restart

然后就可以正常docker pull文件。

1. Docker 的安装

要使用 Docker,首先需要在您的系统上安装它。Docker 提供了多种安装方式,具体取决于您的操作系统。

教程步骤:

  1. 访问 Docker 官方安装指南:

  2. 按照指南进行安装: 官方文档提供了详细的步骤和依赖说明,请务必仔细阅读并遵循。

  3. 验证安装: 安装完成后,打开终端或命令提示符,运行以下命令:

    docker run hello-world

    如果看到 “Hello from Docker!” 的消息,说明 Docker 已成功安装并运行。

2. Docker 镜像管理

镜像是 Docker 的基石,学会管理镜像是使用 Docker 的第一步。

常用命令:

  • 1. 搜索镜像:

    docker search [镜像名]
    # 示例:docker search ubuntu
  • 拉取镜像: 从 Docker 仓库下载镜像到本地。

    #           {===repository 镜像库===}  一个镜像库存放着一个镜像的多个版本
    docker pull docker.io/library/nginx:latest
    docker pull [registry 仓库地址]/[命名空间]/[镜像名]:[标签/就是版本号]
    
    #如果是官方镜像就可以简化掉前面的命令,因为默认是从官方地址和官方的命名空间里拉取
    docker pull [镜像名]:[标签/就是版本号]
    # 示例:docker pull ubuntu:latest
  • docker pull: 这是 Docker 的一个命令,用于从远程仓库下载(拉取)一个镜像到本地机器上。

  • docker.io/library/nginx: 这是指定要拉取的镜像的完整路径。

    • docker.io: 这是 Docker 官方仓库(Docker Hub)的默认域名。通常,当您拉取一个官方镜像时,这个部分是可以省略的,Docker 会自动假定您指的是 docker.io/library 下的镜像。

    • library: 这是 Docker Hub 上一个特殊的命名空间,用于存放官方维护的镜像。

    • nginx: 这是镜像的名称,这里指的是 Nginx Web 服务器的官方镜像。

    • :latest: 这是镜像的标签(tag)。latest 是一个常用的标签,通常指向最新稳定版本的镜像。
      如果您不指定标签,latest 是默认的。

  • 指定拉取哪个平台(架构)的镜像

    docker pull 是从远程仓库下载镜像的命令,而 --platform 用于指定拉取哪个平台(架构)的镜像。其基本语法如下:

    docker pull --platform=<平台> <镜像名>:<标签>

    其中 <平台> 的格式通常是:

    <OS>/<架构>[/<变体>]

    例如:

    • linux/amd64 — 常见的 PC/服务器 Linux 平台

    • linux/arm64 — 适用于 ARM64 的 Linux(比如苹果 M 系列或某些云主机)

    • windows/amd64 — Windows 平台

    举例:

    docker pull --platform=linux/arm64 nginx:latest

    这条命令会从 Docker Hub 拉取 nginx:latest 镜像,并指定架构为 linux/arm64

    这在以下场景非常有用:
    ✅ 在不同 CPU 架构的机器之间交叉构建或测试
    ✅ 在苹果 M1/M2 Mac 上使用 amd64 镜像
    ✅ 在 CI/CD 环境里统一镜像架构

    如果不写 --platform,Docker 会默认拉取与你本地机器架构相同的平台镜像。

  • 查看本地镜像:

    docker images
  • 删除镜像: 删除本地的一个或多个镜像。

    docker rmi [镜像ID或镜像名]:[标签]
    # 示例:docker rmi ubuntu:latest
    # 强制删除:docker rmi -f [镜像ID或镜像名]
  • 构建镜像 (通过 Dockerfile):

    在一个包含 Dockerfile 的目录下执行:

    docker build -t [新镜像名]:[标签] .
    # 示例:docker build -t myapp:1.0 .

    这里的 . 表示 Dockerfile 在当前目录。

3. Docker 容器管理

容器是镜像的运行实例,是 Docker 应用的实际运行载体。

常用命令:

  • 运行容器:

    docker run [选项] [镜像名]:[标签] [命令]
    # 常用选项:
    # -d:后台运行容器
    # -p [宿主机端口]:[容器端口]:端口映射
    # -v [宿主机路径]:[容器路径]:数据卷挂载
    # --name [容器名]:指定容器名称
    # -it:交互式运行(通常用于进入容器内部)
    
    # 示例:运行一个 Nginx 容器,并将宿主机的 80 端口映射到容器的 80 端口
    docker run -d -p 80:80 --name mynginx nginx:latest
    
    # 示例:运行一个交互式的 Ubuntu 容器
    docker run -it ubuntu:latest /bin/bash
  • 查看运行中的容器:

    docker ps
  • 查看所有容器 (包括已停止的):

    docker ps -a
  • 停止容器:

    docker stop [容器ID或容器名]
    # 示例:docker stop mynginx
  • 启动已停止的容器:

    docker start [容器ID或容器名]
  • 重启容器:

    docker restart [容器ID或容器名]
  • 删除容器:

    docker rm [容器ID或容器名]
    # 强制删除:docker rm -f [容器ID或容器名]
  • 进入正在运行的容器:

    docker exec -it [容器ID或容器名] /bin/bash
    # 示例:docker exec -it mynginx /bin/bash
  • 查看容器日志:

    docker logs [容器ID或容器名]
    # 实时查看:docker logs -f [容器ID或容器名]

4. Dockerfile 编写

Dockerfile 是自动化构建 Docker 镜像的关键。

Dockerfile 常用指令:

  • FROM:指定基础镜像。

    Dockerfile

    FROM ubuntu:latest
  • WORKDIR:设置工作目录。

    WORKDIR /app
  • COPY:复制文件或目录到镜像中。

    COPY . /app
  • ADD:与 COPY 类似,但支持解压 tar 文件和获取 URL。

    ADD https://example.com/software.tar.gz /app/
  • RUN:在镜像构建过程中执行命令。

    RUN apt-get update && apt-get install -y nodejs
  • CMD:容器启动时执行的默认命令。如果 docker run 命令指定了其他命令,CMD 将被覆盖。

    CMD ["node", "app.js"]
  • ENTRYPOINT:与 CMD 类似,但通常用于定义容器的主要执行命令,docker run 后面的命令会作为参数传递给 ENTRYPOINT。

    ENTRYPOINT ["nginx", "-g", "daemon off;"]
  • EXPOSE:声明容器将监听的端口(仅用于文档说明,不实际发布端口)。

    EXPOSE 80
  • ENV:设置环境变量。

    ENV MY_VARIABLE="hello"

Dockerfile 示例:一个简单的 Node.js 应用

假设您有一个 app.js 文件:

// app.js
const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello from Docker!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

以及 package.json

{
  "name": "my-docker-app",
  "version": "1.0.0",
  "description": "A simple Node.js app for Docker",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}

现在创建一个 Dockerfile 文件:

# 使用官方 Node.js 镜像作为基础
FROM node:14-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json (如果存在)
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制整个应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义容器启动时运行的命令
CMD ["npm", "start"]

在包含 Dockerfileapp.jspackage.json 的目录下,运行以下命令构建镜像:

docker build -t my-node-app:1.0 .

然后运行容器:

docker run -d -p 3000:3000 --name my-node-container my-node-app:1.0

现在访问 http://localhost:3000 就可以看到 "Hello from Docker!"。

5. Docker 数据管理 (数据卷)

容器是短暂的,当容器被删除时,容器内部的数据也会丢失。数据卷 (Volumes) 用于持久化存储容器生成或使用的数据。

常用命令及方法:

  • 挂载宿主机目录作为数据卷:

    docker run -d -v /path/on/host:/path/in/container [镜像名]
    # 示例:将宿主机的 /opt/nginx/html 目录挂载到容器的 /usr/share/nginx/html 目录
    docker run -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html --name mynginx-volume nginx:latest
  • 使用命名数据卷 (Named Volumes): Docker 会自动在宿主机管理这些数据卷的位置。

    1. 创建命名数据卷:

      docker volume create mydata
    2. 查看数据卷:

      docker volume ls
    3. 使用命名数据卷运行容器:

      docker run -d -v mydata:/path/in/container [镜像名]
      # 示例:
      docker run -d -v mydata:/app/data --name myapp-with-data myapp:1.0
    4. 检查数据卷信息:

      docker volume inspect mydata
    5. 删除数据卷: 确保没有容器在使用该数据卷。

      docker volume rm mydata

6. Docker 网络

Docker 提供了多种网络模式,允许容器之间以及容器与外部世界进行通信。

常用网络模式:

  • Bridge (桥接模式 - 默认):Docker 创建一个虚拟网桥,容器连接到这个网桥,并通过 NAT 访问外部网络。

    • 容器间通信: 同一个桥接网络中的容器可以通过 IP 地址直接通信。

    • 端口映射: 如果要从外部访问容器,需要通过 -p-P 进行端口映射。

    示例:创建自定义桥接网络

    1. 创建网络:

      docker network create my-bridge-network
    2. 运行容器并连接到网络:

      docker run -d --name container1 --network my-bridge-network nginx
      docker run -d --name container2 --network my-bridge-network ubuntu:latest sleep infinity
    3. 容器间通过名称互相访问:container2 中 ping container1

      docker exec -it container2 ping container1
  • Host (主机模式):容器直接使用宿主机的网络命名空间,共享宿主机的 IP 地址和端口。

    • 优点: 性能高,没有额外的网络层。

    • 缺点: 失去了容器间的隔离性,可能会导致端口冲突。

    docker run -d --network host --name my-host-nginx nginx
  • None (无网络模式):容器没有网络接口,只能通过挂载数据卷或其他方式进行通信。

    docker run -d --network none --name my-isolated-container ubuntu:latest sleep infinity

7. Docker Compose (多容器应用编排)

对于由多个服务(如 Web 应用、数据库、缓存)组成的应用,手动管理多个 Docker 容器会变得复杂。Docker Compose 是一个工具,允许您使用 YAML 文件来定义和运行多容器 Docker 应用。

教程步骤:

  1. 安装 Docker Compose: Docker Desktop 通常自带 Compose。如果没有,请参考 Docker Compose 安装指南

  2. 创建 docker-compose.yml 文件: 定义您的服务、网络和数据卷。

    docker-compose.yml 示例:一个简单的 WordPress 应用

    version: '3.8' # Docker Compose 文件格式版本
    
    services:
      wordpress:
        image: wordpress:latest
        container_name: wordpress_app
        ports:
          - "80:80" # 映射宿主机 80 端口到容器 80 端口
        environment:
          WORDPRESS_DB_HOST: db:3306 # 数据库主机名和端口,这里的 'db' 是另一个服务的名称
          WORDPRESS_DB_USER: wordpress_user
          WORDPRESS_DB_PASSWORD: wordpress_password
          WORDPRESS_DB_NAME: wordpress_db
        volumes:
          - wordpress_data:/var/www/html # 挂载数据卷以持久化 WordPress 数据
        depends_on:
          - db # 确保 db 服务在 wordpress 服务之前启动
    
      db:
        image: mysql:5.7
        container_name: wordpress_db_server
        environment:
          MYSQL_ROOT_PASSWORD: root_password # MySQL root 用户密码
          MYSQL_DATABASE: wordpress_db # 数据库名称
          MYSQL_USER: wordpress_user # 数据库用户
          MYSQL_PASSWORD: wordpress_password # 数据库密码
        volumes:
          - db_data:/var/lib/mysql # 挂载数据卷以持久化数据库数据
    
    volumes:
      wordpress_data: # 定义命名数据卷
      db_data:
  3. 启动应用:docker-compose.yml 所在的目录下执行:

    docker-compose up -d
    # -d 表示在后台运行

    Compose 会自动创建网络、启动服务,并按照依赖关系顺序启动容器。

  4. 停止和移除应用:

    docker-compose down
    # -v 参数会移除数据卷:docker-compose down -v
  5. 查看服务状态:

    docker-compose ps
  6. 查看服务日志:

    docker-compose logs -f

8. Docker Swarm (集群管理与编排)

Docker Swarm 是 Docker 官方提供的集群管理和编排工具,可以将多个 Docker 主机组合成一个虚拟的 Docker 主机,并像管理单个主机一样管理它们。它提供了服务发现、负载均衡、滚动更新等功能。

教程步骤 (概念性):

  1. 初始化 Swarm: 在一个节点上初始化 Swarm,使其成为 Swarm 管理器。

    docker swarm init --advertise-addr [Manager_IP]

    这会输出一个 docker swarm join 命令,用于其他节点加入 Swarm。

  2. 将其他节点加入 Swarm: 在其他机器上运行加入命令,使其成为工作节点或另一个管理器。

    docker swarm join --token [TOKEN] [Manager_IP]:[PORT]
  3. 部署服务: 使用 docker service 命令部署服务。

    docker service create --name my-web --publish 80:80 --replicas 3 nginx

    这会在 Swarm 集群中启动 3 个 Nginx 容器实例。

  4. 扩展服务:

    docker service scale my-web=5
  5. 滚动更新:

    docker service update --image nginx:1.21 my-web

9. Docker Hub (镜像仓库)

Docker Hub 是 Docker 官方提供的公共镜像仓库,您可以从中拉取镜像,也可以推送自己的镜像。

教程步骤:

  1. 注册 Docker Hub 账号: 如果您还没有账号,请访问 Docker Hub 注册。

  2. 登录 Docker Hub: 在终端中登录。

    docker login

    输入您的用户名和密码。

  3. 给本地镜像打标签: 标签格式为 [您的DockerHub用户名]/[镜像名]:[标签]

    docker tag my-node-app:1.0 your_dockerhub_username/my-node-app:1.0
  4. 推送镜像到 Docker Hub:

    docker push your_dockerhub_username/my-node-app:1.0
  5. 从 Docker Hub 拉取镜像:

    docker pull your_dockerhub_username/my-node-app:1.0

进阶学习建议

  • Docker 安全: 学习如何编写更安全的 Dockerfile,以及如何保护您的容器。

  • Docker 监控与日志: 了解如何监控容器的性能和收集日志。

  • CI/CD 与 Docker: 将 Docker 集成到您的持续集成/持续部署 (CI/CD) 流程中。

  • Kubernetes: 当您的容器化应用变得非常复杂和庞大时,Kubernetes 是更强大的容器编排平台。

-.-

0

评论区