活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

企业级Oracle Linux系统中Docker镜像安装部署完全指南从基础环境搭建到镜像管理容器运行及故障排除实战技巧

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-9 19:00:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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:支持虚拟化技术的现代处理器

首先,检查系统版本:
  1. cat /etc/oracle-release
  2. # 输出示例:Oracle Linux Server release 8.4
复制代码

检查系统架构:
  1. uname -m
  2. # 输出示例:x86_64
复制代码

1.2 系统更新和依赖包安装

在安装Docker之前,确保系统已更新到最新状态,并安装必要的依赖包:
  1. # 更新系统软件包
  2. sudo dnf update -y
  3. # 安装必要的依赖包
  4. sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
  5. # 安装其他可能需要的工具
  6. sudo dnf install -y curl wget git unzip tar
复制代码

1.3 内核参数调整

为了确保Docker能够正常运行,需要对内核参数进行一些调整:
  1. # 编辑sysctl配置文件
  2. sudo vi /etc/sysctl.d/docker.conf
  3. # 添加以下内容
  4. net.ipv4.ip_forward = 1
  5. net.bridge.bridge-nf-call-iptables = 1
  6. net.bridge.bridge-nf-call-ip6tables = 1
  7. # 保存并退出后,应用配置
  8. sudo sysctl -p /etc/sysctl.d/docker.conf
复制代码

1.4 存储配置

Docker需要大量的存储空间来存储镜像和容器数据。建议配置单独的存储设备或分区用于Docker数据:
  1. # 检查可用磁盘空间
  2. df -h
  3. # 创建Docker数据目录(假设使用/data/docker作为存储路径)
  4. sudo mkdir -p /data/docker
  5. # 如果有单独的磁盘,可以挂载到该目录
  6. # 示例:假设/dev/sdb1是准备用于Docker的磁盘分区
  7. # sudo mkfs.xfs /dev/sdb1
  8. # sudo mount /dev/sdb1 /data/docker
  9. # 添加到/etc/fstab实现永久挂载
  10. # echo "/dev/sdb1 /data/docker xfs defaults 0 0" | sudo tee -a /etc/fstab
复制代码

1.5 网络配置

确保网络配置正确,Docker需要能够访问互联网来下载镜像:
  1. # 检查网络连接
  2. ping -c 4 google.com
  3. # 如果使用代理服务器,配置环境变量
  4. # export HTTP_PROXY="http://proxy.example.com:80"
  5. # export HTTPS_PROXY="http://proxy.example.com:80"
复制代码

如果系统使用防火墙,需要预先配置相关规则:
  1. # 对于使用firewalld的系统
  2. sudo firewall-cmd --permanent --add-service=http
  3. sudo firewall-cmd --permanent --add-service=https
  4. 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的推荐方法,可以确保获得最新版本并便于后续更新:
  1. # 添加Docker官方仓库
  2. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  3. # 如果系统是Oracle Linux 8,可能需要使用以下命令
  4. # sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  5. # 更新YUM缓存
  6. sudo dnf makecache
  7. # 安装Docker CE、Docker CLI和Containerd
  8. sudo dnf install -y docker-ce docker-ce-cli containerd.io
复制代码

2.3 使用Oracle提供的Docker包

Oracle也提供了自己的Docker包,这些包经过优化以更好地与Oracle Linux集成:
  1. # 启用Oracle Linux的ol8_developer附加仓库
  2. sudo dnf install -y oracle-olcne-release-el8
  3. sudo dnf config-manager --enable ol8_developer
  4. # 安装Docker
  5. sudo dnf install -y docker
复制代码

2.4 手动安装Docker

在某些情况下,可能需要手动安装Docker,例如在没有互联网连接的环境中:
  1. # 下载Docker RPM包(在有互联网的机器上)
  2. # 可以从 https://download.docker.com/linux/centos/ 下载适合的版本
  3. # 传输到目标服务器后,使用以下命令安装
  4. sudo dnf localinstall -y docker-ce-<VERSION>.rpm docker-ce-cli-<VERSION>.rpm containerd.io-<VERSION>.rpm
复制代码

2.5 Docker配置和优化

安装完成后,需要对Docker进行配置以满足企业级需求:
  1. # 创建Docker配置目录
  2. sudo mkdir -p /etc/docker
  3. # 创建Docker守护进程配置文件
  4. sudo vi /etc/docker/daemon.json
  5. # 添加以下配置(根据实际需求调整)
  6. {
  7.   "data-root": "/data/docker",
  8.   "storage-driver": "overlay2",
  9.   "log-opts": {
  10.     "max-size": "100m",
  11.     "max-file": "3"
  12.   },
  13.   "live-restore": true,
  14.   "userland-proxy": false,
  15.   "insecure-registries": [],
  16.   "registry-mirrors": [
  17.     "https://mirror.gcr.io",
  18.     "https://dockerhub.azk8s.cn"
  19.   ]
  20. }
  21. # 保存并退出
复制代码

2.6 启动Docker服务并设置开机自启
  1. # 启动Docker服务
  2. sudo systemctl start docker
  3. # 设置Docker开机自启
  4. sudo systemctl enable docker
  5. # 检查Docker服务状态
  6. sudo systemctl status docker
复制代码

2.7 验证安装
  1. # 检查Docker版本
  2. docker --version
  3. # 输出示例:Docker version 20.10.7, build f0df350
  4. # 运行测试容器
  5. sudo docker run hello-world
  6. # 查看Docker系统信息
  7. sudo docker info
复制代码

2.8 配置用户权限

默认情况下,只有root用户和docker组的成员才能运行Docker命令。将用户添加到docker组:
  1. # 将当前用户添加到docker组
  2. sudo usermod -aG docker $USER
  3. # 重新登录以使组更改生效,或者使用
  4. newgrp docker
  5. # 验证是否可以不使用sudo运行docker命令
  6. docker ps
复制代码

3. 镜像管理

镜像是Docker的核心组件,本节将详细介绍如何搜索、拉取、构建、管理和维护Docker镜像。

3.1 搜索和拉取镜像

使用docker search命令可以在Docker Hub上搜索镜像:
  1. # 搜索Nginx镜像
  2. docker search nginx
  3. # 搜索官方镜像(过滤结果)
  4. docker search --filter "is-official=true" nginx
  5. # 搜索星标超过100的镜像
  6. docker search --filter "stars=100" nginx
复制代码

使用docker pull命令从镜像仓库拉取镜像:
  1. # 拉取最新的Nginx镜像
  2. docker pull nginx
  3. # 拉取特定版本的镜像
  4. docker pull nginx:1.20.0
  5. # 拉取所有版本的镜像(不推荐,会占用大量空间)
  6. # docker pull -a nginx
复制代码

3.2 查看本地镜像
  1. # 列出所有本地镜像
  2. docker images
  3. # 列出所有镜像(包括中间层)
  4. docker images -a
  5. # 以特定格式列出镜像
  6. docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
复制代码

3.3 构建自定义镜像

Dockerfile是构建Docker镜像的文本文件,包含了一系列构建镜像所需的指令。

创建一个简单的Web应用Dockerfile示例:
  1. # 基于Oracle Linux 8
  2. FROM oraclelinux:8
  3. # 维护者信息
  4. MAINTAINER Your Name <your.email@example.com>
  5. # 安装必要的软件包
  6. RUN dnf install -y nginx && \
  7.     dnf clean all
  8. # 添加自定义配置文件
  9. COPY nginx.conf /etc/nginx/nginx.conf
  10. # 添加网站内容
  11. COPY html /usr/share/nginx/html
  12. # 暴露端口
  13. EXPOSE 80
  14. # 启动Nginx
  15. CMD ["nginx", "-g", "daemon off;"]
复制代码

构建镜像:
  1. # 在Dockerfile所在目录执行
  2. docker build -t my-nginx-app .
  3. # 指定Dockerfile路径
  4. docker build -t my-nginx-app -f /path/to/Dockerfile .
  5. # 构建时指定构建参数
  6. docker build --build-arg APP_VERSION=1.0 -t my-nginx-app .
复制代码

多阶段构建可以帮助创建更小、更安全的镜像:
  1. # 第一阶段:构建应用
  2. FROM maven:3.8.1-openjdk-11 AS builder
  3. WORKDIR /app
  4. COPY pom.xml .
  5. COPY src ./src
  6. RUN mvn package -DskipTests
  7. # 第二阶段:运行应用
  8. FROM oraclelinux:8
  9. RUN dnf install -y java-11-openjdk && dnf clean all
  10. WORKDIR /app
  11. COPY --from=builder /app/target/myapp.jar .
  12. EXPOSE 8080
  13. CMD ["java", "-jar", "myapp.jar"]
复制代码

3.4 镜像标记和版本控制

为镜像添加标签有助于版本控制和管理:
  1. # 为镜像添加标签
  2. docker tag my-nginx-app:latest my-nginx-app:v1.0.0
  3. # 为镜像添加仓库前缀(准备推送)
  4. docker tag my-nginx-app:latest myregistry.example.com/my-nginx-app:latest
复制代码

3.5 镜像导出和导入
  1. # 使用docker save导出镜像到tar文件
  2. docker save -o my-nginx-app.tar my-nginx-app:latest
  3. # 导出多个镜像到同一个文件
  4. docker save -o images.tar nginx:latest oraclelinux:8
复制代码
  1. # 从tar文件加载镜像
  2. docker load -i my-nginx-app.tar
  3. # 从标准输入加载镜像
  4. docker load < my-nginx-app.tar
复制代码

3.6 镜像仓库设置和使用
  1. # 登录到Docker Hub
  2. docker login
  3. # 登录到私有仓库
  4. docker login myregistry.example.com
  5. # 使用凭证登录
  6. docker login -u username -p password myregistry.example.com
复制代码
  1. # 推送镜像到Docker Hub
  2. docker push username/my-nginx-app:latest
  3. # 推送镜像到私有仓库
  4. docker push myregistry.example.com/my-nginx-app:latest
复制代码

使用Docker Registry搭建私有镜像仓库:
  1. # 运行Registry容器
  2. docker run -d -p 5000:5000 --name registry \
  3.   -v /data/registry:/var/lib/registry \
  4.   registry:2
  5. # 配置Docker以信任私有仓库
  6. sudo vi /etc/docker/daemon.json
  7. # 添加以下内容
  8. {
  9.   "insecure-registries": ["myregistry.example.com:5000"]
  10. }
  11. # 重启Docker服务
  12. sudo systemctl restart docker
复制代码

3.7 镜像安全扫描

使用Docker提供的工具对镜像进行安全扫描:
  1. # 使用Docker Scout扫描镜像(需要登录)
  2. docker scout cve my-nginx-app:latest
  3. # 使用第三方工具(如Clair、Trivy等)
  4. # 例如安装并使用Trivy
  5. # wget https://github.com/aquasecurity/trivy/releases/download/v0.18.3/trivy_0.18.3_Linux-64bit.tar.gz
  6. # tar zxvf trivy_0.18.3_Linux-64bit.tar.gz
  7. # ./trivy image my-nginx-app:latest
复制代码

3.8 清理和删除镜像
  1. # 删除指定镜像
  2. docker rmi my-nginx-app:latest
  3. # 强制删除镜像(即使有容器使用)
  4. docker rmi -f my-nginx-app:latest
  5. # 删除所有未被使用的镜像
  6. docker image prune
  7. # 删除所有悬空镜像(无标签的镜像)
  8. docker image prune --filter="dangling=true"
  9. # 删除所有未被任何容器使用的镜像
  10. docker image prune -a
复制代码

4. 容器运行

容器是Docker的运行实例,本节将详细介绍如何创建、运行、管理和维护Docker容器。

4.1 容器基本操作

使用docker run命令创建并启动一个新容器:
  1. # 基本容器运行
  2. docker run -d --name my-nginx -p 8080:80 nginx:latest
  3. # 交互式运行容器
  4. docker run -it --name my-oracle oraclelinux:8 /bin/bash
  5. # 运行容器并自动删除(退出后)
  6. docker run -rm --name my-temp oraclelinux:8 echo "Hello World"
  7. # 运行容器并设置环境变量
  8. docker run -d --name my-app \
  9.   -e APP_ENV=production \
  10.   -e DB_HOST=db.example.com \
  11.   my-app:latest
复制代码
  1. # 列出正在运行的容器
  2. docker ps
  3. # 列出所有容器(包括已停止的)
  4. docker ps -a
  5. # 列出最近创建的n个容器
  6. docker ps -n 5
  7. # 只显示容器ID
  8. docker ps -q
复制代码
  1. # 停止容器
  2. docker stop my-nginx
  3. # 启动已停止的容器
  4. docker start my-nginx
  5. # 重启容器
  6. docker restart my-nginx
  7. # 强制停止容器
  8. docker kill my-nginx
复制代码
  1. # 删除已停止的容器
  2. docker rm my-nginx
  3. # 强制删除运行中的容器
  4. docker rm -f my-nginx
  5. # 删除所有已停止的容器
  6. docker container prune
  7. # 删除所有容器(包括运行中的)
  8. docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
复制代码

4.2 容器资源限制和管理

在企业环境中,对容器资源进行限制和管理非常重要,以确保系统稳定性和性能。
  1. # 限制容器内存使用为512MB
  2. docker run -d --name my-app --memory="512m" my-app:latest
  3. # 限制容器内存使用为1GB,并设置swap为2GB
  4. docker run -d --name my-app --memory="1g" --memory-swap="2g" my-app:latest
  5. # 禁用swap
  6. docker run -d --name my-app --memory="1g" --memory-swap="1g" my-app:latest
复制代码
  1. # 限制容器使用0.5个CPU
  2. docker run -d --name my-app --cpus="0.5" my-app:latest
  3. # 设置容器使用CPU的权重(默认1024)
  4. docker run -d --name my-app --cpu-shares=512 my-app:latest
  5. # 限制容器只能使用CPU 0和1
  6. docker run -d --name my-app --cpuset-cpus="0,1" my-app:latest
复制代码
  1. # 限制容器读取速率为10MB/s
  2. docker run -d --name my-app --device-read-bps /dev/sda:10mb my-app:latest
  3. # 限制容器写入速率为5MB/s
  4. docker run -d --name my-app --device-write-bps /dev/sda:5mb my-app:latest
  5. # 限制容器读取IOPS为1000
  6. docker run -d --name my-app --device-read-iops /dev/sda:1000 my-app:latest
复制代码

4.3 数据持久化

容器默认是无状态的,数据会随着容器删除而丢失。为了持久化数据,需要使用卷或绑定挂载。
  1. # 创建一个命名卷
  2. docker volume create my-app-data
  3. # 使用命名卷运行容器
  4. docker run -d --name my-app -v my-app-data:/app/data my-app:latest
  5. # 查看卷列表
  6. docker volume ls
  7. # 查看卷详细信息
  8. docker volume inspect my-app-data
  9. # 删除卷
  10. docker volume rm my-app-data
  11. # 删除未使用的卷
  12. docker volume prune
复制代码
  1. # 使用主机目录挂载到容器
  2. docker run -d --name my-app \
  3.   -v /host/path/to/data:/app/data \
  4.   my-app:latest
  5. # 以只读方式挂载
  6. docker run -d --name my-app \
  7.   -v /host/path/to/config:/app/config:ro \
  8.   my-app:latest
复制代码
  1. # 为容器添加临时文件系统
  2. docker run -d --name my-app \
  3.   --tmpfs /app/temp:rw,size=100m \
  4.   my-app:latest
复制代码

4.4 网络配置

Docker提供了多种网络模式,可以根据需要配置容器网络。
  1. # 创建一个bridge网络
  2. docker network create my-app-network
  3. # 使用自定义网络运行容器
  4. docker run -d --name my-app --network my-app-network my-app:latest
  5. # 将容器连接到多个网络
  6. docker network connect my-app-network my-app
  7. # 断开容器与网络的连接
  8. docker network disconnect my-app-network my-app
  9. # 查看网络列表
  10. docker network ls
  11. # 查看网络详细信息
  12. docker network inspect my-app-network
  13. # 删除网络
  14. docker network rm my-app-network
复制代码
  1. # 将容器的80端口映射到主机的8080端口
  2. docker run -d --name my-app -p 8080:80 my-app:latest
  3. # 将容器的80端口映射到主机的所有可用接口的8080端口
  4. docker run -d --name my-app -p 0.0.0.0:8080:80 my-app:latest
  5. # 将容器的80端口映射到主机的随机端口
  6. docker run -d --name my-app -p 80 my-app:latest
  7. # 映射多个端口
  8. docker run -d --name my-app -p 8080:80 -p 8443:443 my-app:latest
复制代码
  1. # 使用--link选项(旧方法,不推荐)
  2. docker run -d --name my-web --link my-db:db my-web-app:latest
  3. # 使用自定义网络(推荐方法)
  4. docker network create my-app-net
  5. docker run -d --name my-db --network my-app-net my-db:latest
  6. docker run -d --name my-web --network my-app-net my-web-app:latest
  7. # 在容器中使用DNS名称访问其他容器
  8. # 例如,在my-web容器中,可以使用主机名"my-db"访问数据库容器
复制代码

4.5 容器编排

对于复杂的应用,可能需要同时管理多个容器。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。
  1. # 下载Docker Compose二进制文件
  2. 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
  3. # 添加执行权限
  4. sudo chmod +x /usr/local/bin/docker-compose
  5. # 创建软链接
  6. sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  7. # 验证安装
  8. docker-compose --version
复制代码

创建一个简单的Web应用和数据库的docker-compose.yml文件:
  1. version: '3'
  2. services:
  3.   web:
  4.     image: nginx:latest
  5.     ports:
  6.       - "8080:80"
  7.     volumes:
  8.       - ./html:/usr/share/nginx/html
  9.     networks:
  10.       - app-network
  11.     depends_on:
  12.       - db
  13.   db:
  14.     image: oracle/database:12.2.0.1-ee
  15.     environment:
  16.       - DB_SID=ORCLCDB
  17.       - DB_PDB=ORCLPDB1
  18.       - DB_PASSWD=Oracle123
  19.     volumes:
  20.       - db-data:/opt/oracle/oradata
  21.     networks:
  22.       - app-network
  23. networks:
  24.   app-network:
  25.     driver: bridge
  26. volumes:
  27.   db-data:
复制代码

使用Docker Compose管理应用:
  1. # 启动服务
  2. docker-compose up -d
  3. # 查看服务状态
  4. docker-compose ps
  5. # 查看服务日志
  6. docker-compose logs
  7. # 停止服务
  8. docker-compose down
  9. # 停止服务并删除卷
  10. docker-compose down -v
  11. # 重新构建并启动服务
  12. docker-compose up -d --build
复制代码

4.6 容器监控

监控容器状态和资源使用情况对于维护企业级应用至关重要。
  1. # 查看容器资源使用情况
  2. docker stats
  3. # 持续查看指定容器的资源使用情况
  4. docker stats my-app
  5. # 查看容器进程
  6. docker top my-app
  7. # 查看容器日志
  8. docker logs my-app
  9. # 持续跟踪容器日志
  10. docker logs -f my-app
  11. # 查看容器最近的日志
  12. docker logs --tail 100 my-app
  13. # 查看容器特定时间段的日志
  14. docker logs --since 2023-05-01T00:00:00 --until 2023-05-02T00:00:00 my-app
复制代码
  1. # 获取Docker事件
  2. docker events
  3. # 过滤特定容器的事件
  4. docker events -f container=my-app
  5. # 过滤特定事件类型
  6. docker events -f event=stop
复制代码

在Dockerfile中定义健康检查:
  1. FROM nginx:latest
  2. # 健康检查
  3. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  4.   CMD curl -f http://localhost/ || exit 1
复制代码

或者,在docker-compose.yml中定义:
  1. version: '3'
  2. services:
  3.   web:
  4.     image: nginx:latest
  5.     healthcheck:
  6.       test: ["CMD", "curl", "-f", "http://localhost/"]
  7.       interval: 30s
  8.       timeout: 10s
  9.       retries: 3
  10.       start_period: 40s
复制代码

查看容器健康状态:
  1. # 查看容器健康状态
  2. docker inspect --format='{{.State.Health.Status}}' my-app
复制代码

5. 故障排除实战技巧

在运行Docker容器时,难免会遇到各种问题。本节将介绍一些常见的故障及其解决方法,以及实用的故障排除技巧。

5.1 常见问题和解决方案

问题:容器启动后立即退出。

解决方法:
  1. # 查看容器日志
  2. docker logs my-app
  3. # 以交互模式运行容器以调试
  4. docker run -it --entrypoint /bin/bash my-app-image
  5. # 检查容器状态
  6. docker inspect my-app | grep "Status"
复制代码

常见原因:

• 应用程序错误或崩溃
• 缺少必要的依赖或配置
• 健康检查失败
• 资源限制过严格

问题:容器无法访问外部网络或服务。

解决方法:
  1. # 检查容器网络配置
  2. docker inspect my-app | grep -A 20 "NetworkSettings"
  3. # 在容器内测试网络连接
  4. docker exec my-app ping -c 4 google.com
  5. # 检查DNS配置
  6. docker exec my-app cat /etc/resolv.conf
  7. # 检查主机防火墙设置
  8. sudo firewall-cmd --list-all
复制代码

常见原因:

• DNS配置问题
• 防火墙阻止连接
• 网络配置错误
• 代理设置问题

问题:容器无法写入数据或性能低下。

解决方法:
  1. # 检查容器挂载点
  2. docker inspect -f '{{ .Mounts }}' my-app
  3. # 检查磁盘空间
  4. df -h
  5. # 检查Docker数据目录使用情况
  6. du -sh /var/lib/docker/*
  7. # 检查文件系统权限
  8. ls -la /host/path/to/data
复制代码

常见原因:

• 磁盘空间不足
• 文件系统权限问题
• 存储驱动兼容性问题
• I/O性能瓶颈

问题:容器因资源限制而被杀死或性能不佳。

解决方法:
  1. # 查看容器资源限制
  2. docker inspect my-app | grep -A 10 "Resources"
  3. # 查看容器资源使用情况
  4. docker stats my-app
  5. # 查看系统资源使用情况
  6. top
  7. free -h
  8. iostat
  9. # 检查内核日志
  10. dmesg | grep -i oom
复制代码

常见原因:

• 内存限制过低导致OOM Killer杀死进程
• CPU限制过严导致性能问题
• I/O限制导致磁盘操作缓慢

5.2 日志分析

日志是故障排除的重要工具,本节介绍如何有效收集和分析Docker日志。

Docker支持多种日志驱动,可以根据需要配置:
  1. # 修改Docker守护进程配置
  2. sudo vi /etc/docker/daemon.json
  3. # 添加日志配置
  4. {
  5.   "log-driver": "json-file",
  6.   "log-opts": {
  7.     "max-size": "10m",
  8.     "max-file": "3",
  9.     "compress": "true"
  10.   }
  11. }
  12. # 重启Docker服务
  13. sudo systemctl restart docker
复制代码

使用ELK(Elasticsearch, Logstash, Kibana)或EFK(Elasticsearch, Fluentd, Kibana)堆栈进行集中日志管理:
  1. # docker-compose.yml示例
  2. version: '3'
  3. services:
  4.   web:
  5.     image: my-app:latest
  6.     logging:
  7.       driver: "fluentd"
  8.       options:
  9.         fluentd-address: localhost:24224
  10.         tag: my-app
  11.   fluentd:
  12.     image: fluent/fluentd:v1.12-1
  13.     volumes:
  14.       - ./fluentd/conf:/fluentd/etc
  15.     ports:
  16.       - "24224:24224"
  17.       - "24224:24224/udp"
复制代码
  1. # 过滤错误日志
  2. docker logs my-app 2>&1 | grep ERROR
  3. # 统计错误数量
  4. docker logs my-app 2>&1 | grep -c ERROR
  5. # 查看特定时间段的日志
  6. docker logs --since 1h my-app
  7. # 实时监控日志并过滤
  8. docker logs -f my-app | grep "ERROR"
复制代码

5.3 性能调优

优化Docker性能可以提高应用响应速度并减少资源消耗。
  1. # 使用性能更好的存储驱动(如overlay2)
  2. sudo vi /etc/docker/daemon.json
  3. {
  4.   "storage-driver": "overlay2"
  5. }
  6. # 重启Docker服务
  7. sudo systemctl restart docker
  8. # 为容器使用单独的文件系统
  9. docker run -d --name my-app \
  10.   --storage-opt size=20G \
  11.   my-app:latest
复制代码
  1. # 调整内存交换行为
  2. docker run -d --name my-app \
  3.   --memory="1g" \
  4.   --memory-swappiness=0 \
  5.   my-app:latest
  6. # 使用内存限制
  7. docker run -d --name my-app \
  8.   --memory="1g" \
  9.   --memory-reservation="512m" \
  10.   my-app:latest
复制代码
  1. # 设置CPU亲和性
  2. docker run -d --name my-app \
  3.   --cpuset-cpus="0-1" \
  4.   my-app:latest
  5. # 设置CPU份额和优先级
  6. docker run -d --name my-app \
  7.   --cpu-shares=1024 \
  8.   --cpu-period=100000 \
  9.   --cpu-quota=50000 \
  10.   my-app:latest
复制代码

5.4 安全加固

在企业环境中,Docker安全至关重要。本节介绍一些Docker安全最佳实践。
  1. # 以非root用户运行容器
  2. docker run -d --name my-app \
  3.   -u 1000:1000 \
  4.   my-app:latest
  5. # 使用只读根文件系统
  6. docker run -d --name my-app \
  7.   --read-only \
  8.   my-app:latest
  9. # 限制容器能力
  10. docker run -d --name my-app \
  11.   --cap-drop ALL \
  12.   --cap-add NET_BIND_SERVICE \
  13.   my-app:latest
  14. # 使用安全配置文件
  15. docker run -d --name my-app \
  16.   --security-opt=no-new-privileges \
  17.   --security-opt=seccomp=/path/to/seccomp-profile.json \
  18.   my-app:latest
复制代码
  1. # 使用基础镜像的最小版本
  2. FROM oraclelinux:8-minimal
  3. # 定期更新基础镜像
  4. RUN dnf update -y && dnf clean all
  5. # 扫描镜像漏洞
  6. # 使用Docker Scout
  7. docker scout cve my-app:latest
  8. # 使用Trivy
  9. trivy image my-app:latest
  10. # 签名镜像
  11. # 安装Notary
  12. # 然后使用以下命令签名镜像
  13. docker trust sign my-app:latest
复制代码
  1. # 使用自定义网络隔离容器
  2. docker network create --internal my-isolated-network
  3. # 限制容器间通信
  4. docker run -d --name my-app \
  5.   --network my-isolated-network \
  6.   my-app:latest
  7. # 加密网络流量
  8. # 创建加密网络
  9. docker network create \
  10.   --opt encrypted \
  11.   my-encrypted-network
复制代码

5.5 备份和恢复策略

制定有效的备份和恢复策略对于企业级Docker部署至关重要。
  1. # 备份单个镜像
  2. docker save -o my-app-backup.tar my-app:latest
  3. # 备份所有镜像
  4. docker save -o all-images.tar $(docker images -q)
  5. # 编写备份脚本
  6. #!/bin/bash
  7. IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>")
  8. BACKUP_DIR="/backup/docker-images"
  9. DATE=$(date +%Y%m%d-%H%M%S)
  10. mkdir -p $BACKUP_DIR
  11. for image in $IMAGES; do
  12.   echo "Backing up $image"
  13.   docker save -o $BACKUP_DIR/$image-$DATE.tar $image
  14. done
复制代码
  1. # 备份命名卷
  2. docker run --rm \
  3.   -v my-app-data:/source \
  4.   -v $(pwd):/backup \
  5.   alpine tar czf /backup/my-app-data-backup.tar.gz -C /source .
  6. # 备份所有卷
  7. #!/bin/bash
  8. VOLUMES=$(docker volume ls -q)
  9. BACKUP_DIR="/backup/docker-volumes"
  10. DATE=$(date +%Y%m%d-%H%M%S)
  11. mkdir -p $BACKUP_DIR
  12. for volume in $VOLUMES; do
  13.   echo "Backing up volume $volume"
  14.   docker run --rm \
  15.     -v $volume:/source \
  16.     -v $BACKUP_DIR:/backup \
  17.     alpine tar czf /backup/$volume-$DATE.tar.gz -C /source .
  18. done
复制代码
  1. # 导出容器配置
  2. docker inspect my-app > my-app-config.json
  3. # 导出所有容器配置
  4. #!/bin/bash
  5. CONTAINERS=$(docker ps -a --format "{{.Names}}")
  6. BACKUP_DIR="/backup/docker-containers"
  7. DATE=$(date +%Y%m%d-%H%M%S)
  8. mkdir -p $BACKUP_DIR
  9. for container in $CONTAINERS; do
  10.   echo "Backing up configuration for $container"
  11.   docker inspect $container > $BACKUP_DIR/$container-config-$DATE.json
  12. done
复制代码
  1. # 恢复镜像
  2. docker load -i my-app-backup.tar
  3. # 恢复卷
  4. docker run --rm \
  5.   -v my-app-data:/target \
  6.   -v $(pwd):/backup \
  7.   alpine tar xzf /backup/my-app-data-backup.tar.gz -C /target
  8. # 使用备份的配置重新创建容器
  9. # 从备份的JSON文件中提取必要的配置信息
  10. # 然后使用docker run命令重新创建容器
复制代码

使用cron作业实现定期备份:
  1. # 编辑crontab
  2. crontab -e
  3. # 添加以下内容以每天凌晨2点执行备份
  4. 0 2 * * * /path/to/backup-script.sh
  5. # 示例备份脚本
  6. #!/bin/bash
  7. BACKUP_DIR="/backup/docker"
  8. DATE=$(date +%Y%m%d-%H%M%S)
  9. RETENTION_DAYS=30
  10. # 创建备份目录
  11. mkdir -p $BACKUP_DIR/images
  12. mkdir -p $BACKUP_DIR/volumes
  13. mkdir -p $BACKUP_DIR/containers
  14. # 备份所有镜像
  15. echo "Backing up Docker images..."
  16. docker save -o $BACKUP_DIR/images/all-images-$DATE.tar $(docker images -q)
  17. # 备份所有卷
  18. echo "Backing up Docker volumes..."
  19. for volume in $(docker volume ls -q); do
  20.   docker run --rm \
  21.     -v $volume:/source \
  22.     -v $BACKUP_DIR/volumes:/backup \
  23.     alpine tar czf /backup/$volume-$DATE.tar.gz -C /source .
  24. done
  25. # 备份容器配置
  26. echo "Backing up container configurations..."
  27. for container in $(docker ps -a --format "{{.Names}}"); do
  28.   docker inspect $container > $BACKUP_DIR/containers/$container-config-$DATE.json
  29. done
  30. # 删除旧备份
  31. echo "Cleaning up old backups..."
  32. find $BACKUP_DIR -type f -name "*$(date -d "$RETENTION_DAYS days ago" +%Y%m%d)*" -delete
  33. echo "Backup completed successfully."
复制代码

结语

本指南详细介绍了在Oracle Linux企业级环境中安装、配置和管理Docker的完整流程,从基础环境搭建到镜像管理、容器运行和故障排除。通过遵循本指南中的最佳实践和技巧,您可以构建一个稳定、安全且高性能的Docker环境,满足企业级应用的需求。

随着Docker技术的不断发展,建议持续关注Docker和容器生态系统的最新发展,定期更新您的知识和技能,以便充分利用这一强大的容器化平台。

希望本指南能够帮助您成功部署和管理企业级Oracle Linux系统中的Docker环境。如有任何问题或需要进一步的帮助,请参考Docker官方文档或寻求专业技术支持。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则