1. 什么是Docker?为什么你需要它?

如果你刚开始接触编程或者运维,听到“Docker”这个词可能会觉得有点高大上,甚至有点懵。别担心,我第一次听说的时候也完全摸不着头脑。简单来说,你可以把Docker想象成一个超级打包工具。它能把你的应用程序,连同它需要的所有“家当”——比如数据库、运行环境、配置文件等等——全部打包成一个标准化的“箱子”,这个箱子就叫镜像

这个“箱子”的神奇之处在于,它能在任何一台安装了Docker的电脑上,原封不动地打开并运行。你再也不用对着同事或者网上的教程哀嚎:“为什么在你电脑上能跑,到我这儿就报错啊?” 这种“在我这儿好好的”问题,Docker基本能给你根治。我刚开始工作时,花了两天时间在一台新服务器上配置一个老项目的Python环境,各种库版本冲突,差点崩溃。后来用了Docker,一行命令就搞定了,那种感觉就像找到了通往新世界的大门。

那么,它和传统的虚拟机有什么区别呢?很多人会混淆。虚拟机,比如VMware或VirtualBox,是“模拟一整台电脑”。它会在你的电脑里,用软件硬生生造出一个完整的、独立的操作系统来,里面有自己的内核、驱动、系统文件。这就像在你家里,又盖了一栋功能齐全的小房子。好处是隔离得彻底,但缺点也很明显:太重了。启动慢、占用大量内存和硬盘空间,对电脑资源是个不小的负担。

而Docker采用的容器技术,更像是“隔离一个房间”。它不模拟整个操作系统,而是利用你电脑上现有的Linux内核,通过一些技术手段,为应用程序创建一个独立的、隔离的运行环境(也就是容器)。这个环境里,程序以为自己独占了一套文件系统、网络和进程空间,但实际上它们和主机以及其他容器是共享内核的。这就好比在你家的大房子里,用轻质隔断墙隔出一个个独立的房间,每个房间都能住人,互不干扰,但共用总的水电地基。所以,Docker容器启动速度极快(秒级)、资源消耗极小,一台普通的服务器能轻松跑几十个甚至上百个容器。

所以,Docker的核心价值就是:一次构建,处处运行。它解决了“环境一致性”这个开发、测试、运维中的老大难问题。无论你是想快速搭建一个临时的测试环境,还是想把自己的小项目部署上线,Docker都能让你事半功倍。

2. 手把手安装Docker:告别“从入门到放弃”

好了,概念讲清楚了,心动不如行动。咱们直接上手安装。原始文章里提到了在Ubuntu上安装,我这里会讲得更细,并且补充Windows和macOS的安装方法,让你不管用什么电脑都能跟上。

2.1 在Windows上安装Docker Desktop

对于绝大多数Windows用户(特别是Win10及以上),最省心的方式就是安装 Docker Desktop。它提供了一个图形化界面,把底层复杂的配置都封装好了。

首先,你需要确认两件事:

  1. 操作系统版本:必须是Windows 10 64位专业版、企业版或教育版(版本号2004及以上,内部版本19041及以上)。家庭版需要一些额外步骤。
  2. 开启虚拟化:Docker需要CPU的虚拟化技术支持。你可以在任务管理器的“性能”标签页里查看“虚拟化”是否已启用。如果没启用,需要进入电脑的BIOS设置(开机时按F2、Del等键)里找到“Virtualization Technology”或“VT-x”选项并打开。

确认无误后,访问Docker官网下载Docker Desktop for Windows的安装包。安装过程基本就是一路“Next”。安装完成后,重启电脑。重启后,你会在桌面或开始菜单找到Docker Desktop的图标,双击启动它。第一次启动可能会花点时间,因为它会在后台初始化一个轻量级的Linux虚拟机(WSL 2或Hyper-V)。

启动成功后,你会在系统托盘区看到一个小鲸鱼图标。这时,你可以打开命令行工具(CMD或PowerShell),输入 docker version 来验证。如果看到返回了Client和Server的版本信息,恭喜你,安装成功了!Docker Desktop自带了图形化管理界面,点开小鲸鱼图标就能看到,里面可以管理镜像、容器,非常直观。

2.2 在macOS上安装Docker Desktop

macOS的安装比Windows更简单。同样,去Docker官网下载Docker Desktop for Mac的安装包(.dmg文件)。下载后,把Docker的图标拖到“应用程序”文件夹里就完成了安装。

打开“应用程序”里的Docker,启动它。第一次启动会要求你输入系统密码来授权安装一些辅助工具。启动后,菜单栏顶部会出现一个小鲸鱼图标。同样,打开终端(Terminal),输入 docker version 来检查是否安装成功。macOS版的Docker Desktop同样内置了图形界面,用起来很方便。

2.3 在Linux(Ubuntu)上安装Docker Engine

原始文章详细介绍了在Ubuntu上的安装,我这里帮你梳理一个更清晰、更符合当前(请注意,软件源地址可能随时间变化)最佳实践的步骤。我们使用Docker官方提供的安装脚本,这是最稳妥的方式。

首先,打开你的终端。如果你是全新的Ubuntu系统,建议先更新一下软件包列表:

sudo apt update

接下来,安装一些让apt能通过HTTPS使用仓库的必要工具:

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

然后,添加Docker官方的GPG密钥,这用于验证下载包的完整性:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

接着,设置稳定的Docker仓库。这里我们用echo命令直接写入源列表,比用add-apt-repository更清晰:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

现在,再次更新apt包索引,让它识别我们新加的Docker仓库:

sudo apt update

最后,安装Docker引擎(Docker Engine)、命令行工具(CLI)以及容器运行时(containerd):

sudo apt install -y docker-ce docker-ce-cli containerd.io

安装完成后,Docker服务会自动启动。你可以运行一个经典的测试命令来验证一切是否正常:

sudo docker run hello-world

如果终端里打印出了“Hello from Docker!”等欢迎信息,说明你的Docker已经成功安装并运行起来了!这个命令会自动从仓库拉取一个极小的测试镜像并运行它。

3. Docker初体验:运行你的第一个容器

安装成功只是第一步,就像拿到了新玩具,总得先玩起来。我们继续用刚才的 hello-world 来深入感受一下Docker的工作流程。

当你输入 docker run hello-world 时,Docker在背后做了好几件事:

  1. 检查本地:Docker首先在你电脑的本地镜像仓库里寻找有没有叫 hello-world 的镜像。
  2. 拉取镜像:如果没找到(第一次运行肯定没有),它就会默认去Docker官方的公共仓库(Docker Hub)上拉取这个镜像。这就像你手机上下载一个新App。
  3. 创建容器:镜像下载到本地后,Docker会以这个镜像为模板,创建一个可写的容器层,并启动它。
  4. 执行命令:在这个容器内部,执行镜像预设好的命令(对于hello-world,就是打印一段信息)。
  5. 退出:命令执行完毕,容器进程终止。

这个过程揭示了Docker的两个核心概念:镜像容器。镜像是一个只读的模板,里面包含了运行程序需要的文件系统、库、环境变量等。而容器是镜像的一个运行实例。你可以基于同一个镜像,启动无数个相互隔离的容器,就像用同一个模具可以做出无数个蛋糕一样。

让我们多玩几个命令,熟悉一下基本操作:

  • 查看本地所有镜像docker imagesdocker image ls。这会列出你电脑上所有下载好的“模具”。
  • 查看正在运行的容器docker ps。这个命令只显示当前正在运行的容器。hello-world运行完就退出了,所以现在你运行这个命令,列表应该是空的。
  • 查看所有容器(包括已停止的)docker ps -a。这时你应该能看到刚才运行过的hello-world容器,状态是“Exited”。
  • 删除已停止的容器docker rm [容器ID或容器名]。你可以用docker ps -a查到的容器ID前几位来删除它,释放一点磁盘空间。比如 docker rm amazing_curie
  • 删除镜像docker rmi hello-world。如果你确定不再需要这个测试镜像了,可以删除它。

我建议你现在就打开终端,把这些命令都敲一遍,看看输出是什么。光看是记不住的,动手操作一遍,印象会深刻得多。我第一次玩的时候,就把docker psdocker images的输出对着看,慢慢就理解了镜像和容器的关系。

4. 加速!配置国内镜像源

如果你在运行 docker run hello-world 时感觉特别慢,或者直接超时失败,别慌,这不是你网络的问题,也不是Docker坏了。默认情况下,Docker会去国外的Docker Hub拉取镜像,对于国内用户来说,速度可能很不理想,甚至无法连接。

解决办法就是配置一个国内的镜像加速器,相当于给Docker换一个离你更近的“下载站”。国内很多云服务商都提供了免费的Docker镜像加速服务。

对于Docker Desktop(Windows/macOS): 配置起来最简单。右键点击系统托盘(Windows)或菜单栏(macOS)的Docker小鲸鱼图标,选择“Settings”或“Preferences”。然后找到“Docker Engine”选项。你会看到一个JSON格式的配置窗口。在里面找到或添加 registry-mirrors 这一项。我以配置阿里云加速器为例(需要先注册阿里云账号,在容器镜像服务里获取专属加速地址):

{
  "registry-mirrors": ["https://your_id.mirror.aliyuncs.com"]
}

your_id 换成你自己的。另外,中科大、网易、腾讯云也都有公共加速地址,比如中科大的 https://docker.mirrors.ustc.edu.cn/。配置完成后,点击“Apply & Restart”,Docker会重启并应用新配置。

对于Linux系统(如Ubuntu): 需要修改Docker守护进程的配置文件。使用你喜欢的文本编辑器(如vimnano)打开或创建这个文件:

sudo vim /etc/docker/daemon.json

如果文件是空的,就把上面的JSON配置写进去。如果已有内容,就在里面添加 "registry-mirrors" 这个键值对,注意JSON格式。保存退出后,需要重启Docker服务让配置生效:

sudo systemctl daemon-reload
sudo systemctl restart docker

配置完成后,你再尝试拉取镜像,速度会有质的飞跃。这是我踩过的第一个大坑,当时不知道有加速器这回事,拉一个几百兆的镜像等了一个小时,还以为是命令错了。

5. 实战:用Docker跑一个真正的应用——Nginx网站服务器

光跑个hello-world不过瘾,我们来点实际的:用Docker快速搭建一个Nginx网站服务器。Nginx是一个高性能的Web服务器,用它来演示非常合适。

首先,我们从Docker Hub拉取Nginx的官方镜像。这里我们可以指定一个版本,比如稳定版(stable):

docker pull nginx:stable

拉取成功后,用 docker images 看看,是不是多了一个nginx镜像。

接下来,运行这个镜像,创建一个容器:

docker run --name my-nginx -p 8080:80 -d nginx:stable

这个命令有几个关键参数,我来拆解一下:

  • --name my-nginx:给这个容器起个名字叫my-nginx,方便后续管理。如果不指定,Docker会随机分配一个有趣的名字。
  • -p 8080:80:这是端口映射,是核心概念。意思是把容器内部的80端口(Nginx默认服务端口)映射到宿主机的8080端口。这样,你访问你电脑的http://localhost:8080,流量就会被转发到容器里的Nginx。
  • -d:代表“detached”,让容器在后台运行。如果不加这个参数,容器会占用你的终端前台运行。
  • nginx:stable:指定我们使用的镜像。

命令执行后,它会返回一个长长的容器ID。现在,打开你的浏览器,输入 http://localhost:8080,你应该能看到Nginx的默认欢迎页面了!是不是很简单?你刚刚用一行命令就启动了一个完整的Web服务器,完全不需要在本地安装和配置Nginx。

现在,我们来做点更有意思的。Nginx的这个默认页面是镜像里写死的,我们如何用自己写的网页替换它呢?这就需要用到 数据卷 或者 目录挂载 的概念。我们可以把宿主机(你的电脑)上的一个目录,“挂载”到容器内部的Nginx网页目录,实现文件共享。

假设你在 /home/yourname/my-website 目录下有一个写好的 index.html 文件。我们可以这样启动一个新的容器:

docker run --name my-website -p 8081:80 -v /home/yourname/my-website:/usr/share/nginx/html -d nginx:stable

看,多了一个 -v 参数。它的格式是 宿主机目录:容器内目录。这样,容器内 /usr/share/nginx/html 目录下的内容,就直接是你本地 my-website 目录下的内容了。你修改本地的 index.html,刷新浏览器,就能立刻看到变化,无需重启容器。这就是Docker用于持久化数据和配置的常用方法。

最后,我们来学习如何管理这个后台运行的容器:

  • 查看日志docker logs my-website。如果网站访问有问题,这个命令是排查故障的首选。
  • 进入容器内部docker exec -it my-website bash。这个命令会打开一个交互式的终端(bash),让你“进入”到正在运行的容器内部,就像登录了一台小服务器一样。你可以在这里执行ls, cat等命令,查看容器内部的文件结构。按 Ctrl+D 或输入 exit 退出。
  • 停止容器docker stop my-website
  • 启动已停止的容器docker start my-website
  • 删除容器:先停止,再 docker rm my-website

通过这个Nginx的例子,你已经完成了从拉取镜像、运行容器、端口映射到目录挂载的完整流程。这已经覆盖了日常使用Docker的大部分基础操作。多练习几遍,把这些命令变成肌肉记忆。

6. 理解Docker的核心概念与日常命令清单

玩了一圈,我们回过头来,系统地梳理一下Docker里最重要的几个概念和一套你肯定会用到的命令清单,方便日后查阅。

核心概念三兄弟

  1. 镜像:只读的模板。它定义了容器运行所需的一切。镜像可以通过Dockerfile来构建(这是进阶内容),也可以从仓库拉取。镜像本身是分层的,每一层代表一条指令。这种分层结构使得镜像复用率极高,下载和存储都很高效。
  2. 容器:镜像的运行实例。容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。你可以把容器看作一个轻量级的、可执行的沙箱。
  3. 仓库:存放镜像的地方。最大的公共仓库是Docker Hub,就像代码界的GitHub。你可以在上面找到几乎所有常用软件的官方镜像(如MySQL, Redis, Python, Node.js)。也可以搭建私有的仓库,用于存放公司内部的镜像。

每日命令清单: 我把最常用的命令按场景分类,你完全可以把这个部分存下来:

镜像相关

  • docker pull [镜像名]:[标签] - 从仓库拉取镜像,如 docker pull ubuntu:20.04
  • docker images - 列出本地所有镜像
  • docker rmi [镜像ID] - 删除指定的本地镜像
  • docker build -t [标签] . - 根据当前目录的Dockerfile构建新镜像(进阶)

容器生命周期

  • docker run [选项] [镜像] - 创建并启动一个新容器。常用选项:-d后台,-p端口映射,-v目录挂载,--name取名。
  • docker ps - 列出正在运行的容器
  • docker ps -a - 列出所有容器(包括已停止的)
  • docker start [容器名/ID] - 启动一个已停止的容器
  • docker stop [容器名/ID] - 停止一个运行中的容器(温柔地停止)
  • docker restart [容器名/ID] - 重启容器
  • docker rm [容器名/ID] - 删除一个已停止的容器(加 -f 可强制删除运行中的)

容器交互与检查

  • docker logs [容器名/ID] - 查看容器的日志输出
  • docker exec -it [容器名/ID] bash/sh - 进入一个正在运行的容器内部
  • docker inspect [容器名/ID] - 查看容器的详细配置信息(JSON格式),非常有用
  • docker cp [容器名/ID]:/容器内路径 /宿主机路径 - 从容器内复制文件到宿主机,反向也可以。

系统与清理

  • docker system df - 查看Docker的磁盘使用情况(镜像、容器、数据卷各占多少空间)
  • docker system prune -a - 谨慎使用。这会清理所有已停止的容器、所有未被使用的镜像、所有构建缓存,释放磁盘空间。用之前确保没有重要数据。

记住,遇到不熟悉的命令,随时可以用 docker [命令] --help 来查看官方帮助文档,比如 docker run --help,这比在网上漫无目的地搜索更准确。我自己的经验是,刚开始不用死记硬背所有参数,把最常用的几个玩熟,其他的用到的时候再查,慢慢就都记住了。Docker的魅力就在于,通过这些简洁的命令,你能像搭积木一样组合出复杂的应用环境,大大提升了开发和部署的效率。

更多推荐