一、入门阶段
(一)Docker 基础概念
容器技术简介
容器与虚拟机的区别
虚拟机(VM)通过虚拟化硬件运行完整的操作系统,而容器共享宿主机的操作系统内核,仅包含应用程序及其依赖,因此启动更快、资源占用更少。
示例:运行一个简单的 Web 服务,虚拟机可能需要几分钟启动,而容器只需几秒。
容器的优势
轻量级:容器仅包含必要的应用程序和依赖,不包含完整的操作系统。
快速启动:容器启动只需几秒,而虚拟机可能需要几分钟。
隔离性:容器之间相互隔离,互不影响。
Docker 的定义与架构
Docker 的定义
Docker 是一个开源的应用容器引擎,允许开发者打包他们的应用以及其依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker 的架构组成
客户端(Client):用户与 Docker 交互的工具,如 docker 命令行工具。
守护进程(Daemon):在后台运行的进程,负责管理镜像、容器、网络和存储卷等。
镜像(Image):只读模板,包含运行容器所需的文件系统和应用程序。
容器(Container):镜像的运行实例,可以启动、停止、删除等。
仓库(Repository):存储镜像的地方,如 Docker Hub 或私有仓库。
Docker 的工作原理
Docker 使用 Linux 内核的特性(如 Namespaces 和 Cgroups)来实现容器的隔离和资源限制。
核心概念
镜像(Image)
定义与作用
镜像是一个只读模板,包含运行容器所需的文件系统和应用程序。
示例:基于 Ubuntu 的镜像,包含操作系统和必要的工具。
分层存储机制
镜像是由多层组成的,每一层代表一个操作(如安装软件、复制文件等)。
示例:一个简单的 Dockerfile 可能包含以下内容:
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
CMD ["nginx", "-g", "daemon off;"]
这个 Dockerfile 定义了一个基于 Ubuntu 20.04 的镜像,安装了 Nginx 并设置为前台运行。
容器(Container)
定义与作用
容器是镜像的运行实例,可以启动、停止、删除等。
示例:运行一个 Nginx 容器:
docker run -d -p 80:80 --name my-nginx nginx
这个命令会从 Docker Hub 拉取最新的 Nginx 镜像,并在后台运行一个名为 my-nginx 的容器,将容器的 80 端口映射到宿主机的 80 端口。
生命周期管理
容器的生命周期包括创建、启动、停止、删除等。
示例:
docker start my-nginx # 启动容器
docker stop my-nginx # 停止容器
docker rm my-nginx # 删除容器
仓库(Repository)
定义与作用
仓库是存储镜像的地方,可以是 Docker Hub 或私有仓库。
示例:从 Docker Hub 拉取一个镜像:
docker pull nginx
将本地镜像推送到 Docker Hub:
docker tag my-nginx myusername/nginx:latest
docker push myusername/nginx:latest
(二)Docker 安装与配置
安装 Docker
Windows 系统
使用 Docker Desktop for Windows 安装 Docker。
示例:下载并安装 Docker Desktop for Windows 后,启动 Docker Desktop,它会自动配置 Docker 的资源分配。
Mac 系统
使用 Docker Desktop for Mac 安装 Docker。
示例:下载并安装 Docker Desktop for Mac 后,启动 Docker Desktop,它会自动配置 Docker 的网络设置。
Linux 系统
在主流 Linux 发行版(如 Ubuntu、CentOS、Debian 等)上安装 Docker。
示例(Ubuntu):
sudo apt-get update
sudo apt-get install -y docker.io
示例(CentOS):
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
配置 Docker 镜像加速
了解镜像加速的必要性
默认情况下,Docker 从 Docker Hub 拉取镜像,但国内访问 Docker Hub 可能较慢。使用镜像加速器可以提高拉取速度。
配置国内镜像加速器
示例(使用阿里云镜像加速器):
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
验证 Docker 安装
查看 Docker 版本
docker version
查看 Docker 系统信息
docker info
运行一个简单的 Docker 容器
docker run hello-world
如果输出“Hello from Docker!”,则表示安装成功。
(三)运行第一个 Docker 容器
拉取镜像
使用 docker pull 命令从 Docker Hub 拉取镜像
docker pull nginx
查看本地镜像列表
docker images
运行容器
使用 docker run 命令启动容器
docker run -d -p 80:80 --name my-nginx nginx
-d:后台运行
-p 80:80:将容器的 80 端口映射到宿主机的 80 端口
--name my-nginx:为容器指定名称
查看正在运行的容器
docker ps
探索 Docker 命令行工具
查看容器日志
docker logs my-nginx
进入正在运行的容器
docker exec -it my-nginx /bin/bash
停止容器
docker stop my-nginx
删除容器
docker rm my-nginx
二、基础操作阶段
(一)镜像操作
构建自定义镜像
编写 Dockerfile
示例:创建一个简单的 Dockerfile 构建一个包含 Python 应用的镜像。
# 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录下的文件到工作目录
COPY . /app
# 安装依赖
RUN pip install -r requirements.txt
# 指定容器启动时运行的命令
CMD ["python", "app.py"]
保存为 Dockerfile,并在同一目录下创建 requirements.txt 和 app.py 文件。
requirements.txt 示例:
Flask==2.0.1
app.py 示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
构建镜像
docker build -t my-python-app .
-t my-python-app:为镜像指定名称和标签。
使用多阶段构建优化镜像
示例:使用多阶段构建优化镜像,减少最终镜像大小。
# 第一阶段:构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
# 第二阶段:运行阶段
FROM python:3.9-slim
COPY --from=builder /app /app
WORKDIR /app
CMD ["python", "app.py"]
构建镜像:
docker build -t my-python-app .
从 Docker Hub 拉取镜像
搜索 Docker Hub 上的镜像
docker search nginx
拉取官方镜像
docker pull nginx
拉取第三方镜像
docker pull redis
使用 docker pull 命令的常用选项
指定镜像版本:
docker pull nginx:1.21
指定平台:
docker pull --platform linux/amd64 nginx
推送镜像到 Docker 仓库
注册 Docker Hub 账号
访问 Docker Hub 注册账号。
登录 Docker Hub
docker login
标签镜像
docker tag my-python-app myusername/my-python-app:latest
推送镜像到 Docker Hub
docker push myusername/my-python-app:latest
配置私有仓库并推送镜像到私有仓库
示例:使用 Docker Registry 创建私有仓库。
docker run -d -p 5000:5000 --name registry registry:2
将镜像推送到私有仓库:
docker tag my-python-app localhost:5000/my-python-app:latest
docker push localhost:5000/my-python-app:latest
(二)容器管理
启动、停止、删除容器
启动容器
docker start my-nginx
停止容器
docker stop my-nginx
重启容器
docker restart my-nginx
删除容器
docker rm my-nginx
删除所有已停止的容器
docker container prune
查看容器日志
查看容器的标准输出和标准错误日志
docker logs my-nginx
跟踪日志
docker logs -f my-nginx
显示时间戳
docker logs --timestamps my-nginx
配置容器的日志驱动
示例:使用 json-file 日志驱动。
docker run -d --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 nginx
容器的生命周期管理
查看容器状态
docker ps -a
查看容器的详细信息
docker inspect my-nginx
查看容器内运行的进程
docker top my-nginx
查看容器的资源使用情况
docker stats my-nginx
(三)Docker 网络
理解 Docker 网络概念
网络模式的分类
bridge:默认网络模式,容器连接到 Docker 内置的网桥。
host:容器共享宿主机的网络栈。
none:容器不配置网络。
默认网络的作用
示例:默认情况下,Docker 会创建一个名为 docker0 的网桥,容器会连接到这个网桥。
创建自定义网络
创建桥接网络
docker network create my-bridge-network
配置网络的子网、网关等参数
docker network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 my-bridge-network
查看网络列表
docker network ls
查看网络的详细信息
docker network inspect my-bridge-network
连接容器到网络
将容器连接到自定义网络
docker run -d --name my-nginx --network my-bridge-network nginx
配置容器的网络参数
docker run -d --name my-nginx --network my-bridge-network --ip 192.168.1.100 nginx
测试容器之间的网络通信
示例:运行两个容器并测试它们之间的通信。
docker run -d --name my-nginx1 --network my-bridge-network nginx
docker run -d --name my-nginx2 --network my-bridge-network nginx
docker exec -it my-nginx1 ping my-nginx2
将容器从网络中移除
docker network disconnect my-bridge-network my-nginx
(四)数据管理
使用数据卷持久化数据
数据卷的类型
绑定挂载:将宿主机的目录或文件挂载到容器内。
命名卷:由 Docker 管理的卷,具有名称。
匿名卷:没有名称的卷,通常用于临时数据。
创建和管理数据卷
docker volume create my-data
查看数据卷列表
docker volume ls
查看数据卷的详细信息
docker volume inspect my-data
将数据卷挂载到容器
绑定挂载
docker run -d --name my-nginx -v /path/to/host:/path/to/container nginx
命名卷
docker run -d --name my-nginx -v my-data:/path/to/container nginx
匿名卷
docker run -d --name my-nginx -v /path/to/container nginx
持久化容器内的数据
示例:运行一个 MySQL 容器并持久化数据。
docker run -d --name my-mysql -v my-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
备份和恢复容器数据
使用数据卷备份容器数据
示例:备份 MySQL 数据。
docker run --rm --volumes-from my-mysql -v $(pwd):/backup ubuntu tar cvf /backup/mysql-backup.tar /var/lib/mysql
使用 Docker 命令导出和导入容器数据
导出容器数据:
docker export my-nginx > my-nginx.tar
导入容器数据:
cat my-nginx.tar | docker import - my-nginx
使用数据卷迁移容器数据到其他主机
示例:将数据卷迁移到另一台主机。
docker save my-mysql-data > my-mysql-data.tar
scp my-mysql-data.tar other-host:/path/to/destination
docker load < my-mysql-data.tar
使用 Docker Compose 管理多容器应用的数据持久化
示例:使用 Docker Compose 配置 MySQL 和 Nginx 的数据持久化。
version: '3'
services:
mysql:
image: mysql
volumes:
- my-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
nginx:
image: nginx
volumes:
- my-nginx-data:/usr/share/nginx/html
volumes:
my-mysql-data:
my-nginx-data:
三、进阶阶段
(一)Docker Compose
编写和运行 Docker Compose 文件
编写 docker-compose.yml 文件
示例:定义一个简单的 Web 应用和数据库服务。
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
保存为 docker-compose.yml 文件。
启动服务
docker-compose up -d
停止服务
docker-compose down
管理多容器应用
查看服务状态
docker-compose ps
查看服务日志
docker-compose logs
进入服务容器
docker-compose exec web /bin/bash
扩展服务实例数量
docker-compose up -d --scale web=3
查看配置文件
docker-compose config
Docker Compose 的高级用法
使用 docker-compose.override.yml 文件覆盖默认配置
示例:覆盖默认的 docker-compose.yml 文件中的配置。
version: '3'
services:
web:
ports:
- "8080:80"
保存为 docker-compose.override.yml 文件。
使用环境变量文件
示例:创建 .env 文件。
MYSQL_ROOT_PASSWORD=my-secret-pw
在 docker-compose.yml 文件中引用环境变量。
version: '3'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
配置服务的健康检查
示例:为服务配置健康检查。
version: '3'
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
部署多容器应用到生产环境
示例:使用 Docker Compose 部署到 Docker Swarm 集群。
docker swarm init
docker stack deploy -c docker-compose.yml my-app
(二)Docker Swarm
了解 Docker Swarm 集群
集群的节点类型
管理节点(Manager Node):负责集群的管理和调度。
工作节点(Worker Node):负责运行容器。
集群的通信机制
示例:管理节点之间使用 Raft 协议进行共识,工作节点通过 Gossip 协议与管理节点通信。
初始化 Docker Swarm 集群
初始化管理节点
docker swarm init --advertise-addr
将工作节点加入集群
docker swarm join --token
查看集群状态
docker node ls
配置集群的网络和存储
示例:创建一个覆盖网络。
docker network create --driver overlay my-overlay-network
部署服务到 Swarm 集群
创建服务
docker service create --name my-web --replicas 3 --network my-overlay-network -p 80:80 nginx
查看服务列表
docker service ls
查看服务的详细信息
docker service inspect my-web
更新服务配置
docker service update --replicas 5 my-web
删除服务
docker service rm my-web
管理 Docker Swarm 集群
配置集群的高可用性
示例:添加多个管理节点。
docker swarm join-token manager
将其他节点加入管理节点。
使用 docker stack 部署和管理多服务应用
示例:使用 Docker Compose 文件部署应用。
docker stack deploy -c docker-compose.yml my-app
监控集群的资源使用情况
示例:使用 Prometheus 和 Grafana 监控集群。
docker service create --name my-prometheus -p 9090:9090 prom/prometheus
docker service create --name my-grafana -p 3000:3000 grafana/grafana
使用 Docker Compose 部署应用到 Swarm 集群
示例:在 docker-compose.yml 文件中添加 deploy 配置。
version: '3'
services:
web:
image: nginx
deploy:
replicas: 3
resources:
limits:
cpus: '0.50'
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- my-overlay-network
networks:
my-overlay-network:
driver: overlay
处理集群的故障恢复和节点维护
示例:将节点标记为维护模式。
docker node update --availability drain
(三)Docker 安全性
容器安全最佳实践
使用最小化镜像
示例:使用 Alpine Linux 作为基础镜像。
FROM alpine:latest
RUN apk add --no-cache nginx
CMD ["nginx", "-g", "daemon off;"]
遵循最小权限原则
示例:使用非 root 用户运行容器。
FROM python:3.9-slim
RUN useradd -m myuser
USER myuser
CMD ["python", "app.py"]
定期更新镜像和容器
示例:定期拉取最新镜像。
docker pull nginx
使用安全的网络配置
示例:限制网络访问。
docker run -d --name my-nginx --network my-bridge-network nginx
配置容器的资源限制
示例:限制容器的 CPU 和内存使用。
docker run -d --name my-nginx --cpus="0.5" --memory="50m" nginx
Docker 镜像安全性
使用 Docker Content Trust 签名和验证镜像
示例:启用 Docker Content Trust。
export DOCKER_CONTENT_TRUST=1
扫描镜像漏洞
示例:使用 Trivy 扫描镜像。
trivy image nginx
配置镜像的安全策略
示例:仅允许特定来源的镜像。
docker pull myusername/my-python-app:latest
使用私有仓库增强镜像安全性
示例:将镜像推送到私有仓库。
docker push localhost:5000/my-python-app:latest
管理镜像的版本和签名
示例:为镜像添加标签和签名。
docker tag my-python-app myusername/my-python-app:1.0
docker push myusername/my-python-app:1.0
Docker 安全配置
配置 Docker 的安全策略
示例:使用 AppArmor 配置安全策略。
docker run -d --name my-nginx --security-opt apparmor:my-profile nginx
使用 Docker 的安全选项
示例:限制容器的能力。
docker run -d --name my-nginx --cap-drop ALL nginx
配置 Docker 的用户和权限管理
示例:使用 Docker 的用户组管理权限。
sudo usermod -aG docker myuser
使用 Docker 的日志审计功能
示例:配置日志审计。
docker run -d --name my-nginx --log-opt audit=true nginx
防范常见的安全威胁
示例:防止容器逃逸。
docker run -d --name my-nginx --security-opt no-new-privileges=true nginx
四、高级阶段
(一)Docker 插件和扩展
使用 Docker 插件扩展功能
安装和配置 Docker 插件
示例:安装 Weave 网络插件。
docker plugin install weaveworks/weave:latest
使用网络插件
示例:使用 Weave 网络插件创建跨主机网络。
docker network create --driver weaveworks/weave:latest my-weave-network
使用存储插件
示例:使用 Ceph 存储插件。
docker plugin install ceph/ceph:latest
使用日志插件
示例:使用 Fluentd 日志插件。
docker plugin install fluent/fluentd:latest
开发自定义 Docker 插件
了解 Docker 插件的开发框架和接口
示例:使用 Go 语言开发自定义网络插件。
package main
import (
"github.com/docker/docker/plugin/v2/logdriver"
"github.com/docker/docker/plugin/v2/logdriver/fluentd"
)
func main() {
logdriver.Serve(&fluentd.FluentdLogDriver{})
}
测试和部署自定义插件
示例:编译并安装自定义插件。
go build -o my-log-driver
docker plugin install --grant-all-permissions ./my-log-driver
(二)自动化部署
使用 CI/CD 工具进行 Docker 化应用程序的自动化部署
配置 CI/CD 工具的 Docker 插件
示例:使用 Jenkins 配置 Docker 插件。
sudo apt-get install -y docker.io
sudo usermod -aG docker jenkins
编写 CI/CD 流水线脚本
示例:使用 Jenkinsfile 配置流水线。
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'docker build -t my-python-app .'
}
}
stage('Test') {
steps {
sh 'docker run --rm my-python-app python -m unittest discover'
}
}
stage('Deploy') {
steps {
sh 'docker push myusername/my-python-app:latest'
}
}
}
}
实现代码提交后的自动构建、测试、镜像推送和部署
示例:配置 GitLab CI。
stages:
- build
- deploy
build:
stage: build
script:
- docker build -t my-python-app .
- docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
- docker push myusername/my-python-app:latest
deploy:
stage: deploy
script:
- docker pull myusername/my-python-app:latest
- docker stack deploy -c docker-compose.yml my-app
配置环境变量和密钥管理
示例:在 Jenkins 中配置环境变量。
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=mypassword
使用 Docker Compose 或 Kubernetes 部署应用
示例:使用 Docker Compose 部署应用。
docker-compose up -d
Docker 化应用的持续集成与持续部署
实现多环境部署
示例:配置多环境部署。
stages:
- build
- deploy-dev
- deploy-prod
build:
stage: build
script:
- docker build -t my-python-app .
- docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
- docker push myusername/my-python-app:latest
deploy-dev:
stage: deploy-dev
script:
- docker pull myusername/my-python-app:latest
- docker stack deploy -c docker-compose-dev.yml my-app
deploy-prod:
stage: deploy-prod
script:
- docker pull myusername/my-python-app:latest
- docker stack deploy -c docker-compose-prod.yml my-app
使用 Docker Compose 或 Kubernetes 的滚动更新策略
示例:使用 Kubernetes 的滚动更新策略。
kubectl set image deployment/my-app my-app=myusername/my-python-app:latest
配置蓝绿部署或金丝雀部署策略
示例:使用蓝绿部署策略。
kubectl apply -f my-app-blue.yaml
kubectl apply -f my-app-green.yaml
监控部署过程中的应用状态
示例:使用 Prometheus 和 Grafana 监控应用状态。
docker run -d --name my-prometheus -p 9090:9090 prom/prometheus
docker run -d --name my-grafana -p 3000:3000 grafana/grafana
处理部署过程中的回滚和故障恢复
示例:回滚到之前的版本。
kubectl rollout undo deployment/my-app
(三)性能优化
优化镜像大小
使用多阶段构建减少镜像体积
示例:使用多阶段构建优化镜像。
# 第一阶段:构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
# 第二阶段:运行阶段
FROM python:3.9-slim
COPY --from=builder /app /app
WORKDIR /app
CMD ["python", "app.py"]
使用轻量级基础镜像
示例:使用 Alpine Linux 作为基础镜像。
FROM alpine:latest
RUN apk add --no-cache nginx
CMD ["nginx", "-g", "daemon off;"]
删除不必要的文件和依赖
示例:在构建过程中清理不必要的文件。
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
优化容器的资源使用
配置容器的 CPU 和内存限制
示例:限制容器的 CPU 和内存使用。
docker run -d --name my-nginx --cpus="0.5" --memory="50m" nginx
使用资源调度策略
示例:配置资源调度策略。
docker run -d --name my-nginx --cpu-shares 512 --memory-reservation 100m nginx
监控容器的资源使用情况
示例:使用 docker stats 命令监控容器的资源使用。
docker stats my-nginx
优化容器的网络性能
使用高效的网络插件
示例:使用 Weave 网络插件。
docker plugin install weaveworks/weave:latest
docker network create --driver weaveworks/weave:latest my-weave-network
配置网络的 MTU 和缓冲区大小
示例:配置网络的 MTU。
docker network create --driver bridge --opt com.docker.network.driver.mtu=1450 my-network
使用负载均衡器优化网络流量
示例:使用 HAProxy 作为负载均衡器。
docker run -d --name my-haproxy -p 80:80 haproxy
优化容器的存储性能
使用高性能存储插件
示例:使用 Ceph 存储插件。
docker plugin install ceph/ceph:latest
配置存储的缓存策略和读写性能
示例:配置存储的缓存策略。
docker run -d --name my-mysql -v my-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
使用数据卷的快照和备份功能
示例:使用 Docker Volume 插件进行数据卷备份。
docker volume ls
docker volume inspect my-mysql-data
优化 Docker 守护进程的性能
配置 Docker 的日志驱动和日志级别
示例:配置日志驱动。
docker run -d --name my-nginx --log-driver json-file --log-opt max-size=10m nginx
调整 Docker 的存储驱动参数
示例:调整存储驱动参数。
sudo nano /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
使用 Docker 的资源限制和调度策略
示例:配置资源限制。
docker run -d --name my-nginx --cpus="0.5" --memory="50m" nginx
五、实战项目与进阶技巧阶段
(一)实战项目
参与实际的 Docker 项目
选择一个开源项目或实际业务需求
示例:选择一个开源的 Web 应用项目,如 Flaskr。
分析项目需求并设计 Docker 化方案
示例:设计 Docker 化方案,包括镜像构建、网络配置和数据卷管理。
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "flaskr.py"]
# docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./flaskr:/app/flaskr
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
构建项目的 Docker 镜像
docker build -t my-flaskr-app .
配置项目的 Docker 网络和数据卷
docker-compose up -d
使用 Docker Compose 或 Kubernetes 部署项目
docker-compose up -d
测试和优化项目的性能
示例:使用 Prometheus 和 Grafana 监控应用性能。
docker run -d --name my-prometheus -p 9090:9090 prom/prometheus
docker run -d --name my-grafana -p 3000:3000 grafana/grafana
监控项目的运行状态并处理故障
示例:使用 Docker 的日志和监控工具定位故障。
docker logs my-web
docker stats my-web
Docker 化 Web 应用开发
使用 Docker 开发基于 Flask 的 Python Web 应用
示例:创建一个简单的 Flask 应用。
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
docker build -t my-flask-app .
docker run -d --name my-flask-app -p 5000:5000 my-flask-app
使用 Docker 开发基于 Express 的 Node.js Web 应用
示例:创建一个简单的 Express 应用。
// app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, Docker!');
});
app.listen(3000, () => {
console.log('App listening on port 3000');
});
# Dockerfile
FROM node:14-slim
WORKDIR /app
COPY . /app
RUN npm install
CMD ["node", "app.js"]
docker build -t my-express-app .
docker run -d --name my-express-app -p 3000:3000 my-express-app
使用 Docker 开发基于 Spring Boot 的 Java Web 应用
示例:创建一个简单的 Spring Boot 应用。
// Application.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello, Docker!";
}
}
}
# Dockerfile
FROM openjdk:11-jre-slim
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
CMD ["java", "-jar", "app.jar"]
docker build -t my-spring-boot-app .
docker run -d --name my-spring-boot-app -p 8080:8080 my-spring-boot-app
使用 Docker Compose 配置 Web 应用的开发环境
示例:配置 Web 应用的开发环境。
# docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./app:/app
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
docker-compose up -d
使用 Docker 的热重载功能加速开发过程
示例:使用 Spring Boot 的热重载功能。
docker run -d --name my-spring-boot-app -p 8080:8080 -v $(pwd)/src:/app/src my-spring-boot-app
Docker 化微服务架构开发
使用 Docker Compose 或 Kubernetes 部署微服务架构
示例:定义微服务架构。
# docker-compose.yml
version: '3'
services:
gateway:
image: my-gateway-service
ports:
- "8080:8080"
user-service:
image: my-user-service
ports:
- "8081:8081"
order-service:
image: my-order-service
ports:
- "8082:8082"
docker-compose up -d
使用 Docker 构建微服务的镜像
示例:构建微服务的镜像。
docker build -t my-gateway-service ./gateway
docker build -t my-user-service ./user-service
docker build -t my-order-service ./order-service
配置微服务的网络通信
示例:配置服务发现和负载均衡。
# docker-compose.yml
version: '3'
services:
gateway:
image: my-gateway-service
ports:
- "8080:8080"
networks:
- my-network
user-service:
image: my-user-service
ports:
- "8081:8081"
networks:
- my-network
order-service:
image: my-order-service
ports:
- "8082:8082"
networks:
- my-network
networks:
my-network:
driver: bridge
docker-compose up -d
使用 Docker 的配置管理功能
示例:使用环境变量管理配置。
# docker-compose.yml
version: '3'
services:
gateway:
image: my-gateway-service
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=dev
docker-compose up -d
监控微服务的运行状态
示例:使用 Prometheus 和 Grafana 监控微服务。
docker run -d --name my-prometheus -p 9090:9090 prom/prometheus
docker run -d --name my-grafana -p 3000:3000 grafana/grafana
处理微服务的故障恢复和弹性伸缩
示例:配置 Kubernetes 的弹性伸缩策略。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
spec:
replicas: 3
selector:
matchLabels:
app: my-service
template:
metadata:
labels:
app: my-service
spec:
containers:
- name: my-service
image: my-service:latest
ports:
- containerPort: 8080
kubectl apply -f deployment.yaml
(二)进阶技巧
学习高级的 Docker 使用技巧
资源限制
配置容器的 CPU 和内存限制
示例:限制容器的 CPU 和内存使用。
docker run -d --name my-nginx --cpus="0.5" --memory="50m" nginx
使用 Cgroups 和 Namespaces 实现资源隔离
示例:配置资源隔离。
docker run -d --name my-nginx --cpu-shares 512 --memory-reservation 100m nginx
配置容器的 I/O 限制
示例:限制容器的磁盘 I/O 使用。
docker run -d --name my-nginx --blkio-weight 300 nginx
日志管理
配置容器的日志驱动
示例:配置日志驱动。
docker run -d --name my-nginx --log-driver json-file --log-opt max-size=10m nginx
使用日志聚合工具
示例:使用 ELK Stack 收集和分析日志。
docker run -d --name my-elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch
docker run -d --name my-logstash -p 5000:5000 logstash
docker run -d --name my-kibana -p 5601:5601 kibana
配置日志的轮转和清理策略
示例:配置日志轮转。
docker run -d --name my-nginx --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 nginx
使用 Docker 的日志审计功能
示例:启用日志审计。
docker run -d --name my-nginx --log-opt audit=true nginx
容器的高级网络配置
配置容器的网络接口
示例:配置容器的 IP 地址和 MAC 地址。
docker run -d --name my-nginx --network my-network --ip 192.168.1.100 nginx
使用自定义网络驱动
示例:使用 Weave 网络插件。
docker plugin install weaveworks/weave:latest
docker network create --driver weaveworks/weave:latest my-weave-network
配置网络的加密通信
示例:配置 TLS 加密通信。
docker run -d --name my-nginx --network my-network --ip 192.168.1.100 -v /path/to/certs:/etc/nginx/certs nginx
使用负载均衡器优化网络流量
示例:使用 HAProxy 作为负载均衡器。
docker run -d --name my-haproxy -p 80:80 haproxy
容器的高级存储配置
使用数据卷的快照和备份功能
示例:创建数据卷的快照。
docker volume create my-data
docker run -d --name my-app -v my-data:/data my-app
docker volume ls
docker volume inspect my-data
配置数据卷的加密存储
示例:使用加密存储。
docker volume create --driver local --opt type=none --opt device=/path/to/encrypted-volume --opt o=bind my-encrypted-data
使用存储插件实现分布式存储
示例:使用 Ceph 存储插件。
docker plugin install ceph/ceph:latest
docker volume create --driver ceph/ceph:latest my-ceph-data
配置存储的缓存策略和读写性能
示例:配置存储的缓存策略。
docker volume create --driver local --opt type=none --opt device=/path/to/cache-volume --opt o=bind my-cache-data
Docker 的高级调度策略
使用 Docker 的资源调度策略
示例:配置资源调度策略。
docker run -d --name my-nginx --cpu-shares 512 --memory-reservation 100m nginx
配置 Docker 的亲和性和反亲和性规则
示例:配置亲和性规则。
docker run -d --name my-nginx --affinity node==
使用 Docker 的标签和约束功能
示例:使用标签和约束。
docker run -d --name my-nginx --label com.example.role=web nginx
配置 Docker 的资源预留和抢占策略
示例:配置资源预留。
docker run -d --name my-nginx --cpus="0.5" --memory="50m" nginx
Docker 的高级安全配置
使用 Docker 的安全策略
示例:使用 AppArmor 配置安全策略。
docker run -d --name my-nginx --security-opt apparmor:my-profile nginx
配置 Docker 的用户和权限管理
示例:配置用户和权限。
docker run -d --name my-nginx --user 1000:1000 nginx
使用 Docker 的日志审计功能
示例:启用日志审计。
docker run -d --name my-nginx --log-opt audit=true nginx
防范常见的安全威胁
示例:防止容器逃逸。
docker run -d --name my-nginx --security-opt no-new-privileges=true nginx
Docker 的高级监控与调试技巧
使用 Docker 的监控工具
示例:使用 Prometheus 和 Grafana 监控容器。
docker run -d --name my-prometheus -p 9090:9090 prom/prometheus
docker run -d --name my-grafana -p 3000:3000 grafana/grafana
使用 Docker 的调试工具
示例:进入容器进行调试。
docker exec -it my-nginx /bin/bash
配置 Docker 的日志级别和调试模式
示例:配置日志级别。
docker run -d --name my-nginx --log-level debug nginx
使用 Docker 的性能分析工具
示例:使用 docker stats 分析性能。
docker stats my-nginx
使用 Docker 的网络抓包工具
示例:使用 Tcpdump 抓包。
docker run -d --name my-tcpdump -v /var/run/docker.sock:/var/run/docker.sock nicolaka/netshoot tcpdump -i any -w /capture.pcap
Docker 的高级故障排除技巧
使用 Docker 的日志和监控工具定位故障
示例:查看容器日志。
docker logs my-nginx
使用 Docker 的调试工具进入容器排查问题
示例:进入容器排查问题。
docker exec -it my-nginx /bin/bash
配置 Docker 的故障恢复策略
示例:配置自动重启策略。
docker run -d --name my-nginx --restart always nginx
处理常见的 Docker 故障
示例:处理容器无法启动的问题。
docker logs my-nginx
docker inspect my-nginx
分析 Docker 的系统日志
示例:分析系统日志。
sudo tail -f /var/log/docker.log
使用 Docker 的资源限制和调度策略优化故障恢复性能
示例:配置资源限制。
docker run -d --name my-nginx --cpus="0.5" --memory="50m" nginx