简体中文 繁體中文 English Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français Japanese

站内搜索

搜索
AI 风月

活动公告

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

CentOS容器运行部署详解从环境搭建到服务上线的完整流程与注意事项及性能优化技巧

3万

主题

586

科技点

3万

积分

白金月票

碾压王

积分
32701

立华奏

发表于 2025-8-28 13:20:00 | 显示全部楼层 |阅读模式

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

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

x
引言

CentOS作为企业级Linux发行版,在服务器领域有着广泛的应用。随着容器技术的兴起,将CentOS应用容器化部署已成为现代运维和开发的重要技能。容器化部署不仅能提高资源利用率,还能简化应用管理和迁移过程。本文将详细介绍在CentOS系统上进行容器运行部署的完整流程,从环境搭建到服务上线,并分享其中的注意事项和性能优化技巧。

环境搭建

系统要求与准备

在开始CentOS容器部署之前,需要确保系统满足以下基本要求:

• CentOS 7或更高版本(推荐使用CentOS 7/8/Stream)
• 至少2GB RAM(推荐4GB以上)
• 足够的磁盘空间(至少20GB可用空间)
• 稳定的网络连接
• 具有sudo权限的用户账户

首先,更新系统到最新状态:
  1. sudo yum update -y
复制代码

安装容器运行时

CentOS支持多种容器运行时,最常用的是Docker和Podman。下面分别介绍这两种运行时的安装方法。

1. 安装必要的软件包:
  1. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码

1. 添加Docker仓库:
  1. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
复制代码

1. 安装Docker CE:
  1. sudo yum install -y docker-ce docker-ce-cli containerd.io
复制代码

1. 启动Docker服务并设置开机自启:
  1. sudo systemctl start docker
  2. sudo systemctl enable docker
复制代码

1. 验证Docker安装:
  1. sudo docker run hello-world
复制代码

Podman是Red Hat系系统(包括CentOS)推荐的容器管理工具,它无需守护进程,更加安全。

1. 安装Podman:
  1. sudo yum install -y podman
复制代码

1. 验证Podman安装:
  1. podman run hello-world
复制代码

配置容器存储

容器镜像和容器本身会占用大量存储空间,合理配置存储非常重要。

1. 创建专用的存储分区(可选):
  1. # 假设新磁盘为/dev/sdb
  2. sudo fdisk /dev/sdb  # 创建分区
  3. sudo mkfs.xfs /dev/sdb1  # 格式化为XFS文件系统
  4. sudo mkdir -p /var/lib/containers
  5. sudo mount /dev/sdb1 /var/lib/containers
  6. echo "/dev/sdb1 /var/lib/containers xfs defaults 0 0" | sudo tee -a /etc/fstab
复制代码

1. 为Docker配置存储驱动(如果使用Docker):
  1. sudo mkdir -p /etc/docker
  2. cat <<EOF | sudo tee /etc/docker/daemon.json
  3. {
  4.   "storage-driver": "overlay2",
  5.   "graph": "/var/lib/containers/docker"
  6. }
  7. EOF
  8. sudo systemctl restart docker
复制代码

网络配置

容器网络是容器化部署的重要组成部分。根据需求选择合适的网络配置。

1. 检查网络插件状态:
  1. # 对于Docker
  2. sudo docker network ls
  3. # 对于Podman
  4. podman network ls
复制代码

1. 创建自定义网络(示例):
  1. # Docker
  2. sudo docker network create --driver bridge --subnet=192.168.100.0/24 my-network
  3. # Podman
  4. podman network create --driver bridge --subnet=192.168.100.0/24 my-network
复制代码

1. 配置防火墙规则:
  1. sudo firewall-cmd --permanent --zone=public --add-masquerade
  2. sudo firewall-cmd --reload
复制代码

容器基础

容器技术概述

容器是一种轻量级的虚拟化技术,它允许应用程序在隔离的环境中运行,共享主机操作系统的内核。与传统的虚拟机相比,容器具有以下优势:

• 更快的启动速度
• 更少的资源消耗
• 更高的部署密度
• 更好的可移植性

CentOS上的容器技术选择

在CentOS上,主要有以下几种容器技术选择:

1. Docker:最流行的容器平台,提供完整的容器生态系统。
2. Podman:无守护进程的容器引擎,兼容Docker CLI。
3. Buildah:专门用于构建OCI兼容容器的工具。
4. Skopeo:用于复制、检查、签名和修改容器镜像的工具。

容器镜像基础

容器镜像是容器运行的基础,它包含运行应用程序所需的所有依赖和配置。

1. 拉取CentOS官方镜像:
  1. # Docker
  2. sudo docker pull centos:centos7
  3. # Podman
  4. podman pull centos:centos7
复制代码

1. 查看本地镜像:
  1. # Docker
  2. sudo docker images
  3. # Podman
  4. podman images
复制代码

1. 构建自定义镜像(以Dockerfile为例):
  1. # 使用CentOS 7作为基础镜像
  2. FROM centos:centos7
  3. # 维护者信息
  4. MAINTAINER Your Name <your.email@example.com>
  5. # 安装必要的软件包
  6. RUN yum update -y && \
  7.     yum install -y httpd && \
  8.     yum clean all
  9. # 复制网站文件到容器
  10. COPY ./website /var/www/html/
  11. # 暴露80端口
  12. EXPOSE 80
  13. # 启动Apache服务
  14. CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
复制代码

构建镜像:
  1. # Docker
  2. sudo docker build -t my-centos-web:latest .
  3. # Podman
  4. podman build -t my-centos-web:latest .
复制代码

部署流程

应用准备

在部署容器之前,需要准备好应用程序和其依赖。

1. 创建应用目录结构:
  1. mkdir -p ~/my-app/{src,config,logs}
复制代码

1. 准备应用代码(示例:简单的Node.js应用):
  1. # 创建package.json
  2. cat <<EOF > ~/my-app/package.json
  3. {
  4.   "name": "my-node-app",
  5.   "version": "1.0.0",
  6.   "description": "Example Node.js application",
  7.   "main": "app.js",
  8.   "scripts": {
  9.     "start": "node app.js"
  10.   },
  11.   "dependencies": {
  12.     "express": "^4.17.1"
  13.   }
  14. }
  15. EOF
  16. # 创建应用文件
  17. cat <<EOF > ~/my-app/app.js
  18. const express = require('express');
  19. const app = express();
  20. const port = 3000;
  21. app.get('/', (req, res) => {
  22.   res.send('Hello from Node.js container!');
  23. });
  24. app.listen(port, () => {
  25.   console.log(\`App running at http://localhost:\${port}\`);
  26. });
  27. EOF
复制代码

容器化应用

1. 创建Dockerfile:
  1. cat <<EOF > ~/my-app/Dockerfile
  2. FROM node:14-alpine
  3. WORKDIR /app
  4. COPY package*.json ./
  5. RUN npm install
  6. COPY . .
  7. EXPOSE 3000
  8. CMD ["npm", "start"]
  9. EOF
复制代码

1. 构建应用镜像:
  1. # Docker
  2. cd ~/my-app
  3. sudo docker build -t my-node-app:1.0 .
  4. # Podman
  5. cd ~/my-app
  6. podman build -t my-node-app:1.0 .
复制代码

容器编排

对于复杂应用,可能需要多个容器协同工作。这里介绍使用Docker Compose进行容器编排。

1. 安装Docker Compose:
  1. 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
  2. sudo chmod +x /usr/local/bin/docker-compose
复制代码

1. 创建docker-compose.yml文件:
  1. version: '3'
  2. services:
  3.   web:
  4.     build: ./my-app
  5.     ports:
  6.       - "3000:3000"
  7.     volumes:
  8.       - ./my-app/logs:/app/logs
  9.     networks:
  10.       - app-network
  11.     restart: unless-stopped
  12.   redis:
  13.     image: redis:alpine
  14.     networks:
  15.       - app-network
  16.     restart: unless-stopped
  17. networks:
  18.   app-network:
  19.     driver: bridge
  20. volumes:
  21.   logs:
复制代码

1. 启动服务:
  1. cd ~/my-app
  2. sudo docker-compose up -d
复制代码

持续集成/持续部署(CI/CD)

为了实现自动化部署,可以结合CI/CD工具。以下是基于GitLab CI的示例:

1. 创建.gitlab-ci.yml文件:
  1. stages:
  2.   - build
  3.   - test
  4.   - deploy
  5. variables:
  6.   DOCKER_DRIVER: overlay2
  7.   DOCKER_TLS_CERTDIR: ""
  8.   IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  9. build_image:
  10.   stage: build
  11.   image: docker:latest
  12.   services:
  13.     - docker:dind
  14.   script:
  15.     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  16.     - docker build -t $IMAGE_TAG .
  17.     - docker push $IMAGE_TAG
  18. test_app:
  19.   stage: test
  20.   image: $IMAGE_TAG
  21.   script:
  22.     - npm test
  23. deploy_to_production:
  24.   stage: deploy
  25.   image: docker:latest
  26.   services:
  27.     - docker:dind
  28.   script:
  29.     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  30.     - docker pull $IMAGE_TAG
  31.     - docker tag $IMAGE_TAG $CI_REGISTRY_IMAGE:latest
  32.     - docker push $CI_REGISTRY_IMAGE:latest
  33.     - ssh $DEPLOY_SERVER "docker-compose -f /path/to/docker-compose.yml pull && docker-compose -f /path/to/docker-compose.yml up -d"
  34.   only:
  35.     - main
复制代码

服务上线与验证

1. 检查容器状态:
  1. # Docker
  2. sudo docker ps
  3. sudo docker logs container-id
  4. # Podman
  5. podman ps
  6. podman logs container-id
复制代码

1. 验证服务可用性:
  1. curl http://localhost:3000
复制代码

1. 设置健康检查:
  1. # 在docker-compose.yml中添加
  2. healthcheck:
  3.   test: ["CMD", "curl", "-f", "http://localhost:3000"]
  4.   interval: 30s
  5.   timeout: 10s
  6.   retries: 3
复制代码

注意事项

安全性考虑

容器安全是部署过程中不可忽视的重要方面。

1. 使用非root用户运行容器:
  1. # 在Dockerfile中添加
  2. RUN groupadd -r appuser && useradd -r -g appuser appuser
  3. USER appuser
复制代码

1. 限制容器能力:
  1. # Docker
  2. sudo docker run --cap-drop ALL --cap-add CHOWN my-image
  3. # Podman
  4. podman run --cap-drop ALL --cap-add CHOWN my-image
复制代码

1. 使用安全扫描工具检查镜像:
  1. # 安装Trivy
  2. sudo yum install -y https://github.com/aquasecurity/trivy/releases/download/v0.20.0/trivy_0.20.0_Linux-64bit.rpm
  3. # 扫描镜像
  4. trivy image my-node-app:1.0
复制代码

数据持久化

容器本身是无状态的,数据持久化需要特殊处理。

1. 使用卷(volume)管理数据:
  1. # Docker
  2. sudo docker volume create my-app-data
  3. sudo docker run -v my-app-data:/app/data my-image
  4. # Podman
  5. podman volume create my-app-data
  6. podman run -v my-app-data:/app/data my-image
复制代码

1. 使用绑定挂载:
  1. # Docker
  2. sudo docker run -v /host/path:/container/path my-image
  3. # Podman
  4. podman run -v /host/path:/container/path my-image
复制代码

日志管理

容器日志管理对于故障排查和系统监控至关重要。

1. 配置日志驱动:
  1. // /etc/docker/daemon.json
  2. {
  3.   "log-driver": "json-file",
  4.   "log-opts": {
  5.     "max-size": "10m",
  6.     "max-file": "3"
  7.   }
  8. }
复制代码

1. 使用日志收集工具(如ELK Stack):
  1. # docker-compose.yml片段
  2. logging:
  3.   driver: "syslog"
  4.   options:
  5.     syslog-address: "tcp://logstash:5000"
  6.     syslog-format: "rfc3164"
  7.     tag: "{{.ImageName}}/{{.Name}}/{{.ID}}"
复制代码

资源限制

合理设置资源限制可以防止单个容器耗尽系统资源。

1. 限制CPU使用:
  1. # Docker
  2. sudo docker run --cpus=1.5 my-image
  3. # Podman
  4. podman run --cpus=1.5 my-image
复制代码

1. 限制内存使用:
  1. # Docker
  2. sudo docker run --memory=512m my-image
  3. # Podman
  4. podman run --memory=512m my-image
复制代码

1. 设置磁盘IO限制:
  1. # Docker
  2. sudo docker run --device-read-bps /dev/sda:1mb my-image
  3. # Podman
  4. podman run --device-read-bps /dev/sda:1mb my-image
复制代码

性能优化

镜像优化

优化镜像大小和构建速度可以提高部署效率。

1. 使用多阶段构建:
  1. # 构建阶段
  2. FROM node:14 AS build
  3. WORKDIR /app
  4. COPY package*.json ./
  5. RUN npm install
  6. COPY . .
  7. RUN npm run build
  8. # 生产阶段
  9. FROM node:14-alpine
  10. WORKDIR /app
  11. COPY --from=build /app/dist ./dist
  12. COPY --from=build /app/node_modules ./node_modules
  13. COPY package*.json ./
  14. EXPOSE 3000
  15. CMD ["npm", "start"]
复制代码

1. 减少镜像层数:
  1. # 不好的做法 - 创建多层
  2. RUN yum update -y
  3. RUN yum install -y httpd
  4. RUN yum clean all
  5. # 好的做法 - 合并命令
  6. RUN yum update -y && \
  7.     yum install -y httpd && \
  8.     yum clean all
复制代码

1. 使用轻量级基础镜像:
  1. # 使用alpine版本
  2. FROM node:14-alpine
复制代码

容器运行时优化

优化容器运行参数可以提高性能。

1. 调整内存分配:
  1. # Docker
  2. sudo docker run --memory=512m --memory-swap=1g my-image
  3. # Podman
  4. podman run --memory=512m --memory-swap=1g my-image
复制代码

1. 优化存储性能:
  1. # 使用直接LVM卷作为存储后端
  2. sudo docker daemon --storage-opt dm.directlvm_device=/dev/sdb --storage-opt dm.directlvm_fs_type=xfs
复制代码

1. 调整网络参数:
  1. # 增加容器网络缓冲区大小
  2. sudo docker run --net-alias alias --sysctl net.core.rmem_max=16777216 my-image
复制代码

系统级优化

在宿主机级别进行优化可以提高整体容器性能。

1. 调整内核参数:
  1. # /etc/sysctl.conf
  2. net.core.somaxconn = 65535
  3. net.ipv4.tcp_max_syn_backlog = 65535
  4. net.ipv4.tcp_fin_timeout = 10
  5. net.ipv4.tcp_keepalive_time = 1200
  6. net.ipv4.tcp_max_tw_buckets = 10000
复制代码

1. 使用CPU亲和性:
  1. # 将容器绑定到特定CPU核心
  2. sudo docker run --cpuset-cpus=0-1 my-image
复制代码

1. 文件系统优化:
  1. # 为容器存储使用XFS文件系统
  2. sudo mkfs.xfs -f /dev/sdb1
  3. sudo mount /dev/sdb1 /var/lib/containers
复制代码

监控与调优

持续监控容器性能并根据需要进行调优。

1. 安装监控工具:
  1. # 安装cAdvisor
  2. sudo docker run \
  3.   --volume=/:/rootfs:ro \
  4.   --volume=/var/run:/var/run:rw \
  5.   --volume=/sys:/sys:ro \
  6.   --volume=/var/lib/docker/:/var/lib/docker:ro \
  7.   --publish=8080:8080 \
  8.   --detach=true \
  9.   --name=cadvisor \
  10.   google/cadvisor:latest
复制代码

1. 使用Prometheus和Grafana进行监控:
  1. # docker-compose.yml片段
  2. prometheus:
  3.   image: prom/prometheus:latest
  4.   volumes:
  5.     - ./prometheus.yml:/etc/prometheus/prometheus.yml
  6.   ports:
  7.     - "9090:9090"
  8. grafana:
  9.   image: grafana/grafana:latest
  10.   ports:
  11.     - "3000:3000"
  12.   depends_on:
  13.     - prometheus
复制代码

1. 性能分析:
  1. # 使用perf进行性能分析
  2. sudo perf top -p $(sudo docker inspect --format '{{.State.Pid}}' container-id)
复制代码

最佳实践

镜像管理

1. 使用版本控制管理镜像:为镜像使用语义化版本号维护镜像变更日志
2. 为镜像使用语义化版本号
3. 维护镜像变更日志
4. 定期更新基础镜像:FROM centos:centos7.9.2009
5. 定期清理无用镜像:
“`bashDockersudo docker image prune -f

使用版本控制管理镜像:

• 为镜像使用语义化版本号
• 维护镜像变更日志

定期更新基础镜像:
  1. FROM centos:centos7.9.2009
复制代码

定期清理无用镜像:
“`bash

sudo docker image prune -f

# Podman
   podman image prune -f
  1. ### 容器编排最佳实践
  2. 1. 使用声明式配置:
  3.    ```yaml
  4.    # docker-compose.yml示例
  5.    version: '3.8'
  6.    services:
  7.      web:
  8.        image: nginx:alpine
  9.        deploy:
  10.          replicas: 3
  11.          update_config:
  12.            parallelism: 1
  13.            delay: 10s
  14.          restart_policy:
  15.            condition: on-failure
复制代码

1.
  1. 实施健康检查:healthcheck:
  2. test: ["CMD", "curl", "-f", "http://localhost"]
  3. interval: 30s
  4. timeout: 10s
  5. retries: 3
  6. start_period: 40s
复制代码
2.
  1. 使用环境变量进行配置管理:
  2. “`yaml
  3. environment:RACK_ENV=productionSHOW=trueSESSION_SECRET
  4. env_file:./config.env”`
复制代码
3. RACK_ENV=production
4. SHOW=true
5.
  1. SESSION_SECRET
  2. env_file:
复制代码
6. ./config.env

实施健康检查:
  1. healthcheck:
  2. test: ["CMD", "curl", "-f", "http://localhost"]
  3. interval: 30s
  4. timeout: 10s
  5. retries: 3
  6. start_period: 40s
复制代码

使用环境变量进行配置管理:
“`yaml
environment:

• RACK_ENV=production
• SHOW=true
  1. SESSION_SECRET
  2. env_file:
复制代码
• ./config.env

”`

安全最佳实践

1.
  1. 使用内容信任(Docker Content Trust):export DOCKER_CONTENT_TRUST=1
  2. sudo docker pull my-image:tag
复制代码
2.
  1. 实施网络策略:
  2. “`yaml在Kubernetes中apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: app-network-policy
  6. spec:
  7. podSelector:
  8.    matchLabels:app: my-apppolicyTypes:IngressEgress
  9. ingress:from:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432
  10. egress:to:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432”`
复制代码
3. Ingress
4.
  1. Egress
  2. ingress:
复制代码
5.
  1. from:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432
  2. egress:
复制代码
6. to:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432
7.
  1. 定期进行安全审计:# 使用Dockle进行安全审计
  2. sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock goodwithtech/dockle my-image:tag
复制代码

使用内容信任(Docker Content Trust):
  1. export DOCKER_CONTENT_TRUST=1
  2. sudo docker pull my-image:tag
复制代码

实施网络策略:
“`yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-network-policy
spec:
podSelector:
   matchLabels:
  1. app: my-app
复制代码

policyTypes:

• Ingress
  1. Egress
  2. ingress:
复制代码
  1. from:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432
  2. egress:
复制代码
• to:- podSelector:matchLabels:app: databaseports:- protocol: TCPport: 5432
  1. - podSelector:
复制代码
  1. app: database
复制代码
  1. - protocol: TCP
复制代码
  1. - podSelector:
复制代码
  1. app: database
复制代码
  1. - protocol: TCP
复制代码

”`

定期进行安全审计:
  1. # 使用Dockle进行安全审计
  2. sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock goodwithtech/dockle my-image:tag
复制代码

备份与恢复策略

1.
  1. 容器备份:
  2. “`bash备份容器sudo docker commit container-id my-image:backup
复制代码

容器备份:
“`bash

sudo docker commit container-id my-image:backup

# 导出镜像
   sudo docker save -o my-image-backup.tar my-image:backup
  1. 2. 数据备份:
  2.    ```bash
  3.    # 使用卷备份
  4.    sudo docker run --rm -v my-volume:/volume -v $(pwd):/backup alpine tar cvf /backup/my-volume-backup.tar /volume
复制代码

1. 恢复策略:
“`bash恢复镜像sudo docker load -i my-image-backup.tar

恢复策略:
“`bash

sudo docker load -i my-image-backup.tar

# 恢复数据
   sudo docker run –rm -v my-volume:/volume -v $(pwd):/backup alpine sh -c “rm -rf /volume/* && tar xvf /backup/my-volume-backup.tar -C /”
   “`

结论

CentOS容器运行部署是一项复杂但极其有价值的技术实践。通过本文的详细介绍,我们从环境搭建到服务上线,全面了解了CentOS容器部署的完整流程,并探讨了其中的注意事项和性能优化技巧。

容器化部署不仅可以提高资源利用率和应用可移植性,还能简化运维工作,加快应用交付速度。然而,要充分发挥容器技术的优势,还需要结合实际情况灵活应用最佳实践,持续监控和优化系统性能。

随着技术的不断发展,CentOS容器生态系统也在持续演进。作为技术从业者,我们应当保持学习,关注最新的技术趋势,不断提升容器化部署和管理的能力,为企业数字化转型提供坚实的技术支持。

通过遵循本文提供的指导和建议,您可以有效地在CentOS环境中部署和管理容器化应用,实现从开发到生产的无缝过渡,并确保系统的高效、稳定和安全运行。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|联系我们|小黑屋|TG频道|RSS |网站地图

Powered by Pixtech

© 2025-2026 Pixtech Team.

>