ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Docker教程从入门到精通(0基础)

2026/8/5 8:47:10 拓冰建站 浏览量
Docker教程从入门到精通(0基础) 第一部分核心概念与原理1.1 什么是容器为什么需要它简单来说容器就是将应用及其所有依赖如库、配置文件等打包在一起的标准化单元。它解决了环境不一致带来的“在我的机器上能运行在服务器上就不行”的经典难题。容器与虚拟机的关键区别在于虚拟机模拟整个操作系统包括硬件资源占用大启动慢。容器共享宿主机操作系统内核只隔离应用进程轻量、快速启动时间仅秒级。对比维度传统虚拟机Docker 容器启动速度分钟级秒级资源占用几个GB几十MB隔离性强隔离完全虚拟化进程级隔离内核每个VM有独立内核共享宿主机内核1.2 Docker的三大核心组件理解Docker关键是记住这三个“零件”镜像Image一个只读的模板好比是安装程序的“快照”。它包含了运行一个应用所需的一切。容器Container从镜像运行起来的实例。你可以把它看作是一个“轻量级的虚拟机”可以被启动、停止、删除。仓库Repository集中存放镜像的地方。最著名的是官方的Docker Hub你可以从那里拉取pull镜像也可以推送push自己的镜像。1.3 Docker是如何工作的Docker利用了Linux内核的底层技术来实现隔离和资源控制Namespace命名空间为容器创建独立的“视图”让容器内的进程“看”不到也影响不了宿主机或其他容器实现了隔离。Cgroups控制组限制一个容器可以使用的CPU、内存等资源防止某个容器耗尽宿主机资源实现了资源限制。Union File System联合文件系统允许镜像分层构建使镜像更轻量、传输更快。️ 第二部分安装与环境配置2.1 Linux安装以CentOS为例卸载旧版本如果有sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine [citation:9]安装依赖并添加Docker官方仓库bash sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo [citation:9]安装Docker引擎bash sudo yum install -y docker-ce docker-ce-cli containerd.io [citation:9]启动Docker并设置开机自启bash sudo systemctl start docker sudo systemctl enable docker [citation:9]验证安装bash sudo docker run hello-world看到欢迎信息即为成功。可选让普通用户不用sudo运行dockerbash sudo groupadd docker sudo usermod -aG docker $USER newgrp docker [citation:5][citation:9]2.2 配置镜像加速器国内必备由于网络原因直接拉取镜像可能很慢需要配置国内加速器。创建或修改/etc/docker/daemon.json文件json { registry-mirrors: [https://registry.docker-cn.com] }保存后重启Docker服务sudo systemctl restart docker。⌨️ 第三部分核心命令实战Docker的大部分操作都通过命令行CLI完成掌握以下几组命令就掌握了80%的日常操作。3.1 镜像管理对“模板”的操作命令说明示例docker pull从仓库拉取镜像docker pull nginx:latestdocker images列出本地所有镜像docker imagesdocker rmi删除指定镜像docker rmi IMAGE_IDdocker tag给镜像打标签通常用于版本管理或推送到私有仓库docker tag nginx:latest myrepo/nginx:v1docker build根据Dockerfile构建镜像docker build -t my-app .3.2 容器生命周期管理对“实例”的操作命令说明示例docker run最核心的命令创建并启动一个容器docker run -d --name web -p 80:80 nginxdocker ps列出当前正在运行的容器docker psdocker ps -a列出所有容器包括已停止的docker ps -adocker stop停止一个运行中的容器docker stop webdocker start启动一个已停止的容器docker start webdocker restart重启容器docker restart webdocker rm删除一个已停止的容器docker rm webdocker exec进入正在运行的容器执行命令常用于调试docker exec -it web /bin/bashdocker logs查看容器的输出日志docker logs -f webdocker run常用参数详解bash docker run -d \ # -d: 后台运行detach --name web \ # 给容器起个名字 -p 8080:80 \ # 端口映射宿主机的8080映射到容器内的80 -v /data:/usr/share/nginx/html \ # 数据卷挂载将宿主机目录挂载到容器内 -e MYSQL_PASSWORD123 \ # 设置环境变量 --restartalways \ # 自动重启策略 nginx:latest # 使用的镜像名和标签 [citation:9]3.3 常用辅助命令docker stats实时查看所有容器的资源占用CPU、内存等。docker inspect查看一个容器或镜像的详细配置信息IP地址、挂载卷等。docker system df查看Docker占用的磁盘空间情况。docker network ls列出Docker的网络环境。docker volume ls列出数据卷列表。 第四部分使用Dockerfile定制镜像Dockerfile是一个文本文件包含了构建镜像所需的全部指令。通过它你可以将应用容器化实现环境一致性。4.1 基本结构与指令以一个Python Flask应用为例Dockerfile可以这样写dockerfile # 1. 指定基础镜像Base Image FROM python:3.11-slim # 2. 设置环境变量 ENV PYTHONDONTWRITEBYTECODE1 \ PYTHONUNBUFFERED1 # 3. 设置工作目录 WORKDIR /app # 4. 先复制依赖文件利用Docker缓存提高构建效率 COPY requirements.txt . # 5. 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 6. 复制应用代码 COPY . . # 7. 创建并使用非root用户运行提高安全性 RUN adduser --disabled-password --gecos appuser USER appuser # 8. 声明容器运行时监听的端口 EXPOSE 5000 # 9. 指定容器启动时运行的命令 CMD [python, app.py] [citation:6]4.2 多阶段构建优化镜像大小多阶段构建可以在一个Dockerfile中使用多个FROM指令最终只将必要的运行文件复制到最终镜像从而极大减小体积。这对于编译型语言如Java、Go、Rust特别有用。以Rust应用为例 dockerfile # 阶段1构建阶段 FROM rust:1.75-slim AS builder WORKDIR /app COPY . . RUN cargo build --release # 阶段2运行阶段 FROM alpine:latest WORKDIR /app # 只从构建阶段复制编译好的二进制文件 COPY --frombuilder /app/target/release/myapp . CMD [./myapp] [citation:6] 第五部分数据持久化Volumes容器是“无状态”的容器一旦删除内部的数据也会丢失。为了持久化数据如数据库文件需要将数据存储在容器外部。Docker提供了三种方式Volume数据卷由Docker管理存储在宿主机特定目录下。最推荐的生产环境方式。Bind Mount挂载宿主目录直接将宿主机上的某个目录挂载到容器内。非常适合开发环境因为代码更改可以实时反映在容器内。tmpfs Mount数据存储在宿主机内存中不会持久化到磁盘。用于存放临时敏感信息。例子使用具名Volume运行MySQLbash docker volume create mysql-data docker run -d --name mysql-db \ -e MYSQL_ROOT_PASSWORD123456 \ -v mysql-data:/var/lib/mysql \ mysql:8.0 [citation:6][citation:9]即使删除了容器mysql-data卷中的数据依然安全。 第六部分网络配置Docker容器需要与外界或容器间通信主要网络模式如下Bridge桥接模式Docker默认模式。容器连接到虚拟网桥docker0上通过NAT端口映射-p访问外部。适合单机容器通信。Host主机模式容器直接使用宿主机的网络栈性能最好但失去了网络隔离性。None无网络模式容器有自己的Network Namespace但不进行任何网络配置。需要用户手动配置用于高度自定义的场景。自定义Bridge网络强烈推荐它提供了内置DNS解析容器之间可以通过容器名直接通信。bash # 创建自定义网络 docker network create my-net # 运行容器并连接到该网络 docker run -d --name web --network my-net nginx docker run -d --name app --network my-net my-app # app容器中可以直接通过 ping web 来访问nginx容器 [citation:5][citation:12] 第七部分多容器编排Docker Compose微服务通常由多个容器组成如App、MySQL、Redis。docker-compose.yml文件允许你定义和运行多个容器作为一个项目。实战示例部署Spring Boot MySQL Redisyaml # docker-compose.yml version: 3.8 services: mysql: image: mysql:8.0 container_name: mysql-db environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: demo_db ports: - 3306:3306 volumes: - mysql-data:/var/lib/mysql redis: image: redis:alpine container_name: redis-cache ports: - 6379:6379 app: build: ./app # 从当前目录的Dockerfile构建 container_name: springboot-app depends_on: - mysql - redis environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demo_db?useSSLfalse SPRING_REDIS_HOST: redis ports: - 8080:8080 volumes: mysql-data: [citation:10]常用Compose命令docker-compose up -d在后台启动所有服务。docker-compose down停止并移除所有容器、网络。docker-compose logs -f查看聚合日志。