三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux系统下Docker安装与配置全指南

Linux系统下Docker安装与配置全指南

1. 为什么要在Linux上安装Docker?

作为一名长期在Linux环境下工作的开发者,我深刻理解容器化技术带来的变革。Docker作为目前最流行的容器引擎,能够帮助我们快速构建、部署和运行应用程序。与传统的虚拟机相比,Docker容器更加轻量级,启动速度更快,资源占用更少,特别适合现代微服务架构的开发部署需求。

在Linux上安装Docker有几个显著优势:

  • 原生支持:Docker最初就是为Linux设计的,在Linux上运行性能最佳
  • 资源利用率高:不需要像Windows或Mac那样运行额外的虚拟机层
  • 稳定性强:Linux内核的cgroups和namespace特性为容器提供了坚实的隔离基础
  • 社区支持完善:遇到问题时更容易找到解决方案和社区支持

注意:虽然Docker也支持Windows和Mac,但在这些系统上实际上是运行在一个Linux虚拟机中,性能会有一定损耗。

2. 安装前的准备工作

2.1 系统要求检查

在开始安装前,我们需要确认系统满足Docker的基本要求:

  1. 内核版本检查

    uname -r

    建议使用3.10或更高版本的Linux内核。我建议使用4.x或更高版本以获得更好的稳定性和功能支持。

  2. 存储驱动检查

    ls -l /sys/class/misc/device-mapper

    Docker需要device-mapper支持,这是大多数现代Linux发行版的标配。

  3. 虚拟化支持检查(可选):

    grep -E --color 'vmx|svm' /proc/cpuinfo

    如果你计划在Docker中运行需要硬件虚拟化的应用(如某些数据库),这个检查很重要。

2.2 卸载旧版本

如果你之前安装过旧版本的Docker(可能叫docker或docker-engine),建议先卸载它们以避免冲突:

sudo apt-get remove docker docker-engine docker.io containerd runc

2.3 设置仓库

Docker官方推荐通过仓库安装,这样可以方便后续的升级维护。我们需要先设置Docker的APT仓库:

sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release

然后添加Docker的官方GPG密钥:

sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

最后设置稳定版仓库:

echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3. Docker安装步骤详解

3.1 安装Docker引擎

更新APT包索引并安装最新版本的Docker引擎、containerd和Docker Compose:

sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

这个命令会安装Docker的核心组件:

  • docker-ce: Docker社区版
  • docker-ce-cli: Docker命令行工具
  • containerd.io: 容器运行时
  • docker-compose-plugin: Docker Compose V2

3.2 验证安装

安装完成后,运行hello-world镜像来验证Docker是否正确安装:

sudo docker run hello-world

如果看到"Hello from Docker!"的消息,说明安装成功。这个命令会自动下载测试镜像并在容器中运行它。

3.3 配置非root用户权限

默认情况下,Docker需要root权限才能运行命令。为了安全和使用方便,我们可以将当前用户添加到docker组:

sudo usermod -aG docker $USER

然后需要注销并重新登录,或者运行以下命令使更改立即生效:

newgrp docker

现在你可以不使用sudo直接运行Docker命令了:

docker run hello-world

4. 安装后的基本配置

4.1 设置Docker开机自启

大多数情况下,我们希望Docker在系统启动时自动运行:

sudo systemctl enable docker.service sudo systemctl enable containerd.service

4.2 配置镜像加速器

国内用户可能会遇到Docker Hub镜像下载慢的问题。我们可以配置国内镜像加速器:

  1. 创建或修改配置文件:

    sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.docker-cn.com"] } EOF
  2. 重新启动Docker服务:

    sudo systemctl daemon-reload sudo systemctl restart docker

国内常用的镜像加速地址包括:

  • 阿里云加速器(需要注册账号获取专属地址)
  • 网易云镜像中心:https://hub-mirror.c.163.com
  • 腾讯云镜像:https://mirror.ccs.tencentyun.com

4.3 配置日志和存储驱动

对于生产环境,建议调整Docker的日志和存储配置:

sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }, "storage-driver": "overlay2" } EOF

然后重启Docker服务:

sudo systemctl restart docker

5. 常见问题排查

5.1 虚拟化支持问题

如果你遇到类似"virtualization support not detected"的错误,可能是系统没有启用虚拟化支持:

  1. 检查BIOS中是否启用了虚拟化技术(Intel VT-x或AMD-V)
  2. 对于某些云服务器,可能需要联系云服务商开启虚拟化支持
  3. 在Linux上,可以检查内核模块是否加载:
    lsmod | grep kvm
    如果没有输出,可以尝试加载模块:
    sudo modprobe kvm sudo modprobe kvm_intel # Intel CPU # 或 sudo modprobe kvm_amd # AMD CPU

5.2 端口冲突问题

如果Docker启动失败,可能是端口冲突导致的。检查是否有其他服务占用了Docker默认的端口(如2375、2376):

sudo netstat -tulnp | grep 2375

5.3 存储空间不足

Docker默认将镜像和容器存储在/var/lib/docker目录下。如果这个分区空间不足,可以考虑:

  1. 清理无用镜像和容器:
    docker system prune -a
  2. 修改Docker的存储路径到更大的分区:
    sudo systemctl stop docker sudo rsync -aP /var/lib/docker /new/path/ sudo mv /var/lib/docker /var/lib/docker.bak sudo ln -s /new/path/docker /var/lib/docker sudo systemctl start docker

6. Docker基本使用入门

6.1 运行第一个容器

让我们运行一个Nginx web服务器:

docker run -d -p 8080:80 --name my-nginx nginx

这个命令做了以下几件事:

  • 从Docker Hub下载最新的nginx镜像(如果本地没有)
  • 创建一个新的容器并在后台运行(-d参数)
  • 将容器的80端口映射到主机的8080端口(-p参数)
  • 给容器命名为my-nginx(--name参数)

现在你可以通过浏览器访问http://localhost:8080看到Nginx的欢迎页面。

6.2 常用命令速查

以下是一些最常用的Docker命令:

命令描述
docker ps查看运行中的容器
docker ps -a查看所有容器(包括停止的)
docker images列出本地镜像
docker pull <image>下载镜像
docker run <options> <image>运行容器
docker stop <container>停止容器
docker start <container>启动已停止的容器
docker rm <container>删除容器
docker rmi <image>删除镜像
docker exec -it <container> bash进入运行中的容器
docker logs <container>查看容器日志
docker build -t <name> .构建镜像

6.3 容器与主机的文件交互

有时我们需要在容器和主机之间传输文件:

  1. 从主机复制文件到容器:

    docker cp /path/to/local/file container_name:/path/in/container
  2. 从容器复制文件到主机:

    docker cp container_name:/path/in/container/file /path/to/local
  3. 挂载主机目录到容器(更推荐的方式):

    docker run -v /host/path:/container/path image_name

7. 进阶配置与优化

7.1 资源限制

默认情况下,Docker容器可以使用主机的所有资源。在生产环境中,我们应该限制容器的资源使用:

docker run -it --cpus=".5" --memory="512m" ubuntu

这个命令限制容器最多使用0.5个CPU核心和512MB内存。

7.2 网络配置

Docker提供了多种网络模式:

  1. bridge:默认模式,容器通过docker0网桥连接
  2. host:容器直接使用主机网络
  3. none:无网络连接
  4. 自定义网络:创建隔离的网络环境

创建一个自定义网络:

docker network create my-network

然后运行容器时指定网络:

docker run --network=my-network nginx

7.3 使用Docker Compose

对于复杂的多容器应用,推荐使用Docker Compose来管理。创建一个docker-compose.yml文件:

version: '3' services: web: image: nginx ports: - "8080:80" db: image: mysql environment: MYSQL_ROOT_PASSWORD: example

然后运行:

docker compose up -d

8. 安全最佳实践

8.1 不要以root用户运行容器

尽量避免在容器内以root用户运行应用:

docker run --user 1000:1000 nginx

8.2 限制容器能力

使用--cap-drop移除不必要的Linux能力:

docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

8.3 定期更新Docker和镜像

保持Docker和容器镜像的最新状态:

sudo apt-get update && sudo apt-get upgrade docker-ce docker pull nginx:latest

8.4 扫描镜像漏洞

使用Docker内置的扫描工具检查镜像漏洞:

docker scan nginx

9. 性能监控与日志管理

9.1 监控容器资源使用

查看容器的资源使用情况:

docker stats

9.2 日志管理

查看容器日志:

docker logs -f container_name

对于生产环境,建议配置日志轮转(如前面4.3节所示)或使用ELK等集中式日志系统。

9.3 使用cAdvisor监控

Google的cAdvisor提供了更详细的容器监控:

docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8081:8080 \ --detach=true \ --name=cadvisor \ gcr.io/google-containers/cadvisor:latest

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

10. 实际应用场景示例

10.1 开发环境搭建

使用Docker可以快速搭建一致的开发环境。例如,创建一个包含Node.js和MySQL的开发环境:

FROM node:14 RUN apt-get update && apt-get install -y mysql-client WORKDIR /app COPY package.json . RUN npm install COPY . . CMD ["npm", "start"]

然后使用docker-compose.yml配置整个环境:

version: '3' services: app: build: . ports: - "3000:3000" volumes: - .:/app depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: app_db

10.2 持续集成/持续部署

在CI/CD流程中使用Docker可以确保构建环境的一致性。例如,在GitLab CI中:

image: docker:latest services: - docker:dind stages: - build - test - deploy build: stage: build script: - docker build -t my-app . - docker tag my-app registry.example.com/my-app:$CI_COMMIT_SHA - docker push registry.example.com/my-app:$CI_COMMIT_SHA

10.3 微服务架构

Docker非常适合微服务架构。每个服务可以打包成独立的容器,通过Docker网络通信:

version: '3' services: auth-service: image: auth-service:latest ports: - "3001:3000" networks: - backend user-service: image: user-service:latest ports: - "3002:3000" networks: - backend api-gateway: image: api-gateway:latest ports: - "8080:8080" depends_on: - auth-service - user-service networks: - backend networks: backend: driver: bridge

11. 备份与迁移

11.1 备份Docker数据

重要的Docker数据应该定期备份:

  1. 备份容器数据卷:

    docker run --rm --volumes-from my_container -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /volume_path
  2. 备份整个Docker目录(不推荐用于生产环境):

    sudo tar -czvf docker_backup.tar.gz /var/lib/docker

11.2 迁移Docker到新主机

迁移Docker环境的基本步骤:

  1. 在新主机上安装相同版本的Docker
  2. 导出镜像:
    docker save -o my_images.tar image1 image2
  3. 将tar文件复制到新主机并导入:
    docker load -i my_images.tar
  4. 对于容器,建议使用docker-compose重新创建而不是直接迁移

12. 清理与维护

12.1 清理无用资源

定期清理可以释放磁盘空间:

docker system prune

这个命令会删除:

  • 所有停止的容器
  • 所有不被任何容器使用的网络
  • 所有悬空的镜像
  • 所有悬空的构建缓存

添加-a参数会同时删除未被使用的镜像:

docker system prune -a

12.2 检查Docker磁盘使用

查看Docker的磁盘使用情况:

docker system df

输出示例:

TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 3 1.2GB 500MB (41%) Containers 3 1 200MB 150MB (75%) Local Volumes 2 1 100MB 50MB (50%) Build Cache 10 0 300MB 300MB (100%)

13. 不同Linux发行版的安装差异

虽然前面以Ubuntu为例介绍了安装过程,但不同Linux发行版的安装方式略有不同:

13.1 CentOS/RHEL

对于CentOS或RHEL系统:

sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker

13.2 Debian

对于Debian系统:

sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

13.3 其他发行版

对于其他发行版,可以参考Docker官方文档或使用通用安装脚本:

curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh

14. 使用Docker的替代方案

虽然Docker是最流行的容器引擎,但也有其他选择:

14.1 Podman

Podman是一个无守护进程的Docker替代品,与Docker CLI兼容:

sudo apt-get install podman podman run hello-world

14.2 LXC/LXD

LXC提供了操作系统级别的虚拟化:

sudo apt-get install lxc sudo lxc-create -t download -n my-container

14.3 Containerd

Containerd是Docker底层的容器运行时,也可以直接使用:

sudo apt-get install containerd sudo ctr images pull docker.io/library/nginx:latest sudo ctr run docker.io/library/nginx:latest nginx

15. 我在生产环境中的经验分享

经过多年在生产环境中使用Docker的经验,我总结了一些实用的技巧:

  1. 标签管理:为镜像使用有意义的标签,避免只用latest。例如:v1.2.3、2023-07-01等。

  2. 健康检查:在Dockerfile中添加HEALTHCHECK指令,或在docker-compose.yml中配置健康检查。

  3. 资源限制:始终为生产容器设置资源限制,防止单个容器占用所有资源。

  4. 日志轮转:配置日志轮转,避免日志文件占用所有磁盘空间。

  5. 安全扫描:在CI/CD流程中加入镜像安全扫描步骤。

  6. 备份策略:定期备份重要的数据卷和镜像。

  7. 监控告警:设置容器资源使用和健康状态的监控告警。

  8. 最小化镜像:使用多阶段构建创建尽可能小的镜像。

  9. 环境分离:使用不同的Docker Compose文件或Kubernetes命名空间隔离开发、测试和生产环境。

  10. 文档记录:为每个自定义镜像编写清晰的README,说明用途、构建方法和运行要求。

← 返回列表