别再被环境折腾了,一文讲透 Docker 容器化,从零到部署实战

做开发这几年,最大的感受就是环境配置太折腾人了。换台电脑、换个服务器,光是把 Java、Python、Node 这些环境搭起来就得耗上半天,更别提各种依赖版本冲突带来的“灵异事件”。直到我彻底拥抱了 Docker 容器化,才觉得自己的开发生涯终于“清爽”了。

这篇文章,笔者(我们习惯叫自己“站长”)想用最接地气的方式,把 Docker 容器化这件事给你掰开揉碎了讲清楚。不整那些虚头巴脑的理论,直接上干货,让你看完就能上手用。

一、Docker 到底是什么?为什么大家都在用它?

💡 推荐阅读:别再被参数表忽悠了!云服务器选购,看懂这6个核心参数才算真行家

简单来说,Docker 就是一个“轻量级的虚拟机”,但它比虚拟机更聪明、更省资源。它把你的应用以及应用运行所需的所有依赖(代码、运行时、系统工具、库、设置)打包成一个标准化的单元,这个单元就叫镜像(Image)。镜像运行起来,就是一个容器(Container)

你可以把镜像理解成一个“菜谱”,容器就是按照这个菜谱做出来的“菜”。不管你在哪里炒菜(开发机、测试机、生产服务器),只要按照这个菜谱来,做出来的味道(运行结果)绝对一模一样。

它的核心优势非常直观:

  • 环境隔离:你的应用和数据库、缓存服务互相不干扰,A 项目用 Python 2,B 项目用 Python 3,两者互不打架。
  • 一次构建,到处运行:这是最爽的一点。在本地跑通的容器,扔到云服务器上,docker run 一下,直接就能跑起来,彻底告别“在我电脑上是好的啊”这种尴尬。
  • 秒级启动:相比于虚拟机启动要几十秒甚至几分钟,容器因为共享宿主机内核,启动速度是毫秒级的。
  • 极致利用资源:容器占用的空间很小,一台 2核4G 的云服务器,跑十几个容器毫无压力。

二、核心概念扫盲:镜像、容器、仓库

💡 延伸阅读:Linux服务器从裸机到安全加固:一份能直接照着做的实战配置手册

刚开始接触 Docker 的人,最容易把这三个概念搞混。咱们用大白话捋一遍:

概念 类比 说明
镜像 (Image) 类 / 安装包 只读的模板,包含了运行应用所需的一切。比如 nginx:latest 就是一个装好了 Nginx 服务的镜像。
容器 (Container) 实例 / 运行中的程序 镜像运行起来后的实体。你可以对容器进行启动、停止、删除等操作。同一个镜像可以创建多个容器。
仓库 (Registry) 代码仓库 (GitHub) 用来存放镜像的地方。最著名的就是 Docker Hub,我们可以在上面拉取(pull)别人做好的镜像,也可以推送(push)自己的镜像。

三、动手实操:从安装到运行第一个容器

光说不练假把式。下面我们以 Linux 服务器(CentOS 7 或 Ubuntu 20.04 以上)为例,带大家走一遍完整流程。

1. 安装 Docker 引擎

如果你用的是云服务器(站长建议选择靠谱的云厂商),执行以下命令即可一键安装(以 CentOS 为例):

# 卸载旧版本(如果有)
sudo yum remove docker docker-common docker-selinux docker-engine

# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 官方源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
sudo yum install -y docker-ce

# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 查看版本,验证安装成功
docker version

2. 换源加速(国内用户必看)

由于网络原因,直接从 Docker Hub 拉取镜像可能会很慢。我们需要配置国内镜像加速器。编辑配置文件:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF

# 重启 Docker 使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

3. 部署一个 Nginx 网站

这算是 Docker 世界的“Hello World”。我们直接拉取官方的 Nginx 镜像并运行:

# 拉取镜像
docker pull nginx:latest

# 运行容器
# -d 表示后台运行
# --name 给容器起个名字
# -p 8080:80 将服务器的 8080 端口映射到容器的 80 端口
docker run -d --name my-web -p 8080:80 nginx:latest

# 查看运行中的容器
docker ps

现在,在浏览器里访问 http://你的服务器IP:8080,如果能看到 Nginx 的欢迎页,恭喜你,你的第一个容器就跑起来了!

四、进阶实战:容器化部署一个 Python Web 应用

光跑个现成的 Nginx 不过瘾,我们来写一个简单的 Python Flask 应用,然后用 Docker 把它“容器化”。

1. 准备项目文件

创建一个项目目录,里面放两个文件:

mkdir my-flask-app
cd my-flask-app

第一个文件 app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Docker Container! - 站长"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

第二个文件 requirements.txt

Flask==3.0.0

2. 编写 Dockerfile(构建镜像的蓝图)

这是容器化的核心文件,告诉 Docker 如何一步步构建镜像。

# 基于 Python 3.11 的官方镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 将当前目录下的 requirements.txt 复制到容器中
COPY requirements.txt .

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

# 将当前目录下的所有文件复制到容器中
COPY . .

# 声明容器运行时监听的端口
EXPOSE 5000

# 指定容器启动时运行的命令
CMD ["python", "app.py"]

3. 构建并运行

# 构建镜像,-t 是给镜像打标签
docker build -t my-flask-app:v1 .

# 运行容器
docker run -d -p 5000:5000 --name flask-app my-flask-app:v1

# 测试
curl http://localhost:5000

看到 Hello from Docker Container! 的输出,说明你的 Python 应用已经成功跑在容器里了。

五、容器化落地:Docker Compose 编排多容器

真实项目往往不止一个服务,比如一个 Web 应用需要搭配 MySQL 和 Redis。这时候手动一个个 docker run 就太累了。我们需要用 Docker Compose 来一键启动所有服务。

1. 编写 docker-compose.yml

version: '3.8'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
      - redis
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
    volumes:
      - db_data:/var/lib/mysql
  redis:
    image: redis:7-alpine

volumes:
  db_data:

2. 一键启动

# 启动所有服务(-d 后台运行)
docker-compose up -d

# 查看状态
docker-compose ps

# 查看日志
docker-compose logs -f web

# 停止所有服务
docker-compose down

有了 Compose,我们只需要一条命令,就能把整个项目环境跑起来,团队协作时效率直接拉满。

六、给新手的避坑指南与建议

最后,站长结合自己的实战经验,分享几个新手容易踩的坑:

  • 不要把数据存在容器里:容器一旦删除,里面的数据就没了。一定要通过 -v 参数或 volumes 将数据挂载到宿主机。
  • 注意时区问题:默认容器是 UTC 时区,如果应用有日志或定时任务,记得在 Dockerfile 里加上 ENV TZ=Asia/Shanghai
  • 镜像标签别用 latest:在正式环境,尽量使用具体的版本号(如 nginx:1.25.3),避免因 latest 变动导致环境不一致。
  • 学会看日志:排查问题第一件事就是 docker logs 容器名,这比进入容器内部瞎猜高效得多。

容器化这条路,走进去就会发现新世界。它彻底解决了环境配置的痛点,也让我们的应用交付变得更加标准化、自动化。如果你正在为部署环境头疼,不妨从今天开始,试着把你手头的项目容器化。顺便提一句,玩 Docker 对服务器配置有一定要求,如果你还没有一台趁手的云服务器,建议选择正规云厂商的 2核4G 以上配置,跑起来会更从容。

希望这篇文章能帮到你,我们下期见。

延伸阅读

💡 【高性价比独享云服务器限时 1 折起】

新手搭建网站或部署容器,推荐选择高性价比独享云服务器。点击下方通道可享受限时折扣与专属优惠券:

👉 点此前往领取云服务器限时优惠券

🎁 全套实操配置文件与 AI 提效资料包免费下载

本文涉及的全套 Docker Compose 配置文件、服务器运维避坑手册及 AI 提效指令库已完整打包上传至夸克网盘,可直接免费极速转存:

👉 点击前往夸克网盘免费极速转存获取

💡 提示:推荐使用手机【夸克网盘 App】打开保存,新用户首月免费赠送 1TB 超大空间与免流量极速下载特权。

滚动至顶部