Docker入门篇

Docker入门篇:容器化你的第一个应用


一、容器技术革命

1. 传统部署痛点

  • 环境差异:"在我机器上能运行"的经典问题

  • 资源浪费:虚拟机独占完整操作系统

  • 部署缓慢:从代码到上线的漫长流程

2. 容器 vs 虚拟机

graph LR
A[物理机] --> B((Hypervisor))
B --> C[虚拟机1]
B --> D[虚拟机2]
C --> E[App A + OS]
D --> F[App B + OS]

A --> G[Docker Engine]
G --> H[容器A (App+依赖)]
G --> I[容器B (App+依赖)]
特性 虚拟机 Docker容器
启动速度 分钟级 秒级
资源占用 GB级 MB级
隔离性 进程级
镜像大小 通常>1GB 可<10MB

二、环境搭建(Windows/macOS/Linux通用)

1. 安装Docker Desktop

  • 官网下载

  • 验证安装:

    docker --version
    docker run hello-world

2. 配置镜像加速(解决国内拉取慢问题)

// Docker Desktop -> Settings -> Docker Engine
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

三、核心概念三要素

1. 镜像(Image)

  • 只读模板:包含应用程序及其运行环境

  • 分层存储:每层都是前一层的变化增量

2. 容器(Container)

  • 镜像的运行实例:包含可写层

  • 生命周期管理:创建/启动/停止/删除

3. 仓库(Registry)

  • Docker Hub:官方镜像仓库(类似GitHub)

  • 私有仓库:企业自建镜像存储


四、实战演练:容器化Node.js应用

1. 创建项目文件

mkdir myapp && cd myapp
npm init -y
npm install express
// app.js
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello Docker!'))
app.listen(3000, () => console.log('App running on port 3000'))

2. 编写Dockerfile

# 基础镜像
FROM node:14-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制源代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "app.js"]

3. 构建与运行

# 构建镜像(注意最后的点)
docker build -t my-node-app .

# 运行容器
docker run -d -p 4000:3000 --name myapp my-node-app

访问 http://localhost:4000 查看运行结果


五、常用命令速查表

命令 作用
docker ps -a 查看所有容器(含已停止)
docker images 列出本地镜像
docker exec -it [容器ID] bash 进入运行中的容器
docker logs [容器ID] 查看容器日志
docker stop $(docker ps -aq) 停止所有运行中的容器
docker system prune 清理无用镜像/容器/网络

六、进阶技巧

1. 容器数据持久化

# 挂载主机目录到容器
docker run -v /host/path:/container/path ...

# 使用命名卷
docker volume create my-vol
docker run -v my-vol:/container/path ...

2. Docker Compose编排

# docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - "4000:3000"
  redis:
    image: "redis:alpine"

启动服务:docker-compose up -d


七、常见问题排雷

  1. 权限拒绝错误

    # 解决Linux下权限问题
    sudo groupadd docker
    sudo usermod -aG docker $USER
  2. 镜像构建缓存问题

    # 强制重建所有层
    docker build --no-cache -t myapp .
  3. 容器时区设置

    # 在Dockerfile中添加
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime

八、学习路线推荐

  1. 基础阶段:掌握镜像构建与容器操作

  2. 进阶阶段:学习网络配置与存储管理

  3. 生产实践:了解Swarm/Kubernetes编排

  4. 最佳实践:优化Dockerfile(多阶段构建等)


动手实验:尝试将你的Spring Boot项目容器化,并推送到Docker Hub仓库。思考以下问题:

  • 如何减少镜像体积?

  • 怎样处理应用配置文件?

  • 多个容器如何通信?

你可能感兴趣的:(docker,容器,运维)