🐳 Docker & Docker Compose 全攻略:从入门到实战
在现代软件开发中,**Docker** 已经成为了不可或缺的工具。无论你是后端开发、前端开发还是运维工程师,掌握 Docker 都能极大地提升你的开发效率和部署体验。
本文将带你从零开始,完成 Docker 的安装、基础命令的使用,并深入讲解如何使用 Docker Compose 来编排复杂的应用。
1. 为什么选择 Docker?
简单来说,Docker 解决了 "在我的机器上能跑,但在服务器上跑不起来" 的千古难题。
一致性:Docker 镜像包含了应用运行所需的一切(代码、运行时、库、环境变量),保证了开发、测试、生产环境的高度一致。
轻量级:相比于虚拟机(VM),Docker 容器共用宿主机内核,启动秒级,资源占用少。
隔离性:每个容器之间相互隔离,互不影响。
2. Docker 安装指南
Linux (以 Ubuntu 为例)
在 Linux 服务器上,我们推荐使用官方仓库进行安装。
1. 卸载旧版本(如果有):
sudo apt-get remove docker docker-engine docker.io containerd runc2. 更新 apt 包索引并安装依赖:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg3. 添加 Docker 官方 GPG 密钥:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg4. 设置仓库并安装:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin5. 验证安装:
sudo docker run hello-world🔥 小贴士:免 Sudo 使用 Docker
默认情况下运行 docker 需要 sudo,非常麻烦。执行以下命令将当前用户加入 docker 组:
sudo usermod -aG docker $USER
newgrp dockerWindows / macOS
直接下载 [Docker Desktop](https://www.docker.com/products/docker-desktop/) 安装包,傻瓜式安装即可。它集成了图形化界面、Kubernetes 和 Docker Compose,非常适合本地开发。
3. Docker 核心概念与基础命令
核心概念
镜像 (Image):类似于操作系统的安装光盘(ISO),是一个只读的模板。
容器 (Container):镜像运行后的实例。如果镜像是“类(Class)”,容器就是“对象(Object)”。
仓库 (Repository):存放镜像的地方,最著名的是 [Docker Hub](https://hub.docker.com)。
常用命令速查
1. 镜像管理
# 拉取镜像 (从 Docker Hub 下载)
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx2. 容器生命周期 (核心)
# 启动容器
# -d: 后台运行 (Detached)
# -p: 端口映射 (宿主机端口:容器端口)
# --name: 给容器起个名字
docker run -d -p 8080:80 --name my-web nginx
# 查看正在运行的容器
docker ps
# 查看所有容器 (包括已停止的)
docker ps -a
# 停止容器
docker stop my-web
# 启动已停止的容器
docker start my-web
# 删除容器 (必须先停止)
docker rm my-web
# 强制删除正在运行的容器
docker rm -f my-web3. 进入容器与日志
# 查看容器日志 (排错必备)
docker logs -f my-web
# 进入容器内部执行命令 (例如进入 bash)
docker exec -it my-web bash
# 如果是 Alpine 系统的镜像,可能需要用 sh
# docker exec -it my-web sh4. Docker Compose 详解与实战
当你的应用不仅仅是一个 Nginx,而是由 Web 服务 + 数据库 + 缓存 组成时,使用 docker run 一个个启动太累了,而且难以维护网络连接。
Docker Compose 允许你通过一个 docker-compose.yml 文件定义多个容器,然后一键启动。
注意:新版 Docker 已经集成了 Compose,命令是
docker compose(中间有空格);旧版独立安装的命令是docker-compose(有横杠)。
实战:部署一个 WordPress + MySQL
我们将创建一个博客系统来演示。在任意目录下新建文件 docker-compose.yml。
docker-compose.yml 文件内容
version: '3.8' # 指定版本,通常用 3.x
services:
# 服务 1: 数据库
db:
image: mysql:5.7
container_name: wp-mysql
restart: always # 容器挂了自动重启
environment: # 设置环境变量
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes: # 数据持久化挂载
- db_data:/var/lib/mysql
# 服务 2: WordPress
wordpress:
image: wordpress:latest
container_name: wp-app
depends_on: # 依赖关系:db 启动后才启动 wordpress
- db
ports:
- "8000:80" # 访问本机 8000 端口 -> 容器 80 端口
restart: always
environment:
WORDPRESS_DB_HOST: db:3306 # 注意这里直接写服务名 'db'
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
# 定义顶层卷 (用于数据持久化)
volumes:
db_data:
wp_data:关键字段解析
1. services: 定义应用包含的一组服务。
2. image: 指定使用哪个镜像。
3. ports: 端口映射,格式为 "宿主机端口:容器端口"。
4. environment: 传递环境变量,这是容器配置的主要方式。
5. volumes: 数据持久化。如果不写这一项,删除容器后数据库数据就会丢失!
写法
宿主机路径:容器路径(Bind Mount)写法
卷名:容器路径(Volume,如上例所示,由 Docker 管理)
6. networks(隐式): Docker Compose 会自动创建一个默认网络,服务之间可以通过 服务名 (如 db) 直接互相访问,无需关心 IP 地址。
常用 Compose 命令
在 docker-compose.yml 所在的目录下执行:
# 1. 启动所有服务 (后台模式)
docker compose up -d
# 2. 查看服务状态
docker compose ps
# 3. 查看所有服务的实时日志
docker compose logs -f
# 4. 停止并删除容器、网络 (保留数据卷)
docker compose down
# 5. 停止并删除容器,同时删除数据卷 (慎用!数据会丢)
docker compose down -v启动成功后,浏览器访问 http://localhost:8000,你就能看到 WordPress 的安装界面了!
5. 总结
Docker 让你不再为环境配置发愁,`docker run` 走天下。
Docker Compose 是多容器管理的利器,通过 YAML 文件定义一切,实现了“基础设施即代码”。
学习路径:先熟悉
pull/run/ps/logs,再掌握volumes(数据卷) 和bind mounts(挂载目录),最后熟练编写docker-compose.yml。
希望这篇指南能帮你快速上手 Docker!如果你在实践中遇到问题,欢迎在评论区留言讨论。🚀