Appearance
Docker 入门指南
环境准备
在开始使用 Docker 之前,需要确保系统满足以下要求:
系统要求
- Windows: Windows 10 64位: Pro, Enterprise, or Education (Build 15063 or later)
- macOS: macOS 10.13 或更高版本
- Linux: 内核版本 3.10 或更高
安装 Docker
Windows/macOS
- 访问 Docker 官网
- 下载 Docker Desktop
- 运行安装程序并按照提示完成安装
- 启动 Docker Desktop
Linux (Ubuntu)
bash
# 更新包索引
sudo apt-get update
# 安装 Docker
sudo apt-get install docker.io
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户添加到 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
验证安装:
bash
docker --version
docker run hello-world
基本概念
镜像 (Image)
Docker 镜像是一个只读模板,包含运行应用程序所需的所有内容。
容器 (Container)
容器是镜像的运行实例,可以被启动、停止、移动和删除。
仓库 (Repository)
仓库是存储和分发镜像的服务。
第一个 Docker 应用
1. 创建简单的 Node.js 应用
创建项目目录:
bash
mkdir my-node-app
cd my-node-app
创建 package.json:
json
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js app",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.0"
}
}
创建 index.js:
javascript
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello Docker!');
});
app.get('/health', (req, res) => {
res.json({ status: 'OK', timestamp: new Date().toISOString() });
});
app.listen(port, '0.0.0.0', () => {
console.log(`App running at http://localhost:${port}`);
});
2. 创建 Dockerfile
创建 Dockerfile:
docker
# 使用官方 Node.js 16 Alpine 镜像作为基础镜像
FROM node:16-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json (如果存在)
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 定义容器启动时执行的命令
CMD ["npm", "start"]
3. 构建和运行
构建镜像:
bash
# 构建镜像,指定标签为 my-node-app:latest
docker build -t my-node-app:latest .
运行容器:
bash
# 运行容器,将本地端口 3000 映射到容器端口 3000
docker run -p 3000:3000 my-node-app:latest
在浏览器中访问 http://localhost:3000,应该能看到 "Hello Docker!"。
常用命令详解
镜像管理命令
bash
# 查看所有镜像
docker images
# 拉取镜像
docker pull nginx
# 删除镜像
docker rmi nginx
# 构建镜像
docker build -t app-name:tag .
# 查看镜像历史
docker history image-name
# 查看镜像详细信息
docker inspect image-name
容器管理命令
bash
# 运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 常用选项:
# -d: 后台运行
# -p: 端口映射
# -v: 卷挂载
# --name: 指定容器名称
# -e: 设置环境变量
# 示例
docker run -d -p 8080:80 --name my-nginx nginx
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 停止容器
docker stop container-name
# 启动容器
docker start container-name
# 重启容器
docker restart container-name
# 删除容器
docker rm container-name
# 强制删除运行中的容器
docker rm -f container-name
# 查看容器日志
docker logs container-name
# 实时查看容器日志
docker logs -f container-name
# 进入运行中的容器
docker exec -it container-name /bin/bash
# 查看容器详细信息
docker inspect container-name
# 查看容器资源使用情况
docker stats container-name
实用示例
运行一个 Nginx 服务器
bash
# 拉取并运行 Nginx
docker run -d -p 8080:80 --name my-nginx nginx
# 访问 http://localhost:8080
运行一个数据库
bash
# 运行 MySQL
docker run -d -p 3306:3306 --name mysql-db -e MYSQL_ROOT_PASSWORD=mypassword mysql:8.0
# 运行 Redis
docker run -d -p 6379:6379 --name my-redis redis:alpine
Dockerfile 详解
基本指令
docker
# 指定基础镜像
FROM node:16-alpine
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000
# 设置工作目录
WORKDIR /app
# 复制文件
COPY package*.json ./
COPY . .
# 执行命令
RUN npm install
RUN mkdir -p /app/logs
# 暴露端口
EXPOSE 3000
# 添加用户(安全考虑)
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
# 设置卷
VOLUME ["/app/logs"]
# 定义容器启动命令
CMD ["npm", "start"]
# 或者使用 ENTRYPOINT
ENTRYPOINT ["node", "server.js"]
最佳实践
1. 多阶段构建
docker
# 构建阶段
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM node:16-alpine AS runner
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]
2. 使用 .dockerignore
创建 .dockerignore 文件:
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.env
.vscode
Docker Compose 入门
Docker Compose 用于定义和运行多容器的 Docker 应用。
安装 Docker Compose
Docker Desktop 已包含 Docker Compose。在 Linux 上:
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose.yml 示例
创建 docker-compose.yml:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
volumes:
- .:/app
- /app/node_modules
depends_on:
- redis
- db
redis:
image: redis:alpine
ports:
- "6379:6379"
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
常用 Docker Compose 命令
bash
# 构建并启动所有服务
docker-compose up
# 后台运行
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs
# 实时查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重新构建并启动
docker-compose up --build
# 只启动特定服务
docker-compose up web
# 扩展服务实例
docker-compose up --scale web=3
实践项目:部署一个完整的应用
项目结构
my-fullstack-app/
├── frontend/
│ ├── Dockerfile
│ ├── package.json
│ └── src/
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ └── src/
├── nginx/
│ └── nginx.conf
└── docker-compose.yml
后端 Dockerfile
docker
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3001
CMD ["npm", "start"]
前端 Dockerfile
docker
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
docker-compose.yml
yaml
version: '3.8'
services:
backend:
build: ./backend
ports:
- "3001:3001"
environment:
- DB_HOST=db
- REDIS_HOST=redis
depends_on:
- db
- redis
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:alpine
volumes:
postgres_data:
启动应用:
bash
docker-compose up --build
故障排除
常见问题
1. 容器无法启动
bash
# 查看容器日志
docker logs container-name
# 检查容器状态
docker inspect container-name
2. 端口冲突
bash
# 查看端口使用情况
docker port container-name
# 使用不同的端口映射
docker run -p 8080:80 image-name
3. 网络问题
bash
# 查看网络
docker network ls
# 创建自定义网络
docker network create my-network
# 在网络中运行容器
docker run --network my-network image-name
总结
通过本指南,您已经学会了:
- Docker 的基本概念和安装
- 创建和运行第一个 Docker 应用
- 编写 Dockerfile
- 使用 Docker Compose 管理多容器应用
- 常用的 Docker 命令
Docker 是现代应用开发和部署的重要工具,掌握它将大大提高您的开发效率和应用的可移植性。