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

站内搜索

搜索

活动公告

10-31 22:15
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

Debian系统下Docker容器完全攻略 从基础安装到高级部署的实战教程与问题解决方案

3万

主题

308

科技点

3万

积分

大区版主

木柜子打湿

积分
31891

财Doro三倍冰淇淋无人之境【一阶】立华奏小樱(小丑装)⑨的冰沙以外的星空【二阶】

发表于 2025-10-7 01:20:31 | 显示全部楼层 |阅读模式

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

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

x
1. Docker简介与核心概念

Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

1.1 Docker的核心组件

• Docker Engine:Docker的核心,用于创建和运行容器。
• Docker Image(镜像):一个只读的模板,用于创建容器。
• Docker Container(容器):镜像的运行实例。
• Docker Registry(仓库):用于存储和分发Docker镜像。
• Docker Compose:用于定义和运行多容器Docker应用程序的工具。
• Docker Swarm:Docker的原生集群管理工具。

1.2 容器与传统虚拟机的区别

传统虚拟机通过Hypervisor虚拟化整个硬件,每个虚拟机都有自己的操作系统,资源占用大,启动慢。而Docker容器共享主机操作系统内核,在用户空间中运行独立进程,资源占用小,启动快,更加轻量级。

2. Debian系统下Docker的安装

2.1 系统要求与准备工作

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

• 64位版本的Debian操作系统(推荐Debian 10 Buster或更高版本)
• 系统内核版本不低于3.10
• 拥有sudo权限的用户账户

首先,更新系统软件包并安装必要的依赖:
  1. sudo apt update
  2. sudo apt upgrade -y
  3. sudo apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
复制代码

2.2 添加Docker官方GPG密钥
  1. curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
复制代码

2.3 添加Docker官方仓库
  1. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
复制代码

2.4 安装Docker Engine
  1. sudo apt update
  2. sudo apt install -y docker-ce docker-ce-cli containerd.io
复制代码

2.5 验证Docker安装

安装完成后,运行以下命令验证Docker是否正确安装:
  1. sudo docker run hello-world
复制代码

如果看到”Hello from Docker!“的输出,表示Docker已成功安装。

2.6 将用户添加到docker组

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

注意:添加用户到docker组后,需要重新登录才能生效。

3. Docker基础使用

3.1 镜像管理

使用docker search命令搜索Docker Hub上的镜像:
  1. docker search nginx
复制代码

使用docker pull命令从Docker Hub拉取镜像:
  1. docker pull nginx:latest
复制代码

使用docker images命令查看本地已下载的镜像:
  1. docker images
复制代码

使用docker rmi命令删除本地镜像:
  1. docker rmi nginx:latest
复制代码

3.2 容器管理

使用docker run命令运行一个容器:
  1. docker run -d -p 8080:80 --name my-nginx nginx
复制代码

参数解释:

• -d:后台运行容器
• -p:将容器的80端口映射到主机的8080端口
• --name:为容器指定一个名称
• nginx:使用的镜像名称

使用docker ps命令查看运行中的容器:
  1. docker ps
复制代码

要查看所有容器(包括已停止的),添加-a参数:
  1. docker ps -a
复制代码
  1. # 停止容器
  2. docker stop my-nginx
  3. # 启动已停止的容器
  4. docker start my-nginx
  5. # 重启容器
  6. docker restart my-nginx
复制代码
  1. docker rm my-nginx
复制代码

如果要删除运行中的容器,需要先停止容器或使用-f参数强制删除:
  1. docker rm -f my-nginx
复制代码
  1. docker exec -it my-nginx /bin/bash
复制代码

参数解释:

• -i:保持标准输入开放
• -t:分配一个伪终端
• /bin/bash:在容器内启动的命令

3.3 数据管理

数据卷是Docker中用于持久化数据的首选机制,它独立于容器的生命周期。
  1. # 创建一个数据卷
  2. docker volume create my-data-volume
  3. # 查看数据卷
  4. docker volume ls
  5. # 使用数据卷启动容器
  6. docker run -d -p 3306:3306 --name my-mysql -v my-data-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:latest
复制代码

绑定挂载将主机上的文件或目录挂载到容器中:
  1. # 使用绑定挂载启动容器
  2. docker run -d -p 80:80 --name my-nginx -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro nginx
复制代码

参数解释:

• /host/path/nginx.conf:主机上的文件路径
• /etc/nginx/nginx.conf:容器内的路径
• :ro:以只读方式挂载

4. Docker高级部署

4.1 Dockerfile基础

Dockerfile是一个文本文件,包含了一系列指令,用于构建Docker镜像。

• FROM:指定基础镜像
• RUN:执行命令
• CMD:容器启动时执行的命令
• EXPOSE:声明容器暴露的端口
• ENV:设置环境变量
• ADD和COPY:将文件复制到镜像中
• WORKDIR:设置工作目录
• VOLUME:创建数据卷
• USER:设置用户
• ENTRYPOINT:配置容器启动时运行的命令

下面是一个简单的Node.js应用Dockerfile示例:
  1. # 使用官方Node.js运行时作为基础镜像
  2. FROM node:14
  3. # 设置工作目录
  4. WORKDIR /usr/src/app
  5. # 复制package.json和package-lock.json
  6. COPY package*.json ./
  7. # 安装应用依赖
  8. RUN npm install
  9. # 复制应用源代码
  10. COPY . .
  11. # 暴露应用端口
  12. EXPOSE 3000
  13. # 定义环境变量
  14. ENV NODE_ENV=production
  15. # 启动应用
  16. CMD ["node", "app.js"]
复制代码

使用docker build命令根据Dockerfile构建镜像:
  1. docker build -t my-node-app .
复制代码

参数解释:

• -t:为镜像指定名称和标签
• .:指定Dockerfile所在的目录

4.2 Docker Compose

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序的服务,然后使用一个命令创建并启动所有服务。
  1. sudo apt install docker-compose-plugin
复制代码

下面是一个简单的Web应用程序和数据库的docker-compose.yml示例:
  1. version: '3'
  2. services:
  3.   web:
  4.     build: .
  5.     ports:
  6.       - "5000:5000"
  7.     volumes:
  8.       - .:/code
  9.     environment:
  10.       FLASK_ENV: development
  11.     depends_on:
  12.       - redis
  13.   
  14.   redis:
  15.     image: "redis:alpine"
复制代码
  1. # 启动服务
  2. docker compose up
  3. # 后台启动服务
  4. docker compose up -d
  5. # 停止服务
  6. docker compose down
  7. # 查看服务状态
  8. docker compose ps
  9. # 查看服务日志
  10. docker compose logs
复制代码

4.3 Docker Swarm

Docker Swarm是Docker的原生集群管理工具,它将一组Docker主机转换为一个虚拟Docker主机。

在要作为管理节点的机器上运行:
  1. docker swarm init --advertise-addr <MANAGER_IP>
复制代码

在要作为worker节点的机器上运行管理节点输出的命令:
  1. docker swarm join --token <TOKEN> <MANAGER_IP>:2377
复制代码

创建一个docker-stack.yml文件:
  1. version: "3"
  2. services:
  3.   web:
  4.     image: nginx
  5.     ports:
  6.       - "80:80"
  7.     deploy:
  8.       replicas: 3
  9.       update_config:
  10.         parallelism: 1
  11.         delay: 10s
  12.       restart_policy:
  13.         condition: on-failure
  14.   visualizer:
  15.     image: dockersamples/visualizer:stable
  16.     ports:
  17.       - "8080:8080"
  18.     volumes:
  19.       - "/var/run/docker.sock:/var/run/docker.sock"
  20.     deploy:
  21.       placement:
  22.         constraints: [node.role == manager]
复制代码

部署堆栈:
  1. docker stack deploy -c docker-stack.yml myapp
复制代码
  1. # 查看服务列表
  2. docker service ls
  3. # 查看服务详情
  4. docker service inspect myapp_web
  5. # 扩展服务
  6. docker service scale myapp_web=5
  7. # 更新服务
  8. docker service update --image nginx:alpine myapp_web
  9. # 删除服务
  10. docker service rm myapp_web
复制代码

4.4 Docker网络

Docker提供了多种网络模式,使容器可以相互通信以及与外部网络通信。
  1. docker network ls
复制代码
  1. # 创建一个bridge网络
  2. docker network create my-network
  3. # 创建一个overlay网络(用于Swarm集群)
  4. docker network create --driver overlay my-overlay-network
复制代码
  1. # 运行容器并连接到网络
  2. docker run -d --name my-container --network my-network nginx
  3. # 将已运行的容器连接到网络
  4. docker network connect my-network my-container
复制代码
  1. docker network disconnect my-network my-container
复制代码
  1. docker network rm my-network
复制代码

4.5 Docker私有仓库

Docker私有仓库允许你存储和管理自己的Docker镜像。
  1. docker run -d -p 5000:5000 --restart=always --name registry registry:2
复制代码

编辑Docker配置文件/etc/docker/daemon.json,添加以下内容:
  1. {
  2.   "insecure-registries": ["<YOUR_REGISTRY_IP>:5000"]
  3. }
复制代码

重启Docker服务:
  1. sudo systemctl restart docker
复制代码
  1. # 标记镜像
  2. docker tag nginx:latest <YOUR_REGISTRY_IP>:5000/my-nginx:latest
  3. # 推送镜像
  4. docker push <YOUR_REGISTRY_IP>:5000/my-nginx:latest
复制代码
  1. docker pull <YOUR_REGISTRY_IP>:5000/my-nginx:latest
复制代码

5. Docker安全最佳实践

5.1 容器安全

在Dockerfile中创建并切换到非root用户:
  1. FROM ubuntu:latest
  2. RUN groupadd -r appuser && useradd -r -g appuser appuser
  3. USER appuser
复制代码
  1. # 限制容器内存使用
  2. docker run -d --memory="512m" nginx
  3. # 限制容器CPU使用
  4. docker run -d --cpus="1.5" nginx
复制代码
  1. docker run -d --read-only nginx
复制代码

5.2 镜像安全

优先使用Docker Hub上的官方镜像或经过验证的镜像。

定期检查并更新Dockerfile中的基础镜像版本。

使用Docker Scout或其他安全工具扫描镜像漏洞:
  1. docker scout cve nginx:latest
复制代码

6. 常见问题与解决方案

6.1 安装问题
  1. # 查看Docker服务状态
  2. sudo systemctl status docker
  3. # 启动Docker服务
  4. sudo systemctl start docker
  5. # 设置Docker服务开机自启
  6. sudo systemctl enable docker
复制代码
  1. # 解决依赖问题
  2. sudo apt --fix-broken install
  3. # 清理软件包缓存
  4. sudo apt clean
  5. sudo apt autoclean
  6. sudo apt autoremove
复制代码

6.2 权限问题
  1. # 将当前用户添加到docker组
  2. sudo usermod -aG docker $USER
  3. # 重新登录或刷新用户组
  4. newgrp docker
复制代码
  1. # 检查docker.sock文件权限
  2. ls -la /var/run/docker.sock
  3. # 如果需要,修改文件权限
  4. sudo chmod 666 /var/run/docker.sock
复制代码

6.3 网络问题
  1. # 检查Docker网络设置
  2. docker network inspect bridge
  3. # 重启Docker网络
  4. sudo systemctl restart docker
  5. # 或者尝试重启网络服务
  6. sudo systemctl restart networking
复制代码
  1. # 检查端口映射是否正确配置
  2. docker ps
  3. # 检查主机防火墙设置
  4. sudo iptables -L -n
  5. # 如果使用UFW,确保允许相关端口
  6. sudo ufw allow 8080
复制代码

6.4 存储问题
  1. # 查看Docker磁盘使用情况
  2. docker system df
  3. # 清理未使用的Docker对象
  4. docker system prune -a
  5. # 清理所有未使用的镜像
  6. docker image prune -a
  7. # 清理所有停止的容器
  8. docker container prune
复制代码
  1. # 检查主机路径是否存在
  2. ls -la /host/path
  3. # 检查路径权限
  4. ls -ld /host/path
  5. # 如果需要,修改路径权限
  6. sudo chmod 755 /host/path
复制代码

6.5 性能问题
  1. # 检查容器资源使用情况
  2. docker stats
  3. # 限制容器资源使用
  4. docker update --memory="1g" --cpus="1.0" <CONTAINER_ID>
  5. # 检查主机资源使用情况
  6. htop
  7. df -h
复制代码
  1. # 使用.dockerignore文件排除不必要的文件
  2. echo "node_modules" > .dockerignore
  3. echo ".git" >> .dockerignore
  4. echo "Dockerfile" >> .dockerignore
  5. # 优化Dockerfile,减少层数
  6. # 合并RUN指令
  7. RUN apt-get update && apt-get install -y \
  8.     package1 \
  9.     package2 \
  10.     package3 && \
  11.     rm -rf /var/lib/apt/lists/*
  12. # 使用多阶段构建减少镜像大小
复制代码

7. 实战案例:部署一个完整的Web应用栈

7.1 项目结构
  1. my-web-app/
  2. ├── docker-compose.yml
  3. ├── nginx/
  4. │   ├── Dockerfile
  5. │   └── nginx.conf
  6. ├── web/
  7. │   ├── Dockerfile
  8. │   ├── requirements.txt
  9. │   └── app.py
  10. └── db/
  11.     └── init.sql
复制代码

7.2 创建Web应用

web/app.py:
  1. from flask import Flask, jsonify
  2. import os
  3. import psycopg2
  4. app = Flask(__name__)
  5. def get_db_connection():
  6.     conn = psycopg2.connect(
  7.         host=os.environ.get('DB_HOST', 'db'),
  8.         database=os.environ.get('DB_NAME', 'myapp'),
  9.         user=os.environ.get('DB_USER', 'myuser'),
  10.         password=os.environ.get('DB_PASSWORD', 'mypassword')
  11.     )
  12.     return conn
  13. @app.route('/')
  14. def hello():
  15.     return "Hello from Flask!"
  16. @app.route('/data')
  17. def get_data():
  18.     conn = get_db_connection()
  19.     cur = conn.cursor()
  20.     cur.execute('SELECT * FROM data;')
  21.     data = cur.fetchall()
  22.     cur.close()
  23.     conn.close()
  24.     return jsonify(data)
  25. if __name__ == '__main__':
  26.     app.run(host='0.0.0.0', port=5000)
复制代码

web/requirements.txt:
  1. flask
  2. psycopg2-binary
复制代码

web/Dockerfile:
  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN pip install --no-cache-dir -r requirements.txt
  5. COPY . .
  6. CMD ["python", "app.py"]
复制代码

7.3 创建Nginx配置

nginx/nginx.conf:
  1. server {
  2.     listen 80;
  3.     server_name localhost;
  4.     location / {
  5.         proxy_pass http://web:5000;
  6.         proxy_set_header Host $host;
  7.         proxy_set_header X-Real-IP $remote_addr;
  8.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9.     }
  10. }
复制代码

nginx/Dockerfile:
  1. FROM nginx:alpine
  2. COPY nginx.conf /etc/nginx/conf.d/default.conf
复制代码

7.4 创建数据库初始化脚本

db/init.sql:
  1. CREATE DATABASE myapp;
  2. CREATE USER myuser WITH PASSWORD 'mypassword';
  3. GRANT ALL PRIVILEGES ON DATABASE myapp TO myuser;
  4. \c myapp;
  5. CREATE TABLE data (
  6.     id SERIAL PRIMARY KEY,
  7.     name VARCHAR(100),
  8.     value VARCHAR(100)
  9. );
  10. INSERT INTO data (name, value) VALUES ('example1', 'value1');
  11. INSERT INTO data (name, value) VALUES ('example2', 'value2');
复制代码

7.5 创建Docker Compose文件

docker-compose.yml:
  1. version: '3'
  2. services:
  3.   db:
  4.     image: postgres:13
  5.     environment:
  6.       POSTGRES_PASSWORD: postgrespassword
  7.     volumes:
  8.       - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
  9.       - postgres_data:/var/lib/postgresql/data
  10.     networks:
  11.       - app-network
  12.   web:
  13.     build: ./web
  14.     environment:
  15.       DB_HOST: db
  16.       DB_NAME: myapp
  17.       DB_USER: myuser
  18.       DB_PASSWORD: mypassword
  19.     depends_on:
  20.       - db
  21.     networks:
  22.       - app-network
  23.   nginx:
  24.     build: ./nginx
  25.     ports:
  26.       - "80:80"
  27.     depends_on:
  28.       - web
  29.     networks:
  30.       - app-network
  31. volumes:
  32.   postgres_data:
  33. networks:
  34.   app-network:
  35.     driver: bridge
复制代码

7.6 启动应用
  1. # 构建并启动所有服务
  2. docker compose up -d
  3. # 查看服务状态
  4. docker compose ps
  5. # 查看日志
  6. docker compose logs -f
复制代码

7.7 测试应用
  1. # 测试Web应用
  2. curl http://localhost
  3. # 测试数据库连接
  4. curl http://localhost/data
复制代码

7.8 扩展应用
  1. # 扩展Web服务到3个实例
  2. docker compose up -d --scale web=3
  3. # 查看扩展后的服务
  4. docker compose ps
复制代码

8. 总结与展望

本教程详细介绍了在Debian系统下使用Docker的全过程,从基础安装到高级部署,涵盖了Docker的核心概念、基本操作、高级特性和常见问题解决方案。通过实战案例,我们展示了如何使用Docker部署一个完整的Web应用栈。

Docker作为容器化技术的代表,已经成为现代软件开发和部署的重要工具。它提供了轻量级、可移植、自包含的软件打包方式,大大简化了应用的部署和管理流程。

随着云原生技术的发展,Docker也在不断演进。未来,我们可以期待Docker在以下方面的进一步发展:

1. 安全性增强:提供更强的隔离机制和安全特性。
2. 性能优化:进一步减少资源占用,提高容器启动速度。
3. 更好的集成:与Kubernetes等编排工具的更紧密集成。
4. 边缘计算支持:更好地支持边缘计算场景。
5. 开发者体验:提供更友好的开发工具和体验。

无论你是开发者、系统管理员还是DevOps工程师,掌握Docker技术都将为你的工作带来极大的便利。希望本教程能够帮助你更好地理解和使用Docker,在实际项目中发挥其强大的威力。
回复

使用道具 举报

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

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.