Docker 入门指南:从安装到第一个容器

Docker 入门指南:从安装到第一个容器

Docker 是一个用于开发、交付和运行应用程序的开源平台。通过使用容器技术,Docker 使应用程序和其依赖项可以在不同环境中轻松迁移和运行,从而解决了 "在我电脑上没问题" 的传统开发问题。本文将带您从零开始学习 Docker,从安装到运行第一个容器,全面了解 Docker 的基础知识。

一、什么是 Docker?

Docker 是一个基于容器技术的虚拟化平台,它能够将应用程序及其所有依赖项打包到一个容器中,使其在任何环境中都可以快速、可靠地运行。与传统的虚拟机相比,Docker 容器更轻量级,启动速度更快,资源占用更少,非常适合 DevOps 流程和微服务架构。

Docker 的核心概念
  • 镜像(Image):Docker 镜像是一个只读的模板,其中包含了运行应用程序所需的一切(代码、库、依赖项等)。镜像是容器的基础,容器运行时从镜像创建。
  • 容器(Container):容器是镜像的运行实例。它包含了应用程序及其依赖项,在 Docker 中运行时是一个隔离的进程。
  • 仓库(Repository):Docker 仓库是存储镜像的地方,可以是公共的(如 Docker Hub)或私有的。
  • Docker 引擎(Engine):Docker 引擎是一个 C/S 架构的应用程序,包含 Docker 守护进程(Daemon)和 Docker 客户端,用于构建、运行和管理 Docker 容器。

二、Docker 安装

在开始使用 Docker 之前,需要在您的系统上安装 Docker。Docker 支持多种操作系统,包括 Linux、Windows 和 macOS。

1. 在 Windows 上安装 Docker
  1. 下载 Docker Desktop :访问 Docker 官方网站 下载 Docker Desktop 安装程序。

  2. 运行安装程序:双击下载的安装文件,按照提示完成安装。安装过程中,确保启用了"Hyper-V"和"Containers"功能(Docker 需要这些功能)。

  3. 启动 Docker Desktop:安装完成后,启动 Docker Desktop,Docker 将自动启动并在系统托盘显示图标。

  4. 验证安装:打开命令提示符(CMD)或 PowerShell,输入以下命令验证 Docker 是否安装成功:

    bash 复制代码
    docker --version

    若成功安装,将显示 Docker 版本信息。

2. 在 macOS 上安装 Docker
  1. 下载 Docker Desktop :前往 Docker 官方网站 下载适用于 macOS 的 Docker Desktop。

  2. 安装 Docker Desktop :双击下载的 .dmg 文件,将 Docker 拖放到"应用程序"文件夹中。

  3. 启动 Docker Desktop:从"应用程序"中启动 Docker Desktop,首次启动可能需要授予一些权限。

  4. 验证安装:打开终端(Terminal),输入以下命令验证 Docker 是否安装成功:

    bash 复制代码
    docker --version

    若成功安装,将显示 Docker 版本信息。

3. 在 Linux 上安装 Docker

Docker 支持多种 Linux 发行版,如 Ubuntu、CentOS 和 Debian 等。以下以 Ubuntu 为例进行安装:

  1. 更新包索引

    bash 复制代码
    sudo apt-get update
  2. 安装必要的依赖包

    bash 复制代码
    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  3. 添加 Docker 的 GPG 密钥

    bash 复制代码
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. 添加 Docker 仓库

    bash 复制代码
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  5. 更新包索引

    bash 复制代码
    sudo apt-get update
  6. 安装 Docker CE(社区版)

    bash 复制代码
    sudo apt-get install docker-ce
  7. 启动 Docker 并设置为开机启动

    bash 复制代码
    sudo systemctl start docker
    sudo systemctl enable docker
  8. 验证安装

    bash 复制代码
    docker --version

    若成功安装,将显示 Docker 版本信息。

三、Docker 的基本命令

Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷。以下是一些常用的 Docker 命令。

1. 镜像管理命令
  • 拉取镜像:从 Docker Hub 或其他仓库中下载镜像。

    bash 复制代码
    docker pull <image_name>

    例如,下载官方的 Ubuntu 镜像:

    bash 复制代码
    docker pull ubuntu
  • 查看本地镜像:列出当前系统上存在的 Docker 镜像。

    bash 复制代码
    docker images
  • 删除镜像:删除本地的 Docker 镜像。

    bash 复制代码
    docker rmi <image_id>
2. 容器管理命令
  • 运行容器:从指定镜像启动一个新容器。

    bash 复制代码
    docker run <options> <image_name>

    例如,启动一个 Ubuntu 容器并进入交互模式:

    bash 复制代码
    docker run -it ubuntu /bin/bash
    • -i:交互模式
    • -t:分配一个伪终端
  • 列出容器:显示所有正在运行的容器。

    bash 复制代码
    docker ps

    要显示所有容器(包括停止的容器),请使用:

    bash 复制代码
    docker ps -a
  • 停止容器:停止指定的运行容器。

    bash 复制代码
    docker stop <container_id>
  • 删除容器:删除已停止的容器。

    bash 复制代码
    docker rm <container_id>
  • 查看容器日志:查看容器的输出日志。

    bash 复制代码
    docker logs <container_id>
3. 其他有用命令
  • 查看 Docker 系统信息

    bash 复制代码
    docker info
  • 检查 Docker 版本

    bash 复制代码
    docker version

四、构建和运行第一个 Docker 容器

现在,我们将构建并运行一个简单的 Docker 容器。此容器将运行一个基本的 Web 服务器,展示 Docker 容器的强大功能。

1. 创建 Dockerfile

Dockerfile 是用于构建 Docker 镜像的脚本文件,包含了一系列的命令来定义镜像的内容和行为。

在您的工作目录下创建一个名为 Dockerfile 的文件,内容如下:

dockerfile 复制代码
# 使用官方的 nginx 镜像作为基础镜像
FROM nginx:latest

# 复制本地的 index.html 文件到镜像中的 nginx 默认目录
COPY index.html /usr/share/nginx/html/index.html

# 暴露端口 80
EXPOSE 80

# 启动 nginx 服务
CMD ["nginx", "-g", "daemon off;"]
2. 创建 index.html 文件

在同一目录下创建一个简单的 index.html 文件:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Docker Test</title>
</head>
<body>
    <h1>Hello, Docker!</h1>
    <p>Welcome to your first Docker container

Web server!</p>
</body>
</html>

该文件将用于在容器内的 Nginx Web 服务器上显示一个简单的 "Hello, Docker!" 页面。

3. 构建 Docker 镜像

Dockerfile 所在的目录中运行以下命令,构建一个新的 Docker 镜像:

bash 复制代码
docker build -t my-nginx-image .
  • -t my-nginx-image:指定镜像的名称为 my-nginx-image
  • .:指当前目录包含 Dockerfileindex.html 文件。

构建成功后,您将在终端看到类似于 "Successfully built <镜像ID>" 的消息。

4. 运行 Docker 容器

使用以下命令从新构建的镜像启动容器:

bash 复制代码
docker run -d -p 8080:80 my-nginx-image
  • -d:以分离模式运行容器(后台运行)。
  • -p 8080:80:将主机的 8080 端口映射到容器的 80 端口。
  • my-nginx-image:容器将基于此镜像启动。

运行成功后,Docker 会返回一个长字符的容器 ID,可以使用 docker ps 查看运行中的容器。

5. 验证 Docker 容器

打开浏览器并访问 http://localhost:8080,如果一切正常,您将看到 "Hello, Docker!" 的网页,这表明您的第一个 Docker 容器已成功运行。

五、深入理解 Docker 的核心概念

1. 镜像(Image)

Docker 镜像是一个只读模板,用于创建 Docker 容器。镜像可以基于已有的基础镜像进行构建和自定义。在 Docker 中,镜像是分层的,每个层代表镜像的一个修改或添加。

  • 基础镜像:如 Ubuntu、Alpine、Nginx 等,是最基本的镜像,通常由 Docker 官方或第三方维护。
  • 自定义镜像:用户可以在基础镜像上执行一系列操作(如安装软件、复制文件)来创建自定义镜像。
2. 容器(Container)

容器是从镜像创建的可运行实例。每个容器都是一个轻量级、独立的环境,它包含了应用程序及其运行所需的所有依赖项。

  • 容器是镜像的运行实例,可以启动、停止、重新启动、删除等。
  • 容器是隔离的,但可以通过网络和数据卷进行通信和共享数据。
3. 仓库(Repository)与注册表(Registry)
  • 仓库(Repository):是 Docker 镜像的集合,每个仓库包含同一个软件的不同版本的镜像。
  • 注册表(Registry):是存储和分发 Docker 镜像的服务,如 Docker Hub 是一个公共的 Docker 注册表。

用户可以将自己构建的镜像上传到公共或私有仓库,其他用户可以从仓库中拉取镜像进行使用。

六、Docker 的高级特性

1. 数据卷(Volumes)

数据卷是 Docker 提供的一个用于数据持久化的机制,容器被删除时,数据卷中的数据不会丢失。数据卷可以用于以下场景:

  • 持久化存储:将数据库数据或日志文件存储在数据卷中,即使容器删除,数据仍然保留。
  • 数据共享:多个容器可以共享同一个数据卷,从而实现数据共享和互通。
  • 性能优化:数据卷的读写性能通常优于容器的文件系统。

如何使用数据卷:

  • 创建数据卷

    bash 复制代码
    docker volume create my-volume
  • 将数据卷挂载到容器

    bash 复制代码
    docker run -d -v my-volume:/app/data my-nginx-image

    这将 my-volume 数据卷挂载到容器的 /app/data 目录下。

2. 网络(Networking)

Docker 提供了多种网络模式来管理容器之间的通信:

  • 桥接网络(Bridge):默认的网络模式,容器通过桥接网络与主机通信。适合单机多容器应用。
  • 主机网络(Host):容器与主机共享网络栈,使用相同的 IP 地址。适合需要高性能和低延迟的应用。
  • 覆盖网络(Overlay):用于跨多个 Docker 主机的容器通信,适用于 Docker Swarm 或 Kubernetes 等集群环境。
  • 自定义网络:用户可以创建自定义的网络,配置更灵活,支持隔离和安全策略。

如何使用自定义网络:

  • 创建自定义网络

    bash 复制代码
    docker network create my-network
  • 将容器连接到自定义网络

    bash 复制代码
    docker run -d --network my-network my-nginx-image
3. Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过编写一个 docker-compose.yml 文件,可以同时启动和管理多个服务,简化了容器的管理和协调。

如何使用 Docker Compose:

  • 编写 docker-compose.yml 文件

    创建一个名为 docker-compose.yml 的文件,定义多容器应用的配置,例如:

    yaml 复制代码
    version: '3'
    services:
      web:
        image: nginx:latest
        ports:
          - "8080:80"
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: example
  • 启动多容器应用

    bash 复制代码
    docker-compose up -d

    该命令将在后台启动定义的 Nginx 和 MySQL 容器。

  • 停止和删除多容器应用

    bash 复制代码
    docker-compose down
4. Docker Swarm

Docker Swarm 是 Docker 提供的原生集群管理工具,用于将多个 Docker 主机集成到一个集群中,简化容器的部署、管理和扩展。

  • Swarm 模式下的服务创建

    bash 复制代码
    docker swarm init
    docker service create --name web --replicas 3 -p 80:80 nginx

    这将在集群中创建一个名为 web 的服务,并启动 3 个 Nginx 实例。

5. Dockerfile 的优化

在编写 Dockerfile 时,应注意以下优化策略以提升镜像构建效率和容器性能:

  • 使用官方基础镜像 :选择轻量级的官方基础镜像(如 alpine)以减少镜像大小。
  • 减少镜像层数 :将多条命令合并到单条 RUN 指令中,以减少构建层数。
  • 缓存依赖:在 Dockerfile 的顶部添加不会频繁变动的指令,以利用 Docker 构建缓存。
  • 清理不必要的文件:构建完成后清理临时文件和缓存数据,减少镜像体积。

示例优化 Dockerfile:

dockerfile 复制代码
FROM python:3.9-slim

WORKDIR /app

# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

CMD ["python", "app.py"]

七、Docker 入门的最佳实践

  1. 学习 Docker 基础命令 :熟练掌握 Docker 的基础命令,如 docker rundocker builddocker psdocker exec 等。
  2. 使用 Dockerfile 构建镜像:了解如何编写高效的 Dockerfile 并优化镜像大小和构建速度。
  3. 管理 Docker 网络和数据卷:学习 Docker 网络的配置和数据卷的使用,以实现容器之间的数据共享和持久化存储。
  4. 使用 Docker Compose 管理多容器应用:使用 Docker Compose 简化多容器应用的定义和管理。
  5. 定期清理 Docker 资源:定期清理未使用的镜像、容器、数据卷和网络,以保持系统清洁和高效。

八、总结

本文从 Docker 的基础知识入手,介绍了如何安装 Docker、基本命令的使用、构建和运行第一个容器,并深入探讨了 Docker 的高级特性,如数据卷、网络、Docker Compose 和 Docker Swarm。通过这些内容,您应该对 Docker 有了一个全面的了解,并能够使用 Docker 来构建和管理容器化的应用程序。在实际应用中,继续探索和实践 Docker 的更多特性和工具,将有助于提升您的容器化技术技能。Docker 提供了现代软件开发和部署所需的灵活性和效率,是 DevOps 和微服务架构中的核心组件。

相关推荐
淡水猫.16 分钟前
Fakelocation Server服务器/专业版 ubuntu
运维·服务器·ubuntu
wenyue112122 分钟前
Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析
运维·中间件·监控
时光の尘32 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
我们的五年36 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
灼烧的疯狂1 小时前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
运维老司机1 小时前
Jenkins修改LOGO
运维·自动化·jenkins
D-海漠1 小时前
基础自动化系统的特点
运维·自动化
我言秋日胜春朝★1 小时前
【Linux】进程地址空间
linux·运维·服务器
C-cat.2 小时前
Linux|环境变量
linux·运维·服务器
wenyue11212 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway