Docker 入门指南:从零开始掌握容器化技术 一、什么是 Docker为什么要学它想象一下这个场景你在本地写好的代码跑得顺顺当当推到服务器上就各种报错——“在我电脑上明明是好的啊”这话是不是特别耳熟Docker 就是来解决这个问题的。它是一个开源的容器化平台能把你写的应用程序和它所依赖的一切代码、运行时、系统工具、库等打包成一个独立的容器实现“一次构建到处运行”。与传统虚拟机相比Docker 容器有三大核心优势轻量高效容器共享宿主机内核启动速度是毫秒级单台机器可以同时运行数百个容器。环境一致开发、测试、生产环境完全统一部署故障率可下降 80%以上。快速部署秒级启动容器配合 CI/CD 流程构建到部署周期从几十分钟缩短到几分钟。听起来不错吧别急咱们先从三个最核心的概念入手。二、核心概念镜像、容器、仓库要搞懂 Docker记住三个词就够了镜像、容器、仓库。1. 镜像Image—— 应用的“安装包”镜像是一个只读的模板里面打包了运行一个应用所需要的全部东西。打个比方镜像就像一张食谱纸上写好了需要什么材料、怎么做但食谱本身不能吃。你要想吃上这道菜还得照着食谱实际操作一番。查看本地镜像用docker images拉取镜像用docker pull nginx。2. 容器Container—— 运行起来的“实例”容器是镜像的运行实例。照着食谱做出来的那道菜就是容器。你可以照着同一张食谱做出一盘、两盘、十盘菜每一盘都是独立的吃光这一盘不影响那一盘。容器也一样基于同一个镜像可以启动任意多个独立的容器实例。常用命令docker run -d -p 80:80 --name my-nginx nginx运行容器docker ps查看运行中的容器docker stop my-nginx停止容器docker rm my-nginx删除容器3. 仓库Repository—— 镜像的“应用商店”仓库是专门存放镜像的地方。Docker Hub 是官方公共仓库里面有海量的现成镜像可以直接用像 MySQL、Redis、Nginx 这些一条命令就能拉下来。继续用做菜打比方你想做番茄炒蛋但手头没有食谱那就去超市仓库买一本。超市里什么食谱都有。三者协作关系docker pull从仓库把镜像拉下来 →docker build构建自己的镜像 →docker push把镜像推到仓库分享给别人 →docker run启动容器。三、Docker 安装系统要求64 位系统CPU 支持虚拟化Linux 内核 ≥ 3.10最低配置2GB 内存 20GB 磁盘空间LinuxUbuntu安装bash# 更新包索引 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 - # 添加稳定版仓库 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable # 安装 Docker Engine sudo apt-get update sudo apt-get install docker-ce # 验证安装 docker --version docker run hello-worldWindows / macOS访问 Docker Desktop 官网下载对应安装包双击按照向导安装即可。安装完成后启动 Docker Desktop。国内用户配置镜像加速国内访问 Docker Hub 可能比较慢可以配置国内镜像加速器bashsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://registry.docker-cn.com] } EOF sudo systemctl restart docker四、常用命令速查镜像管理命令作用docker pull nginx:latest拉取镜像docker images查看本地镜像列表docker rmi 镜像ID删除镜像docker build -t myapp:1.0 .从 Dockerfile 构建镜像容器操作命令作用docker run -d -p 8080:80 --name web nginx后台运行容器docker ps查看运行中的容器docker ps -a查看所有容器含已停止docker exec -it web /bin/bash进入容器终端docker logs web查看容器日志docker stop web停止容器docker rm web删除容器五、第一个实战用 Docker 跑一个网页我们来跑一个真正的 Nginx 网页服务器这是最经典的入门案例bash# 拉取 Nginx 镜像 docker pull nginx:latest # 运行容器把宿主机的 8080 端口映射到容器的 80 端口 docker run -d -p 8080:80 --name my-nginx nginx # 验证是否启动成功 curl http://127.0.0.1:8080如果看到 Nginx 的欢迎页面你就成功了如果想把自己写的静态网页放进去可以用数据卷挂载bashdocker run -d -p 8080:80 -v /my-web:/usr/share/nginx/html --name my-site nginx这样只要修改你本地的/my-web目录下的文件容器里的网页就会实时更新。六、Dockerfile定制自己的镜像预置的镜像不够用怎么办自己写一个 Dockerfile 来定制。Dockerfile 是一个文本文件里面写明了镜像构建的每一步。常用指令速查指令作用示例FROM指定基础镜像FROM python:3.11-slimWORKDIR设置工作目录WORKDIR /appCOPY复制文件到镜像COPY . .RUN执行构建命令RUN pip install -r requirements.txtENV设置环境变量ENV NODE_ENVproductionEXPOSE声明端口EXPOSE 80CMD启动命令CMD [python, app.py]完整案例Python 应用创建一个 DockerfiledockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD [python, app.py]然后在同目录下执行bashdocker build -t my-python-app . docker run -d -p 5000:5000 my-python-app几个小技巧多用 .dockerignore像写.gitignore一样把node_modules/、*.log这些无关文件排除掉构建速度会快很多。合并 RUN 指令RUN apt-get update apt-get install -y curl比分开写要好因为每一条RUN都会产生一个新的镜像层合并能减少体积。多阶段构建适合编译型语言把编译环境和运行环境分开最终的镜像体积能小几十倍。七、Docker Compose管理多个容器一个应用往往需要多个服务配合前端、后端、数据库、缓存……一个个手动启动太麻烦了。Docker Compose 就是用来解决这个问题的。使用三步走编写 Dockerfile 定义各个服务编写docker-compose.yml编排所有服务执行docker-compose up一键启动所有服务实战案例WordPress MySQLyamlversion: 3.8 services: wordpress: image: wordpress:latest ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_PASSWORD: example networks: - mynet db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql networks: - mynet volumes: db_data: networks: mynet:启动docker-compose up -d停止并清理docker-compose down所有服务在一个配置文件里定义一条命令全部搞定——这就是 Compose 的魅力。八、搭建自己的小项目完整案例我们来做一个真正“能用得上的”小工具——一个带有管理面板的静态文件服务。需求你想把自己电脑上某个文件夹里的静态文件网页、图片等对外提供服务同时需要一个简单的管理面板来查看访问统计。实现方案用 Nginx 提供静态文件服务用 Redis 存储访问计数用 Python 写一个轻量的统计接口。目录结构如下textmy-webapp/ ├── docker-compose.yml ├── nginx/ │ └── default.conf ├── html/ │ └── index.html └── app/ ├── Dockerfile └── app.py步骤 1写一个简单的统计接口创建app/app.pypythonfrom flask import Flask, jsonify import redis import os app Flask(__name__) r redis.Redis(hostredis, port6379, decode_responsesTrue) app.route(/stats) def stats(): count r.get(page_views) return jsonify({views: int(count) if count else 0}) if __name__ __main__: app.run(host0.0.0.0, port5000)步骤 2写 Flask 服务的 Dockerfile创建app/DockerfiledockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install flask redis COPY . . CMD [python, app.py]步骤 3配置 Nginx 反向代理创建nginx/default.conftextserver { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } location /api/ { proxy_pass http://flask-app:5000/; proxy_set_header Host $host; } }步骤 4编写 docker-compose.ymlyamlversion: 3.8 services: nginx: image: nginx:alpine ports: - 8080:80 volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./html:/usr/share/nginx/html depends_on: - flask-app flask-app: build: ./app depends_on: - redis redis: image: redis:alpine步骤 5启动bashdocker-compose up -d启动后访问http://localhost:8080可以看到静态页面访问http://localhost:8080/api/stats可以看到访问统计。所有服务在后台稳定运行互不干扰随时可以一键停止全部清理。是不是很有成就感这就是 Docker 的魅力——简单、干净、可控。九、常见问题与避坑指南Q1docker run -d 后容器马上就停了容器必须有一个前台进程在跑后台模式启动的容器如果没有持续运行的进程Docker 会认为它完成了任务然后自动停止。解决办法确保容器里有 nginx、mysql 这类长期运行的进程。Q2国内 pull 镜像特别慢配置镜像加速器。阿里云、中科大、网易都提供了免费加速服务。修改/etc/docker/daemon.json添加镜像地址后重启 docker。Q3端口被占用了怎么办改映射端口。比如-p 8081:80把容器 80 端口映射到主机的 8081 端口。Q4容器删了数据也没了容器的数据默认是临时的需要持久化就用数据卷挂载比如-v /host/path:/container/path。十、写在最后Docker 的学习曲线并不陡今天你读完了这篇文章就已经迈出了第一步。建议的学习路径先跑几个简单的容器nginx、redis感受一下动手写一个 Dockerfile把自己的应用打包成镜像用 docker-compose 把前端、后端、数据库串起来云原生时代容器化技术已经成为开发者的必修课。希望这份指南能帮你迈出第一步把“环境差异”这个老大难问题彻底甩在身后。后续可以进一步了解 KubernetesK8s、CI/CD 流水线等进阶内容开启你的云原生之旅。