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
-
下载 Docker Desktop:访问 Docker 官方网站 下载 Docker Desktop 安装程序。
-
运行安装程序:双击下载的安装文件,按照提示完成安装。安装过程中,确保启用了“Hyper-V”和“Containers”功能(Docker 需要这些功能)。
-
启动 Docker Desktop:安装完成后,启动 Docker Desktop,Docker 将自动启动并在系统托盘显示图标。
-
验证安装:打开命令提示符(CMD)或 PowerShell,输入以下命令验证 Docker 是否安装成功:
docker --version
若成功安装,将显示 Docker 版本信息。
2. 在 macOS 上安装 Docker
-
下载 Docker Desktop:前往 Docker 官方网站 下载适用于 macOS 的 Docker Desktop。
-
安装 Docker Desktop:双击下载的
.dmg
文件,将 Docker 拖放到“应用程序”文件夹中。 -
启动 Docker Desktop:从“应用程序”中启动 Docker Desktop,首次启动可能需要授予一些权限。
-
验证安装:打开终端(Terminal),输入以下命令验证 Docker 是否安装成功:
docker --version
若成功安装,将显示 Docker 版本信息。
3. 在 Linux 上安装 Docker
Docker 支持多种 Linux 发行版,如 Ubuntu、CentOS 和 Debian 等。以下以 Ubuntu 为例进行安装:
-
更新包索引:
sudo apt-get update
-
安装必要的依赖包:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
-
添加 Docker 的 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
添加 Docker 仓库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-
更新包索引:
sudo apt-get update
-
安装 Docker CE(社区版):
sudo apt-get install docker-ce
-
启动 Docker 并设置为开机启动:
sudo systemctl start docker sudo systemctl enable docker
-
验证安装:
docker --version
若成功安装,将显示 Docker 版本信息。
三、Docker 的基本命令
Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷。以下是一些常用的 Docker 命令。
1. 镜像管理命令
-
拉取镜像:从 Docker Hub 或其他仓库中下载镜像。
docker pull <image_name>
例如,下载官方的 Ubuntu 镜像:
docker pull ubuntu
-
查看本地镜像:列出当前系统上存在的 Docker 镜像。
docker images
-
删除镜像:删除本地的 Docker 镜像。
docker rmi <image_id>
2. 容器管理命令
-
运行容器:从指定镜像启动一个新容器。
docker run <options> <image_name>
例如,启动一个 Ubuntu 容器并进入交互模式:
docker run -it ubuntu /bin/bash
-i
:交互模式-t
:分配一个伪终端
-
列出容器:显示所有正在运行的容器。
docker ps
要显示所有容器(包括停止的容器),请使用:
docker ps -a
-
停止容器:停止指定的运行容器。
docker stop <container_id>
-
删除容器:删除已停止的容器。
docker rm <container_id>
-
查看容器日志:查看容器的输出日志。
docker logs <container_id>
3. 其他有用命令
-
查看 Docker 系统信息:
docker info
-
检查 Docker 版本:
docker version
四、构建和运行第一个 Docker 容器
现在,我们将构建并运行一个简单的 Docker 容器。此容器将运行一个基本的 Web 服务器,展示 Docker 容器的强大功能。
1. 创建 Dockerfile
Dockerfile 是用于构建 Docker 镜像的脚本文件,包含了一系列的命令来定义镜像的内容和行为。
在您的工作目录下创建一个名为 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
文件:
<!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 镜像:
docker build -t my-nginx-image .
-t my-nginx-image
:指定镜像的名称为my-nginx-image
。.
:指当前目录包含Dockerfile
和index.html
文件。
构建成功后,您将在终端看到类似于 “Successfully built <镜像ID>” 的消息。
4. 运行 Docker 容器
使用以下命令从新构建的镜像启动容器:
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 提供的一个用于数据持久化的机制,容器被删除时,数据卷中的数据不会丢失。数据卷可以用于以下场景:
- 持久化存储:将数据库数据或日志文件存储在数据卷中,即使容器删除,数据仍然保留。
- 数据共享:多个容器可以共享同一个数据卷,从而实现数据共享和互通。
- 性能优化:数据卷的读写性能通常优于容器的文件系统。
如何使用数据卷:
-
创建数据卷:
docker volume create my-volume
-
将数据卷挂载到容器:
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 等集群环境。
- 自定义网络:用户可以创建自定义的网络,配置更灵活,支持隔离和安全策略。
如何使用自定义网络:
-
创建自定义网络:
docker network create my-network
-
将容器连接到自定义网络:
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
的文件,定义多容器应用的配置,例如:version: '3' services: web: image: nginx:latest ports: - "8080:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example
-
启动多容器应用:
docker-compose up -d
该命令将在后台启动定义的 Nginx 和 MySQL 容器。
-
停止和删除多容器应用:
docker-compose down
4. Docker Swarm
Docker Swarm 是 Docker 提供的原生集群管理工具,用于将多个 Docker 主机集成到一个集群中,简化容器的部署、管理和扩展。
-
Swarm 模式下的服务创建:
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:
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 入门的最佳实践
- 学习 Docker 基础命令:熟练掌握 Docker 的基础命令,如
docker run
、docker build
、docker ps
、docker exec
等。 - 使用 Dockerfile 构建镜像:了解如何编写高效的 Dockerfile 并优化镜像大小和构建速度。
- 管理 Docker 网络和数据卷:学习 Docker 网络的配置和数据卷的使用,以实现容器之间的数据共享和持久化存储。
- 使用 Docker Compose 管理多容器应用:使用 Docker Compose 简化多容器应用的定义和管理。
- 定期清理 Docker 资源:定期清理未使用的镜像、容器、数据卷和网络,以保持系统清洁和高效。
八、总结
本文从 Docker 的基础知识入手,介绍了如何安装 Docker、基本命令的使用、构建和运行第一个容器,并深入探讨了 Docker 的高级特性,如数据卷、网络、Docker Compose 和 Docker Swarm。通过这些内容,您应该对 Docker 有了一个全面的了解,并能够使用 Docker 来构建和管理容器化的应用程序。在实际应用中,继续探索和实践 Docker 的更多特性和工具,将有助于提升您的容器化技术技能。Docker 提供了现代软件开发和部署所需的灵活性和效率,是 DevOps 和微服务架构中的核心组件。