目录
- Docker 简介
- 安装 Docker
- Docker 核心概念
- 基本 Docker 命令
- Dockerfile 编写
- Docker Compose
- 常用实践技巧
- 故障排除
1. Docker 简介
Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统上。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的优势:
- 更快的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的管理
2. 安装 Docker
在 Ubuntu 上安装 Docker:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| sudo apt-get update
sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
|
在 macOS 上安装 Docker:
下载并安装 Docker Desktop for Mac
在 Windows 上安装 Docker:
下载并安装 Docker Desktop for Windows
3. Docker 核心概念
镜像(Image)
镜像是一个只读模板,包含了运行应用程序所需的所有内容,包括代码、运行时库、环境变量和配置文件等。
容器(Container)
容器是镜像的一个运行实例。可以将其看作是一个简易的 Linux 系统环境。
仓库(Repository)
仓库是集中存放镜像的地方。一个仓库通常包含多个标签(tag)的镜像。
4. 基本 Docker 命令
查看 Docker 版本
查看 Docker 系统信息
搜索镜像
拉取镜像
1 2 3 4 5
| docker pull nginx
docker pull nginx:1.21
|
查看本地镜像
运行容器
1 2 3 4 5 6 7
| docker run --name mynginx -p 8080:80 -d nginx
|
查看正在运行的容器
查看所有容器(包括已停止的)
停止容器
启动已停止的容器
重启容器
删除容器
1 2 3 4 5
| docker rm mynginx
docker container prune
|
删除镜像
1 2 3 4 5
| docker rmi nginx
docker image prune -a
|
进入容器内部
1 2
| docker exec -it mynginx /bin/bash
|
查看容器日志
1 2 3 4 5
| docker logs mynginx
docker logs -f mynginx
|
5. Dockerfile 编写
Dockerfile 是一个文本文件,其中包含了一系列指令,用于定义如何构建 Docker 镜像。
基本语法示例
创建一个简单的 Node.js 应用的 Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| FROM node:16
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
ENV NODE_ENV=production
CMD [ "node", "server.js" ]
|
构建镜像
1 2 3 4 5
| docker build -t my-node-app .
|
多阶段构建示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| FROM node:16 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build
FROM node:16-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules EXPOSE 3000 CMD ["node", "dist/server.js"]
|
最佳实践
- 将变化频率低的指令放在前面,充分利用镜像缓存
- 合理合并 RUN 指令减少镜像层数
- 及时清理不必要的文件和缓存
- 使用 .dockerignore 忽略不需要的文件
6. Docker Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。
安装 Docker Compose
1 2 3 4 5 6 7 8
| sudo curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
|
docker-compose.yml 示例
创建一个简单的 Web 应用和数据库组合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| version: '3.8'
services: web: build: . ports: - "3000:3000" depends_on: - db environment: DB_HOST: db DB_USER: myuser DB_PASSWORD: mypassword DB_NAME: mydb
db: image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: mydb MYSQL_USER: myuser MYSQL_PASSWORD: mypassword volumes: - db_data:/var/lib/mysql ports: - "3306:3306"
volumes: db_data:
|
常用 Docker Compose 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| docker-compose up
docker-compose up -d
docker-compose ps
docker-compose stop
docker-compose start
docker-compose restart
docker-compose down
docker-compose logs
docker-compose build
|
7. 常用实践技巧
优化镜像大小
1 2 3 4 5
| FROM alpine:latest
FROM python:3.9-slim
|
使用 .dockerignore 文件
创建 .dockerignore 文件来忽略不需要添加到镜像中的文件:
1 2 3 4 5 6 7 8
| node_modules npm-debug.log .git .gitignore README.md .env coverage .nyc_output
|
容器健康检查
1 2 3
| HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1
|
数据持久化
1 2 3 4 5 6
| docker run -v /host/path:/container/path my-image
docker volume create my-volume docker run -v my-volume:/container/path my-image
|
网络管理
1 2 3 4 5 6
| docker network create my-network
docker run --network my-network --name web nginx docker run --network my-network --name db mysql
|
8. 故障排除
权限问题
如果遇到权限问题,请将当前用户添加到 docker 组:
1
| sudo usermod -aG docker $USER
|
然后注销并重新登录。
容器无法访问外部网络
检查防火墙设置和 DNS 配置:
1 2 3
| docker run --rm -it alpine sh ping google.com
|
镜像拉取失败
使用国内镜像加速器,在 /etc/docker/daemon.json 中添加:
1 2 3 4 5 6
| { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] }
|
然后重启 Docker 服务:
1 2
| sudo systemctl daemon-reload sudo systemctl restart docker
|
查看详细错误信息
1 2 3 4 5
| docker inspect container_name
docker logs container_name
|
通过这篇教程,你应该能够掌握 Docker 的基本使用方法。随着实践经验的积累,你会更加熟练地运用 Docker 来简化开发和部署流程。记住,最好的学习方式是在实际项目中不断练习和探索!