活动公告

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

Fedora系统下Docker容器化部署实战详解从环境搭建到容器管理优化提升开发运维效率的全方位指南

SunJu_FaceMall

3万

主题

2720

科技点

3万

积分

执行版主

碾压王

积分
32881

塔罗立华奏

执行版主 发表于 2025-8-31 16:30:00 | 显示全部楼层 |阅读模式

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

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

x
1. 引言

容器化技术已经成为现代软件开发和运维的标准实践,而Docker作为容器化技术的领导者,提供了轻量级、可移植的应用打包和运行环境。Fedora作为一个先进的Linux发行版,对Docker有着良好的支持。本文将详细介绍在Fedora系统下如何从零开始搭建Docker环境,进行容器化部署,并通过优化容器管理来提升开发和运维效率。

2. Fedora系统下Docker环境搭建

2.1 系统要求与准备工作

在开始安装Docker之前,确保你的Fedora系统满足以下要求:

• Fedora 34或更高版本
• 系统已更新到最新状态
• 拥有sudo权限的用户账户

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

2.2 安装Docker

Fedora官方仓库中已经包含了Docker,但为了获取最新版本,我们将添加Docker官方仓库:
  1. sudo dnf -y install dnf-plugins-core
  2. sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
复制代码

接下来,安装Docker CE(社区版)及其相关组件:
  1. sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
复制代码

2.3 启动并验证Docker服务

安装完成后,启动Docker服务并设置为开机自启:
  1. sudo systemctl start docker
  2. sudo systemctl enable docker
复制代码

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

如果看到欢迎消息,说明Docker已成功安装。

2.4 配置用户权限

为了避免每次使用Docker命令都需要sudo,可以将当前用户添加到docker组:
  1. sudo usermod -aG docker $USER
复制代码

注意:执行此命令后,需要注销并重新登录才能使更改生效。

3. Docker基础概念和命令

3.1 Docker核心概念

在深入使用Docker之前,理解以下几个核心概念非常重要:

• 镜像(Image):一个只读的模板,用于创建容器。
• 容器(Container):镜像的运行实例,可以被启动、停止、删除等。
• 仓库(Repository):用于存储和分发镜像的地方。
• Dockerfile:一个文本文件,包含构建镜像的所有命令。
• 数据卷(Volume):用于持久化和共享容器数据的机制。

3.2 常用Docker命令
  1. # 搜索镜像
  2. docker search nginx
  3. # 拉取镜像
  4. docker pull nginx:latest
  5. # 查看本地镜像
  6. docker images
  7. # 删除镜像
  8. docker rmi nginx:latest
  9. # 构建镜像
  10. docker build -t myapp:1.0 .
复制代码
  1. # 运行容器
  2. docker run -d --name mynginx -p 8080:80 nginx:latest
  3. # 查看运行中的容器
  4. docker ps
  5. # 查看所有容器(包括已停止的)
  6. docker ps -a
  7. # 停止容器
  8. docker stop mynginx
  9. # 启动已停止的容器
  10. docker start mynginx
  11. # 重启容器
  12. docker restart mynginx
  13. # 删除容器
  14. docker rm mynginx
  15. # 进入容器
  16. docker exec -it mynginx /bin/bash
  17. # 查看容器日志
  18. docker logs mynginx
复制代码
  1. # 创建数据卷
  2. docker volume create myvolume
  3. # 查看数据卷
  4. docker volume ls
  5. # 查看数据卷详情
  6. docker volume inspect myvolume
  7. # 删除数据卷
  8. docker volume rm myvolume
复制代码

4. 容器化应用部署实战

4.1 容器化一个简单的Web应用

让我们以一个简单的Python Flask应用为例,展示如何将其容器化。

首先,创建项目目录和文件:
  1. mkdir myflaskapp
  2. cd myflaskapp
复制代码

创建app.py文件:
  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def hello():
  5.     return "Hello from Dockerized Flask App!"
  6. if __name__ == '__main__':
  7.     app.run(host='0.0.0.0', port=5000)
复制代码

创建requirements.txt文件:
  1. Flask==2.0.1
复制代码

创建Dockerfile:
  1. # 使用官方Python运行时作为基础镜像
  2. FROM python:3.9-slim
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制requirements.txt文件
  6. COPY requirements.txt .
  7. # 安装依赖
  8. RUN pip install --no-cache-dir -r requirements.txt
  9. # 复制应用代码
  10. COPY . .
  11. # 设置环境变量
  12. ENV FLASK_APP=app.py
  13. # 暴露端口
  14. EXPOSE 5000
  15. # 运行应用
  16. CMD ["flask", "run", "--host=0.0.0.0"]
复制代码

4.2 构建并运行容器

在项目根目录下执行以下命令构建镜像:
  1. docker build -t myflaskapp:1.0 .
复制代码

构建完成后,运行容器:
  1. docker run -d --name flaskapp -p 5000:5000 myflaskapp:1.0
复制代码

现在,可以通过访问http://localhost:5000来查看应用。

4.3 使用Docker Compose编排多容器应用

对于更复杂的应用,通常需要多个容器协同工作。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。

以一个Web应用加数据库的例子,创建docker-compose.yml文件:
  1. version: '3.8'
  2. services:
  3.   web:
  4.     build: .
  5.     ports:
  6.       - "5000:5000"
  7.     depends_on:
  8.       - db
  9.     environment:
  10.       - DATABASE_URL=postgresql://user:password@db:5432/mydb
  11.     volumes:
  12.       - .:/app
  13.     command: flask run --host=0.0.0.0
  14.   db:
  15.     image: postgres:13
  16.     environment:
  17.       - POSTGRES_USER=user
  18.       - POSTGRES_PASSWORD=password
  19.       - POSTGRES_DB=mydb
  20.     volumes:
  21.       - postgres_data:/var/lib/postgresql/data/
  22. volumes:
  23.   postgres_data:
复制代码

使用以下命令启动所有服务:
  1. docker-compose up -d
复制代码

查看服务状态:
  1. docker-compose ps
复制代码

停止服务:
  1. docker-compose down
复制代码

5. 容器管理与优化

5.1 资源限制管理

在生产环境中,限制容器资源使用是非常重要的。Docker提供了多种方式来限制容器的资源使用。
  1. # 限制容器使用最多512MB内存
  2. docker run -d --name limited-mem -m 512m nginx:latest
  3. # 限制容器使用最多512MB内存,其中最多256MB可用于交换空间
  4. docker run -d --name limited-mem-swap --memory=512m --memory-swap=768m nginx:latest
复制代码
  1. # 限制容器使用最多0.5个CPU(50%)
  2. docker run -d --name limited-cpu --cpus=0.5 nginx:latest
  3. # 限制容器只能使用CPU 0和CPU 1
  4. docker run -d --name limited-cpu-cores --cpuset-cpus=0,1 nginx:latest
复制代码

5.2 容器监控
  1. # 查看所有运行容器的资源使用情况
  2. docker stats
  3. # 查看特定容器的资源使用情况
  4. docker stats container_name
复制代码

cAdvisor是Google开发的容器监控工具,可以提供详细的容器资源使用数据。
  1. # 运行cAdvisor
  2. docker run -d \
  3.   --name=cadvisor \
  4.   --volume=/:/rootfs:ro \
  5.   --volume=/var/run:/var/run:ro \
  6.   --volume=/sys:/sys:ro \
  7.   --volume=/var/lib/docker/:/var/lib/docker:ro \
  8.   --volume=/dev/disk/:/dev/disk:ro \
  9.   --publish=8080:8080 \
  10.   --detach=true \
  11.   --privileged \
  12.   gcr.io/cadvisor/cadvisor:latest
复制代码

访问http://localhost:8080查看监控数据。

5.3 容器日志管理

Docker支持多种日志驱动,可以根据需求选择合适的日志驱动。
  1. # 使用json-file日志驱动(默认)
  2. docker run -d --name log-json --log-driver json-file nginx:latest
  3. # 使用syslog日志驱动
  4. docker run -d --name log-syslog --log-driver syslog nginx:latest
  5. # 使用journald日志驱动(适合Fedora系统)
  6. docker run -d --name log-journald --log-driver journald nginx:latest
复制代码

为了避免日志文件占用过多磁盘空间,可以配置日志轮转:
  1. # 配置最大日志文件大小为10MB,保留3个日志文件
  2. docker run -d --name log-rotate \
  3.   --log-opt max-size=10m \
  4.   --log-opt max-file=3 \
  5.   nginx:latest
复制代码

5.4 容器网络管理
  1. # 创建一个bridge网络
  2. docker network create my-network
  3. # 查看网络列表
  4. docker network ls
  5. # 查看网络详情
  6. docker network inspect my-network
复制代码
  1. # 运行容器并连接到网络
  2. docker run -d --name container1 --network my-network nginx:latest
  3. # 将已运行的容器连接到网络
  4. docker run -d --name container2 nginx:latest
  5. docker network connect my-network container2
  6. # 从网络中断开容器
  7. docker network disconnect my-network container2
复制代码

6. 提升开发运维效率的最佳实践

6.1 使用Dockerfile优化镜像构建

多阶段构建可以帮助我们创建更小、更安全的镜像:
  1. # 第一阶段:构建应用
  2. FROM python:3.9-slim as builder
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install --user -r requirements.txt
  6. COPY . .
  7. RUN python setup.py install
  8. # 第二阶段:运行应用
  9. FROM python:3.9-slim
  10. WORKDIR /app
  11. COPY --from=builder /root/.local /root/.local
  12. COPY --from=builder /app /app
  13. ENV PATH=/root/.local/bin:$PATH
  14. CMD ["python", "app.py"]
复制代码

合理安排Dockerfile中的指令顺序,将不常变化的内容放在前面,常变化的内容放在后面:
  1. # 安装依赖(不常变化)
  2. FROM python:3.9-slim
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install -r requirements.txt
  6. # 复制应用代码(常变化)
  7. COPY . .
  8. # 运行应用
  9. CMD ["python", "app.py"]
复制代码

6.2 使用.dockerignore文件

类似于.gitignore文件,.dockerignore文件可以指定在构建镜像时忽略的文件和目录:
  1. # 忽略版本控制
  2. .git
  3. .gitignore
  4. # 忽略Python缓存
  5. __pycache__/
  6. *.pyc
  7. # 忽略测试和文档
  8. tests/
  9. docs/
  10. # 忽略临时文件
  11. *.tmp
  12. *.log
复制代码

6.3 健康检查

在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
复制代码

或者在运行容器时指定健康检查:
  1. docker run -d --name health-check \
  2.   --health-cmd="curl -f http://localhost/ || exit 1" \
  3.   --health-interval=30s \
  4.   --health-timeout=3s \
  5.   --health-retries=3 \
  6.   nginx:latest
复制代码

6.4 使用环境变量管理配置

通过环境变量管理应用配置,而不是将配置硬编码到镜像中:
  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN pip install -r requirements.txt
  5. COPY . .
  6. # 设置环境变量
  7. ENV FLASK_ENV=production
  8. ENV DATABASE_URL=postgresql://user:password@db:5432/mydb
  9. CMD ["python", "app.py"]
复制代码

运行容器时可以覆盖环境变量:
  1. docker run -d --name myapp \
  2.   -e FLASK_ENV=development \
  3.   -e DATABASE_URL=postgresql://user:password@db:5432/devdb \
  4.   myapp:latest
复制代码

6.5 使用命名卷和绑定挂载管理数据
  1. # 创建命名卷
  2. docker volume create app_data
  3. # 使用命名卷
  4. docker run -d --name myapp -v app_data:/app/data myapp:latest
复制代码
  1. # 将主机目录挂载到容器
  2. docker run -d --name myapp -v /path/on/host:/path/in/container myapp:latest
  3. # 只读挂载
  4. docker run -d --name myapp -v /path/on/host:/path/in/container:ro myapp:latest
复制代码

7. 安全最佳实践

7.1 使用非root用户运行容器

默认情况下,容器中的进程以root用户运行,这存在安全风险。应该在Dockerfile中创建并切换到非root用户:
  1. FROM python:3.9-slim
  2. # 创建非root用户
  3. RUN groupadd -r appuser && useradd -r -g appuser appuser
  4. WORKDIR /app
  5. COPY requirements.txt .
  6. RUN pip install -r requirements.txt
  7. COPY . .
  8. # 切换到非root用户
  9. USER appuser
  10. CMD ["python", "app.py"]
复制代码

7.2 限制容器能力
  1. # 使用--cap-drop和--cap-add控制容器能力
  2. docker run -d --name secure-container \
  3.   --cap-drop ALL \
  4.   --cap-add CHOWN \
  5.   --cap-add NET_BIND_SERVICE \
  6.   nginx:latest
复制代码

7.3 使用只读根文件系统
  1. # 使用--read-only标志运行容器
  2. docker run -d --name readonly-container \
  3.   --read-only \
  4.   -v /tmp:/tmp:rw \
  5.   nginx:latest
复制代码

7.4 使用安全扫描工具
  1. # 安装Docker Bench for Security
  2. git clone https://github.com/docker/docker-bench-security.git
  3. cd docker-bench-security
  4. sudo sh docker-bench-security.sh
复制代码

8. 持续集成/持续部署(CI/CD)与Docker

8.1 使用GitHub Actions自动化构建和部署

创建.github/workflows/docker.yml文件:
  1. name: Build and Push Docker Image
  2. on:
  3.   push:
  4.     branches: [ main ]
  5.   pull_request:
  6.     branches: [ main ]
  7. jobs:
  8.   build-and-push:
  9.     runs-on: ubuntu-latest
  10.     steps:
  11.     - uses: actions/checkout@v2
  12.    
  13.     - name: Set up Docker Buildx
  14.       uses: docker/setup-buildx-action@v1
  15.       
  16.     - name: Login to DockerHub
  17.       uses: docker/login-action@v1
  18.       with:
  19.         username: ${{ secrets.DOCKERHUB_USERNAME }}
  20.         password: ${{ secrets.DOCKERHUB_TOKEN }}
  21.         
  22.     - name: Build and push
  23.       uses: docker/build-push-action@v2
  24.       with:
  25.         context: .
  26.         push: ${{ github.event_name != 'pull_request' }}
  27.         tags: user/myapp:latest
复制代码

8.2 使用GitLab CI/CD自动化构建和部署

创建.gitlab-ci.yml文件:
  1. image: docker:latest
  2. services:
  3.   - docker:dind
  4. variables:
  5.   DOCKER_DRIVER: overlay2
  6. stages:
  7.   - build
  8.   - deploy
  9. build:
  10.   stage: build
  11.   script:
  12.     - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
  13.     - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  14. deploy:
  15.   stage: deploy
  16.   script:
  17.     - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  18.     - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
  19.     - docker push $CI_REGISTRY_IMAGE:latest
  20.   only:
  21.     - main
复制代码

9. 故障排除与常见问题

9.1 容器启动失败

检查容器日志:
  1. docker logs container_name
复制代码

检查容器状态:
  1. docker inspect container_name
复制代码

9.2 网络连接问题

检查容器网络配置:
  1. docker network inspect network_name
复制代码

测试容器网络连通性:
  1. docker run --rm --net=network_name alpine ping container_name
复制代码

9.3 存储问题

检查数据卷:
  1. docker volume inspect volume_name
复制代码

检查磁盘使用情况:
  1. docker system df
复制代码

清理未使用的资源:
  1. docker system prune -a
复制代码

10. 总结与展望

本文详细介绍了在Fedora系统下使用Docker进行容器化部署的完整流程,从环境搭建到容器管理优化,涵盖了开发运维的各个方面。通过遵循本文提供的最佳实践,可以显著提升开发和运维效率,降低系统复杂性,提高应用的可移植性和可扩展性。

随着容器技术的不断发展,Docker生态系统也在不断壮大。未来,我们可以期待更多创新功能的出现,如更好的安全机制、更高效的资源管理、更智能的容器编排等。同时,容器技术与云计算、微服务架构、DevOps等领域的融合也将更加深入。

作为开发者或运维人员,掌握Docker容器技术已经成为必备技能。希望通过本文的指导,读者能够在Fedora系统上熟练使用Docker,并将其应用到实际项目中,为软件开发和运维工作带来更大的价值。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

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

本版积分规则