|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. 基础环境搭建
在企业级环境中部署Docker之前,需要做好充分的准备工作,确保系统环境满足Docker运行的要求,并进行适当的优化配置。
1.1 Oracle Linux系统要求和准备
Oracle Linux是企业级应用广泛使用的操作系统,基于Red Hat Enterprise Linux (RHEL)构建。在安装Docker之前,需要确认以下系统要求:
• 支持的Oracle Linux版本:Oracle Linux 7.x 或 8.x(建议使用最新稳定版本)
• 系统架构:64位x86架构
• 内存:至少2GB RAM(推荐4GB以上)
• 存储空间:至少20GB可用磁盘空间
• CPU:支持虚拟化技术的现代处理器
首先,检查系统版本:
- cat /etc/oracle-release
- # 输出示例:Oracle Linux Server release 8.4
复制代码
检查系统架构:
1.2 系统更新和依赖包安装
在安装Docker之前,确保系统已更新到最新状态,并安装必要的依赖包:
- # 更新系统软件包
- sudo dnf update -y
- # 安装必要的依赖包
- sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
- # 安装其他可能需要的工具
- sudo dnf install -y curl wget git unzip tar
复制代码
1.3 内核参数调整
为了确保Docker能够正常运行,需要对内核参数进行一些调整:
- # 编辑sysctl配置文件
- sudo vi /etc/sysctl.d/docker.conf
- # 添加以下内容
- net.ipv4.ip_forward = 1
- net.bridge.bridge-nf-call-iptables = 1
- net.bridge.bridge-nf-call-ip6tables = 1
- # 保存并退出后,应用配置
- sudo sysctl -p /etc/sysctl.d/docker.conf
复制代码
1.4 存储配置
Docker需要大量的存储空间来存储镜像和容器数据。建议配置单独的存储设备或分区用于Docker数据:
- # 检查可用磁盘空间
- df -h
- # 创建Docker数据目录(假设使用/data/docker作为存储路径)
- sudo mkdir -p /data/docker
- # 如果有单独的磁盘,可以挂载到该目录
- # 示例:假设/dev/sdb1是准备用于Docker的磁盘分区
- # sudo mkfs.xfs /dev/sdb1
- # sudo mount /dev/sdb1 /data/docker
- # 添加到/etc/fstab实现永久挂载
- # echo "/dev/sdb1 /data/docker xfs defaults 0 0" | sudo tee -a /etc/fstab
复制代码
1.5 网络配置
确保网络配置正确,Docker需要能够访问互联网来下载镜像:
- # 检查网络连接
- ping -c 4 google.com
- # 如果使用代理服务器,配置环境变量
- # export HTTP_PROXY="http://proxy.example.com:80"
- # export HTTPS_PROXY="http://proxy.example.com:80"
复制代码
如果系统使用防火墙,需要预先配置相关规则:
- # 对于使用firewalld的系统
- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload
复制代码
2. Docker安装
在Oracle Linux上安装Docker有多种方法,本节将介绍最常用的安装方式,以及安装后的配置和优化。
2.1 Docker版本选择
Docker有两个主要版本:Docker CE(社区版)和Docker EE(企业版)。对于大多数企业级应用,Docker CE已经足够强大且稳定。本指南将使用Docker CE。
2.2 使用YUM仓库安装Docker
使用官方YUM仓库是安装Docker的推荐方法,可以确保获得最新版本并便于后续更新:
- # 添加Docker官方仓库
- sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- # 如果系统是Oracle Linux 8,可能需要使用以下命令
- # sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- # 更新YUM缓存
- sudo dnf makecache
- # 安装Docker CE、Docker CLI和Containerd
- sudo dnf install -y docker-ce docker-ce-cli containerd.io
复制代码
2.3 使用Oracle提供的Docker包
Oracle也提供了自己的Docker包,这些包经过优化以更好地与Oracle Linux集成:
- # 启用Oracle Linux的ol8_developer附加仓库
- sudo dnf install -y oracle-olcne-release-el8
- sudo dnf config-manager --enable ol8_developer
- # 安装Docker
- sudo dnf install -y docker
复制代码
2.4 手动安装Docker
在某些情况下,可能需要手动安装Docker,例如在没有互联网连接的环境中:
- # 下载Docker RPM包(在有互联网的机器上)
- # 可以从 https://download.docker.com/linux/centos/ 下载适合的版本
- # 传输到目标服务器后,使用以下命令安装
- sudo dnf localinstall -y docker-ce-<VERSION>.rpm docker-ce-cli-<VERSION>.rpm containerd.io-<VERSION>.rpm
复制代码
2.5 Docker配置和优化
安装完成后,需要对Docker进行配置以满足企业级需求:
- # 创建Docker配置目录
- sudo mkdir -p /etc/docker
- # 创建Docker守护进程配置文件
- sudo vi /etc/docker/daemon.json
- # 添加以下配置(根据实际需求调整)
- {
- "data-root": "/data/docker",
- "storage-driver": "overlay2",
- "log-opts": {
- "max-size": "100m",
- "max-file": "3"
- },
- "live-restore": true,
- "userland-proxy": false,
- "insecure-registries": [],
- "registry-mirrors": [
- "https://mirror.gcr.io",
- "https://dockerhub.azk8s.cn"
- ]
- }
- # 保存并退出
复制代码
2.6 启动Docker服务并设置开机自启
- # 启动Docker服务
- sudo systemctl start docker
- # 设置Docker开机自启
- sudo systemctl enable docker
- # 检查Docker服务状态
- sudo systemctl status docker
复制代码
2.7 验证安装
- # 检查Docker版本
- docker --version
- # 输出示例:Docker version 20.10.7, build f0df350
- # 运行测试容器
- sudo docker run hello-world
- # 查看Docker系统信息
- sudo docker info
复制代码
2.8 配置用户权限
默认情况下,只有root用户和docker组的成员才能运行Docker命令。将用户添加到docker组:
- # 将当前用户添加到docker组
- sudo usermod -aG docker $USER
- # 重新登录以使组更改生效,或者使用
- newgrp docker
- # 验证是否可以不使用sudo运行docker命令
- docker ps
复制代码
3. 镜像管理
镜像是Docker的核心组件,本节将详细介绍如何搜索、拉取、构建、管理和维护Docker镜像。
3.1 搜索和拉取镜像
使用docker search命令可以在Docker Hub上搜索镜像:
- # 搜索Nginx镜像
- docker search nginx
- # 搜索官方镜像(过滤结果)
- docker search --filter "is-official=true" nginx
- # 搜索星标超过100的镜像
- docker search --filter "stars=100" nginx
复制代码
使用docker pull命令从镜像仓库拉取镜像:
- # 拉取最新的Nginx镜像
- docker pull nginx
- # 拉取特定版本的镜像
- docker pull nginx:1.20.0
- # 拉取所有版本的镜像(不推荐,会占用大量空间)
- # docker pull -a nginx
复制代码
3.2 查看本地镜像
- # 列出所有本地镜像
- docker images
- # 列出所有镜像(包括中间层)
- docker images -a
- # 以特定格式列出镜像
- docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
复制代码
3.3 构建自定义镜像
Dockerfile是构建Docker镜像的文本文件,包含了一系列构建镜像所需的指令。
创建一个简单的Web应用Dockerfile示例:
- # 基于Oracle Linux 8
- FROM oraclelinux:8
- # 维护者信息
- MAINTAINER Your Name <your.email@example.com>
- # 安装必要的软件包
- RUN dnf install -y nginx && \
- dnf clean all
- # 添加自定义配置文件
- COPY nginx.conf /etc/nginx/nginx.conf
- # 添加网站内容
- COPY html /usr/share/nginx/html
- # 暴露端口
- EXPOSE 80
- # 启动Nginx
- CMD ["nginx", "-g", "daemon off;"]
复制代码
构建镜像:
- # 在Dockerfile所在目录执行
- docker build -t my-nginx-app .
- # 指定Dockerfile路径
- docker build -t my-nginx-app -f /path/to/Dockerfile .
- # 构建时指定构建参数
- docker build --build-arg APP_VERSION=1.0 -t my-nginx-app .
复制代码
多阶段构建可以帮助创建更小、更安全的镜像:
- # 第一阶段:构建应用
- FROM maven:3.8.1-openjdk-11 AS builder
- WORKDIR /app
- COPY pom.xml .
- COPY src ./src
- RUN mvn package -DskipTests
- # 第二阶段:运行应用
- FROM oraclelinux:8
- RUN dnf install -y java-11-openjdk && dnf clean all
- WORKDIR /app
- COPY --from=builder /app/target/myapp.jar .
- EXPOSE 8080
- CMD ["java", "-jar", "myapp.jar"]
复制代码
3.4 镜像标记和版本控制
为镜像添加标签有助于版本控制和管理:
- # 为镜像添加标签
- docker tag my-nginx-app:latest my-nginx-app:v1.0.0
- # 为镜像添加仓库前缀(准备推送)
- docker tag my-nginx-app:latest myregistry.example.com/my-nginx-app:latest
复制代码
3.5 镜像导出和导入
- # 使用docker save导出镜像到tar文件
- docker save -o my-nginx-app.tar my-nginx-app:latest
- # 导出多个镜像到同一个文件
- docker save -o images.tar nginx:latest oraclelinux:8
复制代码- # 从tar文件加载镜像
- docker load -i my-nginx-app.tar
- # 从标准输入加载镜像
- docker load < my-nginx-app.tar
复制代码
3.6 镜像仓库设置和使用
- # 登录到Docker Hub
- docker login
- # 登录到私有仓库
- docker login myregistry.example.com
- # 使用凭证登录
- docker login -u username -p password myregistry.example.com
复制代码- # 推送镜像到Docker Hub
- docker push username/my-nginx-app:latest
- # 推送镜像到私有仓库
- docker push myregistry.example.com/my-nginx-app:latest
复制代码
使用Docker Registry搭建私有镜像仓库:
- # 运行Registry容器
- docker run -d -p 5000:5000 --name registry \
- -v /data/registry:/var/lib/registry \
- registry:2
- # 配置Docker以信任私有仓库
- sudo vi /etc/docker/daemon.json
- # 添加以下内容
- {
- "insecure-registries": ["myregistry.example.com:5000"]
- }
- # 重启Docker服务
- sudo systemctl restart docker
复制代码
3.7 镜像安全扫描
使用Docker提供的工具对镜像进行安全扫描:
- # 使用Docker Scout扫描镜像(需要登录)
- docker scout cve my-nginx-app:latest
- # 使用第三方工具(如Clair、Trivy等)
- # 例如安装并使用Trivy
- # wget https://github.com/aquasecurity/trivy/releases/download/v0.18.3/trivy_0.18.3_Linux-64bit.tar.gz
- # tar zxvf trivy_0.18.3_Linux-64bit.tar.gz
- # ./trivy image my-nginx-app:latest
复制代码
3.8 清理和删除镜像
- # 删除指定镜像
- docker rmi my-nginx-app:latest
- # 强制删除镜像(即使有容器使用)
- docker rmi -f my-nginx-app:latest
- # 删除所有未被使用的镜像
- docker image prune
- # 删除所有悬空镜像(无标签的镜像)
- docker image prune --filter="dangling=true"
- # 删除所有未被任何容器使用的镜像
- docker image prune -a
复制代码
4. 容器运行
容器是Docker的运行实例,本节将详细介绍如何创建、运行、管理和维护Docker容器。
4.1 容器基本操作
使用docker run命令创建并启动一个新容器:
- # 基本容器运行
- docker run -d --name my-nginx -p 8080:80 nginx:latest
- # 交互式运行容器
- docker run -it --name my-oracle oraclelinux:8 /bin/bash
- # 运行容器并自动删除(退出后)
- docker run -rm --name my-temp oraclelinux:8 echo "Hello World"
- # 运行容器并设置环境变量
- docker run -d --name my-app \
- -e APP_ENV=production \
- -e DB_HOST=db.example.com \
- my-app:latest
复制代码- # 列出正在运行的容器
- docker ps
- # 列出所有容器(包括已停止的)
- docker ps -a
- # 列出最近创建的n个容器
- docker ps -n 5
- # 只显示容器ID
- docker ps -q
复制代码- # 停止容器
- docker stop my-nginx
- # 启动已停止的容器
- docker start my-nginx
- # 重启容器
- docker restart my-nginx
- # 强制停止容器
- docker kill my-nginx
复制代码- # 删除已停止的容器
- docker rm my-nginx
- # 强制删除运行中的容器
- docker rm -f my-nginx
- # 删除所有已停止的容器
- docker container prune
- # 删除所有容器(包括运行中的)
- docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
复制代码
4.2 容器资源限制和管理
在企业环境中,对容器资源进行限制和管理非常重要,以确保系统稳定性和性能。
- # 限制容器内存使用为512MB
- docker run -d --name my-app --memory="512m" my-app:latest
- # 限制容器内存使用为1GB,并设置swap为2GB
- docker run -d --name my-app --memory="1g" --memory-swap="2g" my-app:latest
- # 禁用swap
- docker run -d --name my-app --memory="1g" --memory-swap="1g" my-app:latest
复制代码- # 限制容器使用0.5个CPU
- docker run -d --name my-app --cpus="0.5" my-app:latest
- # 设置容器使用CPU的权重(默认1024)
- docker run -d --name my-app --cpu-shares=512 my-app:latest
- # 限制容器只能使用CPU 0和1
- docker run -d --name my-app --cpuset-cpus="0,1" my-app:latest
复制代码- # 限制容器读取速率为10MB/s
- docker run -d --name my-app --device-read-bps /dev/sda:10mb my-app:latest
- # 限制容器写入速率为5MB/s
- docker run -d --name my-app --device-write-bps /dev/sda:5mb my-app:latest
- # 限制容器读取IOPS为1000
- docker run -d --name my-app --device-read-iops /dev/sda:1000 my-app:latest
复制代码
4.3 数据持久化
容器默认是无状态的,数据会随着容器删除而丢失。为了持久化数据,需要使用卷或绑定挂载。
- # 创建一个命名卷
- docker volume create my-app-data
- # 使用命名卷运行容器
- docker run -d --name my-app -v my-app-data:/app/data my-app:latest
- # 查看卷列表
- docker volume ls
- # 查看卷详细信息
- docker volume inspect my-app-data
- # 删除卷
- docker volume rm my-app-data
- # 删除未使用的卷
- docker volume prune
复制代码- # 使用主机目录挂载到容器
- docker run -d --name my-app \
- -v /host/path/to/data:/app/data \
- my-app:latest
- # 以只读方式挂载
- docker run -d --name my-app \
- -v /host/path/to/config:/app/config:ro \
- my-app:latest
复制代码- # 为容器添加临时文件系统
- docker run -d --name my-app \
- --tmpfs /app/temp:rw,size=100m \
- my-app:latest
复制代码
4.4 网络配置
Docker提供了多种网络模式,可以根据需要配置容器网络。
- # 创建一个bridge网络
- docker network create my-app-network
- # 使用自定义网络运行容器
- docker run -d --name my-app --network my-app-network my-app:latest
- # 将容器连接到多个网络
- docker network connect my-app-network my-app
- # 断开容器与网络的连接
- docker network disconnect my-app-network my-app
- # 查看网络列表
- docker network ls
- # 查看网络详细信息
- docker network inspect my-app-network
- # 删除网络
- docker network rm my-app-network
复制代码- # 将容器的80端口映射到主机的8080端口
- docker run -d --name my-app -p 8080:80 my-app:latest
- # 将容器的80端口映射到主机的所有可用接口的8080端口
- docker run -d --name my-app -p 0.0.0.0:8080:80 my-app:latest
- # 将容器的80端口映射到主机的随机端口
- docker run -d --name my-app -p 80 my-app:latest
- # 映射多个端口
- docker run -d --name my-app -p 8080:80 -p 8443:443 my-app:latest
复制代码- # 使用--link选项(旧方法,不推荐)
- docker run -d --name my-web --link my-db:db my-web-app:latest
- # 使用自定义网络(推荐方法)
- docker network create my-app-net
- docker run -d --name my-db --network my-app-net my-db:latest
- docker run -d --name my-web --network my-app-net my-web-app:latest
- # 在容器中使用DNS名称访问其他容器
- # 例如,在my-web容器中,可以使用主机名"my-db"访问数据库容器
复制代码
4.5 容器编排
对于复杂的应用,可能需要同时管理多个容器。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。
- # 下载Docker Compose二进制文件
- sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- # 添加执行权限
- sudo chmod +x /usr/local/bin/docker-compose
- # 创建软链接
- sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- # 验证安装
- docker-compose --version
复制代码
创建一个简单的Web应用和数据库的docker-compose.yml文件:
- version: '3'
- services:
- web:
- image: nginx:latest
- ports:
- - "8080:80"
- volumes:
- - ./html:/usr/share/nginx/html
- networks:
- - app-network
- depends_on:
- - db
- db:
- image: oracle/database:12.2.0.1-ee
- environment:
- - DB_SID=ORCLCDB
- - DB_PDB=ORCLPDB1
- - DB_PASSWD=Oracle123
- volumes:
- - db-data:/opt/oracle/oradata
- networks:
- - app-network
- networks:
- app-network:
- driver: bridge
- volumes:
- db-data:
复制代码
使用Docker Compose管理应用:
- # 启动服务
- docker-compose up -d
- # 查看服务状态
- docker-compose ps
- # 查看服务日志
- docker-compose logs
- # 停止服务
- docker-compose down
- # 停止服务并删除卷
- docker-compose down -v
- # 重新构建并启动服务
- docker-compose up -d --build
复制代码
4.6 容器监控
监控容器状态和资源使用情况对于维护企业级应用至关重要。
- # 查看容器资源使用情况
- docker stats
- # 持续查看指定容器的资源使用情况
- docker stats my-app
- # 查看容器进程
- docker top my-app
- # 查看容器日志
- docker logs my-app
- # 持续跟踪容器日志
- docker logs -f my-app
- # 查看容器最近的日志
- docker logs --tail 100 my-app
- # 查看容器特定时间段的日志
- docker logs --since 2023-05-01T00:00:00 --until 2023-05-02T00:00:00 my-app
复制代码- # 获取Docker事件
- docker events
- # 过滤特定容器的事件
- docker events -f container=my-app
- # 过滤特定事件类型
- docker events -f event=stop
复制代码
在Dockerfile中定义健康检查:
- FROM nginx:latest
- # 健康检查
- HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
- CMD curl -f http://localhost/ || exit 1
复制代码
或者,在docker-compose.yml中定义:
- version: '3'
- services:
- web:
- image: nginx:latest
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost/"]
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 40s
复制代码
查看容器健康状态:
- # 查看容器健康状态
- docker inspect --format='{{.State.Health.Status}}' my-app
复制代码
5. 故障排除实战技巧
在运行Docker容器时,难免会遇到各种问题。本节将介绍一些常见的故障及其解决方法,以及实用的故障排除技巧。
5.1 常见问题和解决方案
问题:容器启动后立即退出。
解决方法:
- # 查看容器日志
- docker logs my-app
- # 以交互模式运行容器以调试
- docker run -it --entrypoint /bin/bash my-app-image
- # 检查容器状态
- docker inspect my-app | grep "Status"
复制代码
常见原因:
• 应用程序错误或崩溃
• 缺少必要的依赖或配置
• 健康检查失败
• 资源限制过严格
问题:容器无法访问外部网络或服务。
解决方法:
- # 检查容器网络配置
- docker inspect my-app | grep -A 20 "NetworkSettings"
- # 在容器内测试网络连接
- docker exec my-app ping -c 4 google.com
- # 检查DNS配置
- docker exec my-app cat /etc/resolv.conf
- # 检查主机防火墙设置
- sudo firewall-cmd --list-all
复制代码
常见原因:
• DNS配置问题
• 防火墙阻止连接
• 网络配置错误
• 代理设置问题
问题:容器无法写入数据或性能低下。
解决方法:
- # 检查容器挂载点
- docker inspect -f '{{ .Mounts }}' my-app
- # 检查磁盘空间
- df -h
- # 检查Docker数据目录使用情况
- du -sh /var/lib/docker/*
- # 检查文件系统权限
- ls -la /host/path/to/data
复制代码
常见原因:
• 磁盘空间不足
• 文件系统权限问题
• 存储驱动兼容性问题
• I/O性能瓶颈
问题:容器因资源限制而被杀死或性能不佳。
解决方法:
- # 查看容器资源限制
- docker inspect my-app | grep -A 10 "Resources"
- # 查看容器资源使用情况
- docker stats my-app
- # 查看系统资源使用情况
- top
- free -h
- iostat
- # 检查内核日志
- dmesg | grep -i oom
复制代码
常见原因:
• 内存限制过低导致OOM Killer杀死进程
• CPU限制过严导致性能问题
• I/O限制导致磁盘操作缓慢
5.2 日志分析
日志是故障排除的重要工具,本节介绍如何有效收集和分析Docker日志。
Docker支持多种日志驱动,可以根据需要配置:
- # 修改Docker守护进程配置
- sudo vi /etc/docker/daemon.json
- # 添加日志配置
- {
- "log-driver": "json-file",
- "log-opts": {
- "max-size": "10m",
- "max-file": "3",
- "compress": "true"
- }
- }
- # 重启Docker服务
- sudo systemctl restart docker
复制代码
使用ELK(Elasticsearch, Logstash, Kibana)或EFK(Elasticsearch, Fluentd, Kibana)堆栈进行集中日志管理:
- # docker-compose.yml示例
- version: '3'
- services:
- web:
- image: my-app:latest
- logging:
- driver: "fluentd"
- options:
- fluentd-address: localhost:24224
- tag: my-app
- fluentd:
- image: fluent/fluentd:v1.12-1
- volumes:
- - ./fluentd/conf:/fluentd/etc
- ports:
- - "24224:24224"
- - "24224:24224/udp"
复制代码- # 过滤错误日志
- docker logs my-app 2>&1 | grep ERROR
- # 统计错误数量
- docker logs my-app 2>&1 | grep -c ERROR
- # 查看特定时间段的日志
- docker logs --since 1h my-app
- # 实时监控日志并过滤
- docker logs -f my-app | grep "ERROR"
复制代码
5.3 性能调优
优化Docker性能可以提高应用响应速度并减少资源消耗。
- # 使用性能更好的存储驱动(如overlay2)
- sudo vi /etc/docker/daemon.json
- {
- "storage-driver": "overlay2"
- }
- # 重启Docker服务
- sudo systemctl restart docker
- # 为容器使用单独的文件系统
- docker run -d --name my-app \
- --storage-opt size=20G \
- my-app:latest
复制代码- # 调整内存交换行为
- docker run -d --name my-app \
- --memory="1g" \
- --memory-swappiness=0 \
- my-app:latest
- # 使用内存限制
- docker run -d --name my-app \
- --memory="1g" \
- --memory-reservation="512m" \
- my-app:latest
复制代码- # 设置CPU亲和性
- docker run -d --name my-app \
- --cpuset-cpus="0-1" \
- my-app:latest
- # 设置CPU份额和优先级
- docker run -d --name my-app \
- --cpu-shares=1024 \
- --cpu-period=100000 \
- --cpu-quota=50000 \
- my-app:latest
复制代码
5.4 安全加固
在企业环境中,Docker安全至关重要。本节介绍一些Docker安全最佳实践。
- # 以非root用户运行容器
- docker run -d --name my-app \
- -u 1000:1000 \
- my-app:latest
- # 使用只读根文件系统
- docker run -d --name my-app \
- --read-only \
- my-app:latest
- # 限制容器能力
- docker run -d --name my-app \
- --cap-drop ALL \
- --cap-add NET_BIND_SERVICE \
- my-app:latest
- # 使用安全配置文件
- docker run -d --name my-app \
- --security-opt=no-new-privileges \
- --security-opt=seccomp=/path/to/seccomp-profile.json \
- my-app:latest
复制代码- # 使用基础镜像的最小版本
- FROM oraclelinux:8-minimal
- # 定期更新基础镜像
- RUN dnf update -y && dnf clean all
- # 扫描镜像漏洞
- # 使用Docker Scout
- docker scout cve my-app:latest
- # 使用Trivy
- trivy image my-app:latest
- # 签名镜像
- # 安装Notary
- # 然后使用以下命令签名镜像
- docker trust sign my-app:latest
复制代码- # 使用自定义网络隔离容器
- docker network create --internal my-isolated-network
- # 限制容器间通信
- docker run -d --name my-app \
- --network my-isolated-network \
- my-app:latest
- # 加密网络流量
- # 创建加密网络
- docker network create \
- --opt encrypted \
- my-encrypted-network
复制代码
5.5 备份和恢复策略
制定有效的备份和恢复策略对于企业级Docker部署至关重要。
- # 备份单个镜像
- docker save -o my-app-backup.tar my-app:latest
- # 备份所有镜像
- docker save -o all-images.tar $(docker images -q)
- # 编写备份脚本
- #!/bin/bash
- IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>")
- BACKUP_DIR="/backup/docker-images"
- DATE=$(date +%Y%m%d-%H%M%S)
- mkdir -p $BACKUP_DIR
- for image in $IMAGES; do
- echo "Backing up $image"
- docker save -o $BACKUP_DIR/$image-$DATE.tar $image
- done
复制代码- # 备份命名卷
- docker run --rm \
- -v my-app-data:/source \
- -v $(pwd):/backup \
- alpine tar czf /backup/my-app-data-backup.tar.gz -C /source .
- # 备份所有卷
- #!/bin/bash
- VOLUMES=$(docker volume ls -q)
- BACKUP_DIR="/backup/docker-volumes"
- DATE=$(date +%Y%m%d-%H%M%S)
- mkdir -p $BACKUP_DIR
- for volume in $VOLUMES; do
- echo "Backing up volume $volume"
- docker run --rm \
- -v $volume:/source \
- -v $BACKUP_DIR:/backup \
- alpine tar czf /backup/$volume-$DATE.tar.gz -C /source .
- done
复制代码- # 导出容器配置
- docker inspect my-app > my-app-config.json
- # 导出所有容器配置
- #!/bin/bash
- CONTAINERS=$(docker ps -a --format "{{.Names}}")
- BACKUP_DIR="/backup/docker-containers"
- DATE=$(date +%Y%m%d-%H%M%S)
- mkdir -p $BACKUP_DIR
- for container in $CONTAINERS; do
- echo "Backing up configuration for $container"
- docker inspect $container > $BACKUP_DIR/$container-config-$DATE.json
- done
复制代码- # 恢复镜像
- docker load -i my-app-backup.tar
- # 恢复卷
- docker run --rm \
- -v my-app-data:/target \
- -v $(pwd):/backup \
- alpine tar xzf /backup/my-app-data-backup.tar.gz -C /target
- # 使用备份的配置重新创建容器
- # 从备份的JSON文件中提取必要的配置信息
- # 然后使用docker run命令重新创建容器
复制代码
使用cron作业实现定期备份:
- # 编辑crontab
- crontab -e
- # 添加以下内容以每天凌晨2点执行备份
- 0 2 * * * /path/to/backup-script.sh
- # 示例备份脚本
- #!/bin/bash
- BACKUP_DIR="/backup/docker"
- DATE=$(date +%Y%m%d-%H%M%S)
- RETENTION_DAYS=30
- # 创建备份目录
- mkdir -p $BACKUP_DIR/images
- mkdir -p $BACKUP_DIR/volumes
- mkdir -p $BACKUP_DIR/containers
- # 备份所有镜像
- echo "Backing up Docker images..."
- docker save -o $BACKUP_DIR/images/all-images-$DATE.tar $(docker images -q)
- # 备份所有卷
- echo "Backing up Docker volumes..."
- for volume in $(docker volume ls -q); do
- docker run --rm \
- -v $volume:/source \
- -v $BACKUP_DIR/volumes:/backup \
- alpine tar czf /backup/$volume-$DATE.tar.gz -C /source .
- done
- # 备份容器配置
- echo "Backing up container configurations..."
- for container in $(docker ps -a --format "{{.Names}}"); do
- docker inspect $container > $BACKUP_DIR/containers/$container-config-$DATE.json
- done
- # 删除旧备份
- echo "Cleaning up old backups..."
- find $BACKUP_DIR -type f -name "*$(date -d "$RETENTION_DAYS days ago" +%Y%m%d)*" -delete
- echo "Backup completed successfully."
复制代码
结语
本指南详细介绍了在Oracle Linux企业级环境中安装、配置和管理Docker的完整流程,从基础环境搭建到镜像管理、容器运行和故障排除。通过遵循本指南中的最佳实践和技巧,您可以构建一个稳定、安全且高性能的Docker环境,满足企业级应用的需求。
随着Docker技术的不断发展,建议持续关注Docker和容器生态系统的最新发展,定期更新您的知识和技能,以便充分利用这一强大的容器化平台。
希望本指南能够帮助您成功部署和管理企业级Oracle Linux系统中的Docker环境。如有任何问题或需要进一步的帮助,请参考Docker官方文档或寻求专业技术支持。 |
|