Docker 学习分享:从入门到实践的全方位指南
在当今快速迭代的软件开发与部署领域,Docker 凭借其轻量级、可移植、高效隔离的特性,已成为开发者和运维人员必备的核心工具之一。无论是微服务架构的落地、持续集成 / 持续部署(CI/CD)流程的优化,还是开发环境的一致性保障,Docker 都发挥着不可替代的作用。本次分享将从 Docker 的基础概念出发,逐步深入核心技术与实践操作,最终带你走进 Docker 的进阶应用场景,帮助你快速掌握这一热门技术。
一、Docker 是什么?为什么要学 Docker?
在接触一项新技术前,我们首先要明确 “它是什么” 和 “学它有什么用”,这能让我们的学习更有目标性。
1.1 Docker 的核心定义
Docker 是一个基于容器化技术的开源平台,它能将应用程序及其依赖(如库文件、配置、运行环境等)打包成一个标准化的 “容器”,确保应用在任何支持 Docker 的环境中都能以相同的方式运行。简单来说,Docker 解决了 “在我电脑上能跑,到你电脑上就报错” 的经典问题 —— 这也是它最核心的价值之一。
与传统的虚拟机(VM)不同,Docker 容器并不需要模拟完整的操作系统,而是共享宿主机的内核,因此具有启动快(秒级)、资源占用少(MB 级)、可移植性强的优势。例如,一台服务器上可以同时运行数十个甚至上百个 Docker 容器,而传统虚拟机可能只能运行几个,资源利用率差距显著。
1.2 为什么必须掌握 Docker?
环境一致性:开发者在本地开发时打包的容器,可直接部署到测试环境、生产环境,无需担心 “环境差异导致的 bug”,极大减少了跨环境部署的沟通成本和问题排查时间。
高效的资源利用:相比虚拟机,容器对 CPU、内存、存储的占用更低,能更充分地利用服务器硬件资源,降低企业的 IT 成本。
简化部署与运维:通过 Docker Compose 或 Kubernetes(K8s),可实现多容器应用的一键部署、扩缩容和监控,运维效率大幅提升。
微服务架构的基石:在微服务架构中,每个服务可打包成独立容器,便于单独开发、测试、部署和升级,是微服务落地的关键技术支撑。
职场竞争力:目前主流互联网公司(如阿里、腾讯、字节跳动)及传统企业的数字化转型中,Docker 已成为标配技术,掌握 Docker 能显著提升个人职场竞争力。
二、Docker 核心概念:3 个 “核心组件” 要记牢
Docker 的体系并不复杂,核心围绕 3 个组件展开,理解这 3 个组件的关系,就能打通 Docker 的 “任督二脉”。
2.1 镜像(Image):容器的 “模板”
镜像可以理解为一个只读的 “模板文件”,包含了运行应用所需的所有内容(代码、运行时、库、环境变量、配置文件等)。例如,一个 “Nginx 镜像” 就包含了 Nginx 服务器的所有程序文件和默认配置,一个 “Python 镜像” 就包含了 Python 解释器和基础依赖库。
特点:只读性(无法直接修改镜像内容)、分层存储(镜像由多个层组成,层可复用,减少存储空间占用)、可版本化(通过标签 Tag 区分不同版本,如nginx:1.24表示 Nginx 1.24 版本)。
常见操作:从 Docker Hub(官方镜像仓库)拉取镜像(docker pull nginx)、查看本地镜像(docker images)、删除镜像(docker rmi 镜像ID)。
2.2 容器(Container):镜像的 “运行实例”
容器是镜像的运行状态实例,相当于基于 “模板” 创建的 “可执行程序”。如果说镜像的 “只读的”,那么容器就是 “可读写的”—— 在运行容器时,Docker 会在镜像的基础上创建一个可写层,所有对容器内文件的修改都会保存在这个可写层中(不会影响原始镜像)。
特点:可启动、停止、重启、删除;每个容器是独立隔离的,拥有自己的文件系统、网络空间和进程空间,互不干扰;容器停止后,若未通过数据卷挂载,内部数据会丢失(这一点需要特别注意)。
常见操作:基于镜像创建并启动容器(docker run -d -p 80:80 nginx,-d 表示后台运行,-p 表示端口映射)、查看运行中容器(docker ps)、进入容器内部(docker exec -it 容器ID /bin/bash)、停止容器(docker stop 容器ID)、删除容器(docker rm 容器ID)。
2.3 仓库(Repository):镜像的 “存储仓库”
仓库是用于集中存储和管理镜像的地方,类似于代码仓库(如 GitHub)。Docker 官方提供的公共仓库是Docker Hub(https://hub.docker.com/),里面包含了数百万个官方和第三方镜像(如 Nginx、MySQL、Redis 等),开发者可直接拉取使用;企业内部通常会搭建私有仓库(如 Harbor),用于存储内部项目的镜像,保障安全性。
核心概念:仓库分为 “公开仓库” 和 “私有仓库”;每个仓库可包含多个镜像,通过 “标签(Tag)” 区分版本(如ubuntu:20.04和ubuntu:22.04是同一个仓库下的不同版本镜像)。
常见操作:登录 Docker Hub(docker login)、推送镜像到仓库(docker push 用户名/镜像名:标签)、从私有仓库拉取镜像(docker pull 私有仓库地址/镜像名:标签)。
三、Docker 环境搭建:Windows/macOS/Linux 全教程
学习 Docker 的第一步是搭建环境,不同操作系统的安装方式略有差异,下面分别介绍主流系统的安装步骤(以最新稳定版为例)。
3.1 Windows 系统(Windows 10/11 专业版 / 企业版)
Windows 系统需依赖 “Hyper-V”(微软的虚拟化技术)或 “WSL 2”(Windows 子系统),推荐使用 WSL 2(兼容性更好,支持更多 Linux 镜像)。
开启 WSL 2:
打开 “控制面板”→“程序”→“启用或关闭 Windows 功能”,勾选 “适用于 Linux 的 Windows 子系统”“虚拟机平台”,点击 “确定” 后重启电脑。
打开 PowerShell,执行命令:wsl --install(自动安装 WSL 2 和 Ubuntu 子系统,若已安装子系统,可执行wsl --set-default-version 2设置默认版本)。
安装 Docker Desktop for Windows:
访问 Docker 官网(https://www.docker.com/products/docker-desktop/),下载 Windows 版本的 Docker Desktop 安装包。
双击安装包,默认下一步即可(安装过程中会自动配置环境变量)。
安装完成后,启动 Docker Desktop,右下角托盘图标显示 “Docker Desktop running” 即表示启动成功。
验证安装:
打开 PowerShell 或 CMD,执行docker --version,若显示版本信息(如Docker version 26.0.0, build 2ae903e),则安装成功;
执行docker run hello-world,若能成功拉取 “hello-world” 镜像并运行,输出 “Hello from Docker!”,则环境正常。
3.2 macOS 系统
macOS 系统分为 Intel 芯片和 Apple Silicon(M1/M2/M3)芯片,需下载对应版本的 Docker Desktop。
安装 Docker Desktop for Mac:
访问 Docker 官网,下载对应芯片版本的 Docker Desktop 安装包(Intel 芯片下载 “Mac with Intel chip”,Apple Silicon 下载 “Mac with Apple chip”)。
将下载的.dmg文件双击打开,拖拽 “Docker” 图标到 “应用程序” 文件夹中。
从 “应用程序” 中启动 Docker,首次启动会提示 “是否允许打开”,点击 “打开”,等待启动完成(顶部菜单栏显示 Docker 图标且无错误提示)。
验证安装:
打开 “终端”,执行docker --version查看版本;
执行docker run hello-world,若正常输出,则环境搭建成功。
3.3 Linux 系统(以 CentOS 7 为例)
Linux 系统是 Docker 的原生运行环境,安装步骤相对简洁,无需依赖虚拟化工具。
卸载旧版本(若有):
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装依赖包:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
配置 Docker 官方 yum 源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker Engine(最新稳定版):
sudo yum install -y docker-ce docker-ce-cli containerd.io
启动 Docker 并设置开机自启:
sudo systemctl start docker # 启动Docker服务
sudo systemctl enable docker # 设置开机自启
验证安装:
sudo docker --version # 查看版本
sudo docker run hello-world # 测试运行
(可选)为避免每次执行docker命令都需要sudo,可将当前用户添加到docker用户组:
sudo usermod -aG docker $USER
执行后注销并重新登录,即可直接使用docker命令。
四、Docker 实战操作:从 “Hello World” 到 “部署 Web 应用”
掌握基础命令后,我们通过几个实战案例,进一步熟悉 Docker 的使用流程。
4.1 案例 1:运行一个 Nginx 容器(静态网页服务)
Nginx 是常用的 Web 服务器,通过 Docker 运行 Nginx 仅需 3 步:
拉取 Nginx 镜像:
docker pull nginx:1.24 # 拉取1.24稳定版镜像
创建并启动 Nginx 容器:
docker run -d
–name my-nginx \ # 给容器命名为my-nginx
-p 8080:80 \ # 端口映射:宿主机8080端口 → 容器80端口
-v /home/user/nginx/html:/usr/share/nginx/html \ # 数据卷挂载:宿主机目录→容器静态文件目录
nginx:1.24
解释:-v参数用于 “数据卷挂载”,这样我们修改宿主机/home/user/nginx/html目录下的文件,就能实时同步到容器中,无需进入容器修改。
验证服务:
在宿主机浏览器中访问http://localhost:8080(Windows/macOS)或http://服务器IP:8080(Linux),若显示 Nginx 默认页面,则运行成功;
在宿主机/home/user/nginx/html目录下创建index.html文件(内容如
Hello Docker Nginx!
),刷新浏览器,页面会同步更新。4.2 案例 2:用 Docker Compose 管理多容器应用(Nginx+MySQL+PHP)
当应用需要多个容器配合时(如 Web 服务 + 数据库),手动启动每个容器并配置网络会很繁琐,此时可使用Docker Compose(Docker 官方的多容器管理工具),通过一个docker-compose.yml文件定义所有容器的配置,实现 “一键启动”。
步骤 1:安装 Docker Compose
Windows/macOS:安装 Docker Desktop 时已自带 Docker Compose,无需额外安装;
Linux:执行以下命令安装(以 v2.25.0 版本为例):
sudo curl -L “https://github.com/docker/compose/releases/download/v2.25.0/docker-compose-(uname−s)−(uname -s)-(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose # 赋予执行权限
docker-compose --version # 验证安装,显示版本即成功
步骤 2:编写docker-compose.yml文件
创建一个项目目录(如php-web),在目录中创建docker-compose.yml文件,内容如下:
version: ‘3.8’ # Docker Compose版本
services:
Nginx服务
nginx:
image: nginx:1.24
container_name: php-nginx
ports:
- “80:80” # 宿主机80端口→容器80端口
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # 挂载Nginx配置文件
- ./php/www:/var/www/html # 挂载PHP项目文件
depends_on:
- php # 依赖php服务,确保php先启动
networks:
- php-web-net # 加入自定义网络
PHP服务
php:
image: php:8.2-fpm # PHP-FPM镜像(用于处理PHP代码)
container_name: php-fpm
volumes:
- ./php/www:/var/www/html # 挂载PHP项目文件
depends_on:
- mysql # 依赖mysql服务
networks:
- php-web-net
MySQL服务
mysql:
image: mysql:8.0
container_name: php-mysql
ports:
- “3306:3306” # 宿主机3306端口→容器3306端口
environment:
MYSQL_ROOT_PASSWORD: 123456 # 数据库root密码
MYSQL_DATABASE: php_db # 自动创建的数据库名
MYSQL_USER: php_user # 自动创建的用户
MYSQL_PASSWORD: php_pass # 用户密码
volumes:
- mysql-data:/var/lib/mysql # 挂载MySQL数据卷(持久化数据)
networks:
- php-web-net
自定义网络(让服务间可通过服务名通信,如php服务可通过mysql:3306访问数据库)
networks:
php-web-net:
driver: bridge
数据卷(用于持久化MySQL数据,容器删除后数据不丢失)
volumes:
mysql-data:
步骤 3:准备配置文件和项目代码
创建 Nginx 配置文件:在php-web目录下创建nginx/conf.d/default.conf,内容如下(配置 Nginx 转发 PHP 请求到 PHP-FPM):
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
# 处理PHP请求
location ~ \.php$ {
fastcgi_pass php:9000; # 转发到php服务的9000端口(PHP-FPM默认端口)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
创建 PHP 测试文件:在php-web目录下创建php/www/index.php,内容如下(连接 MySQL 并输出信息):
<?php $servername = "mysql"; // 对应docker-compose.yml中的mysql服务名 $username = "php_user"; $password = "php_pass"; $dbname = "php_db"; // 连接MySQL $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "MySQL连接成功!"; // 输出PHP信息 phpinfo(); ?>
步骤 4:启动多容器应用
在php-web目录下执行命令:
docker-compose up -d # -d表示后台启动所有服务
查看服务状态:docker-compose ps,若所有服务的 “State” 为 “Up”,则启动成功;
访问测试:在浏览器中访问http://localhost(或服务器 IP),若显示 “MySQL 连接成功” 和 PHP 信息页,则应用正常运行。
步骤 5:常用 Docker Compose 命令
停止服务:docker-compose down(停止并删除容器,数据卷不会删除);
重启服务:docker-compose restart;
查看日志:docker-compose logs -f(-f 表示实时查看);
进入容器:docker-compose exec php /bin/bash(进入 php 服务的容器)。
更多推荐



所有评论(0)