Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到轻量级、可移植的容器中。
1. Docker 核心概念
容器与虚拟机的区别
text
虚拟机: 应用 -> 依赖库 -> 客户机OS -> 虚拟机 -> 主机OS -> 硬件
容器: 应用 -> 依赖库 -> Docker引擎 -> 主机OS -> 硬件
核心组件
镜像(Image):只读模板,用于创建容器
容器(Container):镜像的运行实例
仓库(Registry):存储镜像的地方(如 Docker Hub)
Dockerfile:构建镜像的脚本文件
2. Docker 安装
Linux (Ubuntu) 安装
bash
# 更新包索引
sudo apt update
# 安装依赖
sudo apt 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 -
# 添加 Docker 仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装 Docker
sudo apt update
sudo apt install docker-ce
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker --version
macOS 安装
bash
# 使用 Homebrew 安装
brew install --cask docker
# 或者从官网下载 Docker Desktop
# https://www.docker.com/products/docker-desktop
Windows 安装
从 Docker 官网下载 Docker Desktop for Windows。
3. 基础 Docker 命令
系统信息命令
bash
# 查看 Docker 版本
docker version
# 查看系统信息
docker info
# 查看磁盘使用情况
docker system df
镜像管理
bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
docker pull ubuntu:20.04
# 列出本地镜像
docker images
docker image ls
# 删除镜像
docker rmi nginx:latest
docker image rm ubuntu:20.04
# 查看镜像历史
docker history nginx
# 给镜像打标签
docker tag nginx:latest my-nginx:v1
容器管理
bash
# 运行容器
docker run -d --name my-nginx nginx
docker run -it ubuntu:20.04 /bin/bash
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 删除容器
docker rm my-nginx
docker rm -f my-nginx # 强制删除运行中的容器
# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx # 实时查看
# 查看容器资源使用
docker stats my-nginx
4. 容器操作实战
运行交互式容器
bash
# 运行 Ubuntu 容器并进入 bash
docker run -it --name my-ubuntu ubuntu:20.04 /bin/bash
# 在容器内执行命令
apt update
apt install -y curl
curl --version
exit # 退出容器
端口映射
bash
# 将容器端口映射到主机端口
docker run -d -p 8080:80 --name web-server nginx
# 访问 http://localhost:8080
数据卷挂载
bash
# 创建数据卷
docker volume create my-data
# 使用数据卷
docker run -d -p 80:80 -v my-data:/usr/share/nginx/html nginx
# 绑定挂载(主机目录)
docker run -d -p 80:80 -v /host/path:/container/path nginx
# 查看数据卷
docker volume ls
docker volume inspect my-data
环境变量
bash
# 设置环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=test mysql:8.0
# 从文件读取环境变量
docker run -d --env-file .env my-app
5. Dockerfile 详解
基础 Dockerfile 示例
dockerfile
# 使用官方 Python 运行时作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 将当前目录内容复制到容器的 /app 目录
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 暴露端口
EXPOSE 5000
# 定义健康检查
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:5000/ || exit 1
# 运行应用
CMD ["flask", "run"]
Dockerfile 指令详解
dockerfile
# FROM - 指定基础镜像
FROM ubuntu:20.04
# LABEL - 添加元数据
LABEL maintainer="developer@example.com"
LABEL version="1.0"
LABEL description="My custom application"
# RUN - 执行命令
RUN apt update && apt install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# COPY - 复制文件
COPY requirements.txt .
COPY src/ ./src/
# ADD - 复制文件(支持 URL 和自动解压)
ADD https://example.com/file.tar.gz /tmp/
# ENV - 设置环境变量
ENV PYTHONPATH=/app
ENV APP_HOME=/app
# ARG - 构建参数
ARG BUILD_VERSION=1.0
ENV APP_VERSION=$BUILD_VERSION
# WORKDIR - 设置工作目录
WORKDIR /app
# USER - 设置用户
USER nobody
# VOLUME - 定义数据卷
VOLUME /data
# EXPOSE - 暴露端口
EXPOSE 80
EXPOSE 443
# CMD - 容器启动命令
CMD ["python", "app.py"]
# ENTRYPOINT - 入口点
ENTRYPOINT ["python"]
CMD ["app.py"]
多阶段构建示例
dockerfile
# 第一阶段:构建阶段
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 第二阶段:运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
6. 构建和推送镜像
构建镜像
bash
# 构建镜像
docker build -t my-app:1.0 .
# 指定 Dockerfile 路径
docker build -f Dockerfile.prod -t my-app:prod .
# 构建时传递参数
docker build --build-arg VERSION=2.0 -t my-app:2.0 .
推送镜像到仓库
bash
# 登录 Docker Hub
docker login
# 给镜像打标签
docker tag my-app:1.0 username/my-app:1.0
# 推送镜像
docker push username/my-app:1.0
# 从私有仓库拉取镜像
docker pull myregistry.com/my-app:1.0
7. 容器网络
网络管理
bash
# 列出网络
docker network ls
# 创建网络
docker network create my-network
# 查看网络详情
docker network inspect my-network
# 删除网络
docker network rm my-network
容器网络连接
bash
# 运行容器时指定网络
docker run -d --name web --network my-network nginx
# 连接现有容器到网络
docker network connect my-network existing-container
# 断开网络连接
docker network disconnect my-network container-name
自定义网络示例
bash
# 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/16 my-custom-network
# 运行多个容器在同一个网络
docker run -d --name web1 --network my-custom-network nginx
docker run -d --name web2 --network my-custom-network nginx
# 容器间可以通过容器名通信
docker exec -it web1 ping web2
8. Docker Compose
docker-compose.yml 示例
yaml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
environment:
- DEBUG=1
depends_on:
- db
- redis
networks:
- backend
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
redis:
image: redis:6-alpine
networks:
- backend
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web
networks:
- backend
volumes:
postgres_data:
networks:
backend:
driver: bridge
Compose 命令
bash
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs
docker-compose logs -f web
# 停止服务
docker-compose down
# 构建服务
docker-compose build
# 执行命令
docker-compose exec web python manage.py migrate
# 扩展服务实例
docker-compose up -d --scale web=3
9. 实际项目示例
Python Flask 应用
dockerfile
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
python
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
txt
# requirements.txt
Flask==2.0.1
yaml
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=development
volumes:
- .:/app
Node.js 应用
dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
10. 最佳实践
安全性最佳实践
dockerfile
# 使用非 root 用户
FROM node:16-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --chown=nextjs:nodejs . .
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
优化镜像大小
dockerfile
# 使用多阶段构建
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:16-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/package*.json ./
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
使用 .dockerignore
dockerignore
# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.DS_Store
11. 监控和调试
容器监控
bash
# 查看容器资源使用
docker stats
# 查看容器进程
docker top container_name
# 检查容器详细信息
docker inspect container_name
# 性能分析
docker exec container_name top
调试技巧
bash
# 进入运行中的容器
docker exec -it container_name /bin/bash
# 查看容器文件系统变化
docker diff container_name
# 复制文件到容器
docker cp local_file.txt container_name:/path/
# 从容器复制文件
docker cp container_name:/path/file.txt ./
12. 常用工作流程
开发环境工作流
bash
# 1. 编写 Dockerfile
# 2. 构建镜像
docker build -t my-app:dev .
# 3. 运行容器
docker run -p 3000:3000 -v $(pwd):/app my-app:dev
# 4. 测试应用
curl http://localhost:3000
# 5. 提交更改
docker commit container_name my-app:new-feature
# 6. 推送镜像
docker push my-registry.com/my-app:new-feature
生产环境部署
bash
# 拉取镜像
docker pull my-registry.com/my-app:latest
# 运行容器
docker run -d \
--name my-app \
-p 80:3000 \
--restart unless-stopped \
-e NODE_ENV=production \
my-registry.com/my-app:latest
# 使用 Docker Compose
docker-compose -f docker-compose.prod.yml up -d
总结
Docker 核心要点:
镜像:应用的打包模板
容器:镜像的运行实例
Dockerfile:构建镜像的蓝图
Docker Compose:多容器应用管理
数据卷:持久化数据存储
网络:容器间通信
https://gitee.com/pddzl88/pdd.shtml
https://gitee.com/pddzl88/collections
https://gitee.com/pddzl88/collections/772102
铱薪创汗秸
1. Docker 核心概念
容器与虚拟机的区别
text
虚拟机: 应用 -> 依赖库 -> 客户机OS -> 虚拟机 -> 主机OS -> 硬件
容器: 应用 -> 依赖库 -> Docker引擎 -> 主机OS -> 硬件
核心组件
镜像(Image):只读模板,用于创建容器
容器(Container):镜像的运行实例
仓库(Registry):存储镜像的地方(如 Docker Hub)
Dockerfile:构建镜像的脚本文件
2. Docker 安装
Linux (Ubuntu) 安装
bash
# 更新包索引
sudo apt update
# 安装依赖
sudo apt 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 -
# 添加 Docker 仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装 Docker
sudo apt update
sudo apt install docker-ce
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker --version
macOS 安装
bash
# 使用 Homebrew 安装
brew install --cask docker
# 或者从官网下载 Docker Desktop
# https://www.docker.com/products/docker-desktop
Windows 安装
从 Docker 官网下载 Docker Desktop for Windows。
3. 基础 Docker 命令
系统信息命令
bash
# 查看 Docker 版本
docker version
# 查看系统信息
docker info
# 查看磁盘使用情况
docker system df
镜像管理
bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
docker pull ubuntu:20.04
# 列出本地镜像
docker images
docker image ls
# 删除镜像
docker rmi nginx:latest
docker image rm ubuntu:20.04
# 查看镜像历史
docker history nginx
# 给镜像打标签
docker tag nginx:latest my-nginx:v1
容器管理
bash
# 运行容器
docker run -d --name my-nginx nginx
docker run -it ubuntu:20.04 /bin/bash
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 删除容器
docker rm my-nginx
docker rm -f my-nginx # 强制删除运行中的容器
# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx # 实时查看
# 查看容器资源使用
docker stats my-nginx
4. 容器操作实战
运行交互式容器
bash
# 运行 Ubuntu 容器并进入 bash
docker run -it --name my-ubuntu ubuntu:20.04 /bin/bash
# 在容器内执行命令
apt update
apt install -y curl
curl --version
exit # 退出容器
端口映射
bash
# 将容器端口映射到主机端口
docker run -d -p 8080:80 --name web-server nginx
# 访问 http://localhost:8080
数据卷挂载
bash
# 创建数据卷
docker volume create my-data
# 使用数据卷
docker run -d -p 80:80 -v my-data:/usr/share/nginx/html nginx
# 绑定挂载(主机目录)
docker run -d -p 80:80 -v /host/path:/container/path nginx
# 查看数据卷
docker volume ls
docker volume inspect my-data
环境变量
bash
# 设置环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=test mysql:8.0
# 从文件读取环境变量
docker run -d --env-file .env my-app
5. Dockerfile 详解
基础 Dockerfile 示例
dockerfile
# 使用官方 Python 运行时作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 将当前目录内容复制到容器的 /app 目录
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 暴露端口
EXPOSE 5000
# 定义健康检查
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:5000/ || exit 1
# 运行应用
CMD ["flask", "run"]
Dockerfile 指令详解
dockerfile
# FROM - 指定基础镜像
FROM ubuntu:20.04
# LABEL - 添加元数据
LABEL maintainer="developer@example.com"
LABEL version="1.0"
LABEL description="My custom application"
# RUN - 执行命令
RUN apt update && apt install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# COPY - 复制文件
COPY requirements.txt .
COPY src/ ./src/
# ADD - 复制文件(支持 URL 和自动解压)
ADD https://example.com/file.tar.gz /tmp/
# ENV - 设置环境变量
ENV PYTHONPATH=/app
ENV APP_HOME=/app
# ARG - 构建参数
ARG BUILD_VERSION=1.0
ENV APP_VERSION=$BUILD_VERSION
# WORKDIR - 设置工作目录
WORKDIR /app
# USER - 设置用户
USER nobody
# VOLUME - 定义数据卷
VOLUME /data
# EXPOSE - 暴露端口
EXPOSE 80
EXPOSE 443
# CMD - 容器启动命令
CMD ["python", "app.py"]
# ENTRYPOINT - 入口点
ENTRYPOINT ["python"]
CMD ["app.py"]
多阶段构建示例
dockerfile
# 第一阶段:构建阶段
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 第二阶段:运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
6. 构建和推送镜像
构建镜像
bash
# 构建镜像
docker build -t my-app:1.0 .
# 指定 Dockerfile 路径
docker build -f Dockerfile.prod -t my-app:prod .
# 构建时传递参数
docker build --build-arg VERSION=2.0 -t my-app:2.0 .
推送镜像到仓库
bash
# 登录 Docker Hub
docker login
# 给镜像打标签
docker tag my-app:1.0 username/my-app:1.0
# 推送镜像
docker push username/my-app:1.0
# 从私有仓库拉取镜像
docker pull myregistry.com/my-app:1.0
7. 容器网络
网络管理
bash
# 列出网络
docker network ls
# 创建网络
docker network create my-network
# 查看网络详情
docker network inspect my-network
# 删除网络
docker network rm my-network
容器网络连接
bash
# 运行容器时指定网络
docker run -d --name web --network my-network nginx
# 连接现有容器到网络
docker network connect my-network existing-container
# 断开网络连接
docker network disconnect my-network container-name
自定义网络示例
bash
# 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/16 my-custom-network
# 运行多个容器在同一个网络
docker run -d --name web1 --network my-custom-network nginx
docker run -d --name web2 --network my-custom-network nginx
# 容器间可以通过容器名通信
docker exec -it web1 ping web2
8. Docker Compose
docker-compose.yml 示例
yaml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
environment:
- DEBUG=1
depends_on:
- db
- redis
networks:
- backend
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
redis:
image: redis:6-alpine
networks:
- backend
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web
networks:
- backend
volumes:
postgres_data:
networks:
backend:
driver: bridge
Compose 命令
bash
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs
docker-compose logs -f web
# 停止服务
docker-compose down
# 构建服务
docker-compose build
# 执行命令
docker-compose exec web python manage.py migrate
# 扩展服务实例
docker-compose up -d --scale web=3
9. 实际项目示例
Python Flask 应用
dockerfile
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
python
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
txt
# requirements.txt
Flask==2.0.1
yaml
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=development
volumes:
- .:/app
Node.js 应用
dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
10. 最佳实践
安全性最佳实践
dockerfile
# 使用非 root 用户
FROM node:16-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --chown=nextjs:nodejs . .
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
优化镜像大小
dockerfile
# 使用多阶段构建
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:16-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/package*.json ./
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
使用 .dockerignore
dockerignore
# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.DS_Store
11. 监控和调试
容器监控
bash
# 查看容器资源使用
docker stats
# 查看容器进程
docker top container_name
# 检查容器详细信息
docker inspect container_name
# 性能分析
docker exec container_name top
调试技巧
bash
# 进入运行中的容器
docker exec -it container_name /bin/bash
# 查看容器文件系统变化
docker diff container_name
# 复制文件到容器
docker cp local_file.txt container_name:/path/
# 从容器复制文件
docker cp container_name:/path/file.txt ./
12. 常用工作流程
开发环境工作流
bash
# 1. 编写 Dockerfile
# 2. 构建镜像
docker build -t my-app:dev .
# 3. 运行容器
docker run -p 3000:3000 -v $(pwd):/app my-app:dev
# 4. 测试应用
curl http://localhost:3000
# 5. 提交更改
docker commit container_name my-app:new-feature
# 6. 推送镜像
docker push my-registry.com/my-app:new-feature
生产环境部署
bash
# 拉取镜像
docker pull my-registry.com/my-app:latest
# 运行容器
docker run -d \
--name my-app \
-p 80:3000 \
--restart unless-stopped \
-e NODE_ENV=production \
my-registry.com/my-app:latest
# 使用 Docker Compose
docker-compose -f docker-compose.prod.yml up -d
总结
Docker 核心要点:
镜像:应用的打包模板
容器:镜像的运行实例
Dockerfile:构建镜像的蓝图
Docker Compose:多容器应用管理
数据卷:持久化数据存储
网络:容器间通信
https://gitee.com/pddzl88/pdd.shtml
https://gitee.com/pddzl88/collections
https://gitee.com/pddzl88/collections/772102
铱薪创汗秸
53万+

被折叠的 条评论
为什么被折叠?



