ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux系统Docker安装与配置全指南:从零到实战部署

Linux系统Docker安装与配置全指南:从零到实战部署 1. 项目概述为什么要在Linux上安装Docker如果你正在Linux服务器上折腾应用部署或者想在本地开发环境里模拟生产环境那么Docker几乎是一个绕不开的工具。它带来的核心价值是“环境一致性”——你再也不用在开发、测试、生产环境之间反复复现“在我机器上明明是好的”这种玄学问题了。Docker通过容器技术将应用及其所有依赖库、环境变量、配置文件打包成一个标准化的单元在任何安装了Docker引擎的Linux系统上都能以完全相同的方式运行。这次要聊的就是在Linux系统上从零开始一步步把Docker引擎装起来并且让它跑得顺畅。这不仅仅是执行几条命令更重要的是理解每一步背后的逻辑以及如何根据你的具体环境比如是Ubuntu还是CentOS是物理机还是云服务器做出最合适的选择。我会结合自己踩过的坑把那些官方文档里一笔带过但实际部署时又至关重要的细节掰开揉碎了讲清楚。2. 安装前的关键准备与系统检查在敲下任何安装命令之前充分的准备工作能帮你避开至少80%的后续麻烦。这一步的核心是确认你的系统环境是否满足Docker运行的基本要求并做好必要的清理工作。2.1 系统环境与内核版本确认Docker对Linux内核版本有最低要求。虽然现代的主流发行版如Ubuntu 20.04 LTS及以上、CentOS 7及以上通常都满足但检查一下总没错。打开终端执行以下命令查看内核版本和系统信息uname -r cat /etc/os-release关键点在于内核版本。Docker CE社区版要求内核版本至少为3.10对于较旧的发行版但强烈建议使用4.x或更高版本的内核以获得更好的稳定性和功能支持如Overlay2存储驱动。uname -r的输出类似5.4.0-100-generic。注意如果你使用的是Windows Subsystem for Linux 2 (WSL 2)虽然它基于Linux内核但Docker Desktop for Windows有专门的集成方式。在纯Linux环境下安装我们指的是直接在物理机或虚拟机如VMware、VirtualBox上运行的Linux发行版。2.2 清理旧版本与冲突组件如果你的系统上曾经安装过旧版本的Docker可能叫docker、docker.io或docker-engine或者一些可能冲突的容器运行时必须先彻底清理干净。执行以下命令进行清理sudo apt-get remove docker docker-engine docker.io containerd runc或者对于yum系系统如CentOS、Fedorasudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine这个命令会移除这些包但通常不会自动删除镜像、容器、卷和网络配置文件。这些数据位于/var/lib/docker/如果你需要全新安装可以手动删除这个目录sudo rm -rf /var/lib/docker但务必谨慎因为这会销毁所有现有的Docker数据。2.3 安装依赖工具与配置仓库为了让安装过程顺畅我们需要确保系统已安装必要的工具并配置好Docker的官方软件源这能保证我们获取到最新且经过签名的软件包。更新系统包索引这是良好习惯确保后续安装基于最新的仓库信息。sudo apt-get update # Debian/Ubuntu sudo yum check-update # CentOS/RHEL (非必须但可检查更新)安装依赖工具# 对于APT系系统如Ubuntu, Debian sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 对于YUM系系统如CentOS, RHEL, Fedora sudo yum install -y yum-utilsapt-transport-https/yum-utils允许包管理器通过HTTPS协议获取软件。ca-certificates系统CA证书用于验证HTTPS连接的安全性。curl命令行工具用于从网络下载文件。gnupg用于管理GPG密钥验证软件包签名。lsb-release提供一个标准命令lsb_release -a来查看发行版信息。添加Docker官方GPG密钥这一步至关重要它确保了从Docker仓库下载的软件包未被篡改。GPG密钥就像软件源的“数字指纹锁”。# 创建密钥环目录如果不存在 sudo install -m 0755 -d /etc/apt/keyrings # 下载Docker官方GPG密钥并存入指定文件 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置正确的文件权限 sudo chmod ar /etc/apt/keyrings/docker.gpg对于CentOS/RHEL添加仓库时会自动处理密钥。设置Docker稳定版仓库告诉系统从哪里获取Docker软件包。# 对于Ubuntu/Debian 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 # 对于CentOS/RHEL sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo这里的$(lsb_release -cs)会自动获取你的Ubuntu版本代号如jammy。确保你的发行版被Docker官方支持。对于CentOS如果你用的是RHEL或Fedora需要找到对应的仓库文件。3. Docker引擎的核心安装与验证完成准备工作后就可以开始安装Docker引擎本身了。这里我们选择安装Docker CE社区版它完全免费且功能强大足以满足绝大多数开发和生产需求。3.1 执行安装命令更新APT包索引在添加新仓库后必须执行并安装Docker# 对于APT系系统 sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 对于YUM系系统 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin解释一下安装的这几个核心组件docker-ce: Docker社区版引擎核心中的核心。docker-ce-cli: Docker命令行接口你用的docker命令就来自这里。containerd.io: 行业标准的容器运行时Docker引擎底层依赖于它来管理容器的生命周期创建、启动、停止等。docker-buildx-plugin: 用于构建多平台镜像的插件比如在AMD64机器上构建ARM64的镜像。docker-compose-plugin: 将原先独立的docker-compose工具集成到了Docker CLI中现在你可以用docker compose命令来管理多容器应用了。3.2 启动Docker服务并设置开机自启安装完成后Docker服务dockerd守护进程默认不会自动启动。我们需要手动启动它并设置为开机启动这样服务器重启后Docker服务能自动恢复。# 启动Docker服务 sudo systemctl start docker # 设置Docker服务开机自启 sudo systemctl enable docker # 查看Docker服务状态确认其处于活跃active运行状态 sudo systemctl status docker执行status命令后你应该能看到绿色的active (running)字样。如果看到失败failed信息最常见的原因是前面提到的内核或系统兼容性问题或者与已有服务端口冲突Docker默认使用2375/2376端口。3.3 验证安装与运行第一个容器安装并启动服务后如何确认Docker真的装好了并且能正常工作最直接的方法就是运行一个测试容器。执行经典的“Hello World”测试sudo docker run hello-world这个命令会执行以下动作Docker客户端CLI联系本地Docker守护进程。守护进程发现本地没有hello-world:latest这个镜像。守护进程从默认的Docker Hub仓库拉取pullhello-world镜像。拉取完成后守护进程根据该镜像创建一个新的容器并运行。容器内预置的程序执行输出一段欢迎信息如“Hello from Docker!”后退出。如果你能看到成功的输出信息恭喜你Docker引擎已经安装并运行正常实操心得第一次运行docker命令时我强烈建议你暂时使用sudo。因为Docker守护进程默认以root用户运行而docker命令需要与守护进程通信通过Unix套接字/var/run/docker.sock该套接字默认只有root用户和docker用户组的成员有读写权限。为了安全和使用方便我们下一步就是解决权限问题。4. 权限配置与用户组管理每次运行docker命令都要加sudo非常繁琐也不安全相当于赋予了普通用户root权限。标准的做法是将当前用户添加到docker用户组中。4.1 将用户加入docker组# 将当前登录用户添加到docker用户组 sudo usermod -aG docker $USERusermod: 修改用户属性的命令。-aG:-a表示追加append用户到附加组-G指定组名。这里是将用户追加到docker组而不是覆盖用户原有的其他组。$USER: 环境变量代表当前用户名。关键点这个修改不会立即生效于当前已登录的会话。因为用户组信息是在用户登录时加载的。你需要注销并重新登录。或者打开一个新的终端窗口新的登录会话。更快捷但不推荐长期使用的方法是使用newgrp docker命令临时切换到docker组但这只对当前shell有效。4.2 验证非sudo权限在新终端中运行以下命令验证是否已无需sudodocker run hello-world如果成功运行说明权限配置正确。如果仍然提示权限错误如“Got permission denied while trying to connect to the Docker daemon socket”请检查确认docker.sock的权限ls -l /var/run/docker.sock应显示所属组为docker。确认用户是否在docker组中groups $USER查看输出是否包含docker。如果确认无误但仍不行可以尝试重启系统这会使所有组更改完全生效。注意事项将用户加入docker组本质上是授予了该用户相当于root的权限因为通过Docker可以挂载主机目录、启动特权容器等。因此在生产服务器上请仅将必要、可信的用户加入此组。对于个人开发机这通常是方便且可接受的做法。5. 镜像加速与守护进程配置优化默认情况下Docker会从Docker Hub拉取镜像。由于网络原因在国内直接拉取速度可能很慢甚至失败。配置国内镜像加速器是安装后的首要优化步骤。5.1 配置国内镜像加速器我们需要修改Docker守护进程的配置文件/etc/docker/daemon.json。如果文件不存在就创建它。sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF这里我添加了三个常用的国内镜像源中国科技大学、网易、百度。registry-mirrors是一个数组Docker会按顺序尝试如果某个镜像源失败或没有该镜像会 fallback 到下一个或最终的Docker Hub。配置文件中的另外两个键值对是关于日志的配置log-driver: json-file: 指定容器日志的驱动为json文件这是最常用且易于管理的驱动。log-opts: 设置日志选项。max-size: 100m限制单个日志文件最大100MBmax-file: 3最多保留3个日志文件即滚动日志总大小不超过300MB。这能有效防止容器日志无限增长占满磁盘。5.2 重启Docker服务使配置生效修改配置文件后必须重启Docker守护进程才能加载新配置。sudo systemctl daemon-reload # 重载systemd管理器配置有时需要 sudo systemctl restart docker # 重启Docker服务5.3 验证加速器配置重启后运行以下命令检查配置是否生效并测试拉取镜像的速度docker info在输出信息中找到Registry Mirrors部分你应该能看到你刚才配置的镜像地址列表。现在可以尝试拉取一个镜像来感受速度提升docker pull ubuntu:22.04对比配置加速器前后拉取同一个镜像的速度差异会非常明显。6. Docker基础命令实战与概念解析安装配置完成我们来实际操作几个最常用的Docker命令并理解其背后的核心概念这比死记硬背命令更重要。6.1 镜像Image操作镜像是容器的模板是一个只读的静态文件层集合。搜索镜像在Docker Hub上查找公开镜像。docker search nginx输出会显示镜像名、描述、星标受欢迎程度、是否官方OFFICIAL等。拉取镜像从仓库下载镜像到本地。docker pull nginx:alpinenginx是镜像名alpine是标签Tag通常指特定版本或变体这里指基于Alpine Linux的轻量版。不指定标签时默认为latest。列出本地镜像docker images # 或使用更现代的格式 docker image ls删除镜像docker rmi 镜像ID或镜像名:标签 # 例如docker rmi hello-world:latest如果镜像有对应的容器存在即使已停止需要先删除容器才能删除镜像或者使用-f强制删除不推荐。6.2 容器Container操作容器是镜像的运行实例拥有可写的文件层。运行容器这是最核心的命令。docker run -d --name my-nginx -p 8080:80 nginx:alpine参数解析-d: 后台detached运行容器。--name my-nginx: 为容器指定一个自定义名称便于后续管理。如果不指定Docker会分配一个随机名称。-p 8080:80: 端口映射。将主机的8080端口映射到容器的80端口。这样访问主机的http://localhost:8080就能访问容器内的Nginx服务。nginx:alpine: 要基于哪个镜像运行容器。查看容器状态docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器包括已停止的查看容器日志当容器在后台运行时查看其输出信息。docker logs my-nginx # 查看最新日志 docker logs -f my-nginx # 持续跟踪follow日志输出类似tail -f进入运行中的容器有时需要进入容器内部进行调试。docker exec -it my-nginx /bin/shexec: 在已运行的容器中执行命令。-it:-i保持标准输入打开-t分配一个伪终端pseudo-TTY两者结合让我们获得一个交互式的shell。/bin/sh: 要执行的命令这里是启动一个shell。Alpine镜像默认用shUbuntu等用bash。停止、启动、重启容器docker stop my-nginx # 停止运行中的容器发送SIGTERM信号允许优雅退出 docker start my-nginx # 启动已停止的容器 docker restart my-nginx # 重启容器删除容器docker rm my-nginx # 删除已停止的容器 docker rm -f my-nginx # 强制删除运行中的容器不推荐可能丢失数据6.3 理解容器与镜像的关系一个常见的困惑是容器和镜像的区别。你可以这样理解镜像好比是软件的“安装程序”或“蓝图”.iso文件或.exe安装包。它是只读的、静态的。容器则是根据这个“蓝图”安装好并正在运行的“软件实例”一个正在运行的进程。它拥有一个可写的层用于存储运行时的数据。当你执行docker run时Docker会检查本地是否有指定的镜像没有则从仓库拉取。以该镜像为只读模板创建一个新的可写层容器层。分配网络、存储等资源。执行镜像中定义的启动命令如CMD或ENTRYPOINT。因此你可以基于同一个镜像如ubuntu:22.04运行无数个容器它们初始状态相同但运行后各自产生的数据互不影响。7. 存储管理数据卷与绑定挂载容器默认是“无状态”的容器内创建的文件会随着容器的删除而消失。为了持久化数据或与主机共享数据Docker提供了两种主要机制数据卷Volumes和绑定挂载Bind Mounts。7.1 数据卷Volumes数据卷是由Docker管理的主机文件系统的一部分存储在/var/lib/docker/volumes/下。它是持久化数据的最佳实践。创建数据卷docker volume create my-data运行容器时使用数据卷docker run -d --name mysql-db \ -v my-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDsecret \ mysql:8.0-v my-data:/var/lib/mysql将名为my-data的数据卷挂载到容器内的/var/lib/mysql目录。这样MySQL的数据就持久化在数据卷中即使容器被删除数据依然存在。查看数据卷docker volume ls docker volume inspect my-data # 查看数据卷的详细信息包括在主机上的实际路径删除数据卷docker volume rm my-data注意删除数据卷会永久丢失其中的数据。如果数据卷正在被某个容器使用则无法删除。数据卷的优势易于备份和迁移docker volume命令管理。可以在多个容器间安全共享。性能通常优于绑定挂载特别是在Docker Desktop for Mac/Windows上。7.2 绑定挂载Bind Mounts绑定挂载是将主机上的一个特定目录或文件直接挂载到容器中。这常用于开发环境方便在主机上编辑代码在容器中实时看到变化。运行容器时使用绑定挂载docker run -d --name dev-nginx \ -v /home/yourname/webapp:/usr/share/nginx/html:ro \ -p 8080:80 \ nginx:alpine-v /home/yourname/webapp:/usr/share/nginx/html:ro将主机目录/home/yourname/webapp挂载到容器的/usr/share/nginx/html目录并设置为ro只读read-only模式。这样Nginx会直接服务主机目录下的静态文件。开发场景示例假设你在主机/projects/myapp下开发一个Node.js应用。docker run -d --name node-dev \ -v /projects/myapp:/app \ -w /app \ -p 3000:3000 \ node:18-alpine \ sh -c npm install npm start-w /app设置容器内的工作目录为/app。挂载后容器内的/app目录就是主机上的/projects/myapp。你在主机上修改代码容器内运行的npm start如使用了nodemon会监听到文件变化并自动重启。注意事项绑定挂载给了容器直接访问主机文件系统的能力。如果容器内的进程有写权限它就可以修改甚至删除主机上的文件。因此对于不受信任的镜像要谨慎使用绑定挂载或者使用:ro设置为只读。7.3 如何选择数据卷 vs 绑定挂载特性数据卷 (Volumes)绑定挂载 (Bind Mounts)管理方Docker引擎用户自行管理存储位置/var/lib/docker/volumes/主机任意指定路径便携性高与主机路径解耦低依赖特定主机路径备份/迁移容易docker volume命令需要手动操作主机文件性能通常较好取决于主机文件系统适用场景生产环境数据库数据、应用数据持久化开发环境代码共享、配置文件挂载简单来说生产环境用数据卷开发环境用绑定挂载。8. 网络配置容器互联与端口暴露Docker提供了强大的网络模型默认会为容器创建三种网络bridge默认、host、none。理解网络是进行多容器应用编排的基础。8.1 默认桥接网络Bridge当你运行一个容器而不指定网络时它会连接到默认的bridge网络。在这个网络上的容器可以通过IP地址相互通信但不能通过容器名直接解析。# 运行两个容器都使用默认bridge网络 docker run -d --name container1 alpine sleep 1d docker run -d --name container2 alpine sleep 1d # 进入container1尝试ping container2的IP需要先获取IP docker inspect -f {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} container2 # 假设输出 172.17.0.3 docker exec -it container1 ping 172.17.0.3 # 可以ping通 docker exec -it container1 ping container2 # 无法解析会报错8.2 自定义桥接网络创建自定义的桥接网络可以解决容器名解析问题并且能提供更好的隔离性。# 1. 创建一个自定义桥接网络 docker network create my-app-network # 2. 将容器连接到这个自定义网络 docker run -d --name web-app --network my-app-network nginx:alpine docker run -d --name db --network my-app-network -e MYSQL_ROOT_PASSWORDpass mysql:8.0 # 3. 现在在web-app容器中可以直接通过容器名db访问数据库容器 docker exec -it web-app ping db # 可以成功解析并ping通在自定义网络中Docker内置了一个DNS服务器可以自动将容器名解析为其IP地址。这对于多容器应用如Web应用连接数据库的配置非常方便你只需要在配置文件中使用db:3306这样的地址即可。8.3 端口映射Port Publishing桥接网络是隔离的外部主机无法直接访问桥接网络内的容器。为了让外部能访问容器内的服务需要使用-p参数进行端口映射。docker run -d --name nginx-host -p 80:80 -p 443:443 nginx:alpine-p 80:80将主机的80端口映射到容器的80端口。-p 443:443同理映射443端口。格式为-p 主机端口:容器端口。你可以将主机端口改为其他未被占用的端口如-p 8080:80。检查端口映射是否成功sudo ss -tulpn | grep :80 # 或 docker port nginx-host8.4 主机网络Host Network模式如果容器使用--network host那么容器将不会获得独立的网络命名空间而是直接共享宿主机的网络栈。这意味着容器内监听的端口直接绑定在主机端口上。docker run -d --network host nginx:alpine此时Nginx容器监听的80端口就是主机的80端口。你无法再进行端口映射因为端口已被直接占用并且容器内看到的网络接口和主机完全一样。使用场景对网络性能要求极高的场景如负载均衡器、高性能代理因为省去了一层NAT转换。但牺牲了网络隔离性且端口容易冲突。9. Docker Compose多容器应用编排入门当你的应用由多个服务组成例如一个Web前端、一个后端API、一个数据库、一个缓存手动用docker run启动每一个容器并管理它们的网络、卷会非常繁琐。Docker Compose就是用来解决这个问题的工具它允许你使用一个YAML文件docker-compose.yml来定义和运行多容器应用。9.1 安装Docker Compose Plugin如果你按照本文第3部分的命令安装了docker-compose-plugin那么Compose已经作为Docker CLI的一个插件安装好了。你可以通过docker compose命令来使用它注意是docker compose不是docker-compose。验证安装docker compose version9.2 编写第一个docker-compose.yml假设我们有一个简单的WordPress博客应用它需要MySQL数据库和WordPress本身。我们来编写一个docker-compose.yml文件。version: 3.8 # 指定Compose文件格式版本 services: # 定义数据库服务 db: image: mysql:8.0 # 设置环境变量用于初始化数据库 environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress # 将数据库数据持久化到名为db_data的数据卷 volumes: - db_data:/var/lib/mysql # 设置健康检查确保数据库完全启动后再启动wordpress healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] timeout: 20s retries: 10 # 将服务连接到自定义网络 networks: - wp-network # 定义WordPress服务 wordpress: depends_on: db: condition: service_healthy # 等待db服务健康状态为healthy image: wordpress:latest # 端口映射将主机的8080端口映射到容器的80端口 ports: - 8080:80 environment: WORDPRESS_DB_HOST: db:3306 # 使用服务名dbCompose会自动解析 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: # 绑定挂载将主机当前目录下的wp-content目录挂载到容器便于主题/插件开发 - ./wp-content:/var/www/html/wp-content networks: - wp-network # 定义在Compose文件级别创建的数据卷 volumes: db_data: # 定义在Compose文件级别创建的网络 networks: wp-network: driver: bridge9.3 使用Compose管理应用将上述YAML内容保存为docker-compose.yml然后在同一目录下执行启动所有服务在后台运行docker compose up -d-d代表后台运行。Compose会创建一个名为目录名_wp-network的网络如myblog_wp-network。创建一个名为目录名_db_data的数据卷。按依赖顺序拉取镜像并启动服务先启动db等它健康后再启动wordpress。查看运行状态docker compose ps查看服务日志docker compose logs # 查看所有服务日志 docker compose logs -f wordpress # 跟踪查看wordpress服务的日志停止服务docker compose down这个命令会停止并删除所有由up创建的容器、网络但默认不会删除数据卷如db_data以保证你的数据安全。如果你想同时删除数据卷需要加-v参数docker compose down -v谨慎使用。在运行中重启某个服务docker compose restart wordpressDocker Compose极大地简化了多容器应用的生命周期管理。通过一个声明式的YAML文件你版本化了整个应用栈的配置使得在任何地方重现这个环境变得轻而易举。10. 常见问题排查与性能优化即使按照步骤安装在实际使用中也可能遇到各种问题。这里汇总了一些典型问题及其排查思路。10.1 Docker服务启动失败问题执行sudo systemctl status docker时状态显示failed。排查步骤查看详细日志sudo journalctl -xu docker这是最关键的步骤日志会明确告诉你失败原因。常见原因及解决内核模块缺失或不支持日志中可能出现failed to start daemon: Error initializing network controller: ...或提及overlay2、iptables等。确保系统已启用必要的内核模块并更新内核。# 检查内核模块 lsmod | grep overlay lsmod | grep br_netfilter # 如果缺失尝试加载需要重启 sudo modprobe overlay sudo modprobe br_netfilter存储驱动问题检查/etc/docker/daemon.json配置是否正确特别是如果之前有旧版本残留。可以尝试暂时重命名该文件然后重启Docker。端口冲突Docker默认使用2375/2376等端口。检查是否有其他程序占用。sudo netstat -tulpn | grep :2375SELinux/AppArmor在某些发行版如CentOS上SELinux可能会阻止Docker。可以尝试临时禁用SELinux进行测试生产环境需谨慎sudo setenforce 0 # 临时设置为Permissive模式如果问题解决则需要配置SELinux策略以允许Docker运行。10.2 镜像拉取缓慢或失败问题docker pull速度极慢或出现net/http: TLS handshake timeout错误。解决确认镜像加速器配置正确如第5部分所述检查/etc/docker/daemon.json并重启Docker。尝试其他镜像源将registry-mirrors中的地址换成其他可用的国内镜像源。检查DNSDocker拉取镜像需要域名解析。检查主机的DNS配置/etc/resolv.conf可以尝试设置为8.8.8.8或114.114.114.114。使用代理如果是在企业内网有代理服务器需要在Docker服务中配置代理。# 创建Docker服务配置目录 sudo mkdir -p /etc/systemd/system/docker.service.d # 创建代理配置文件 sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf EOF [Service] EnvironmentHTTP_PROXYhttp://proxy.example.com:8080 EnvironmentHTTPS_PROXYhttp://proxy.example.com:8080 EnvironmentNO_PROXYlocalhost,127.0.0.1,.internal EOF # 重载配置并重启Docker sudo systemctl daemon-reload sudo systemctl restart docker10.3 磁盘空间管理问题随着使用Docker会占用大量磁盘空间主要是镜像、容器和构建缓存。清理命令删除所有已停止的容器、未使用的网络、悬空镜像none标签和构建缓存docker system prune -a警告-a参数会删除所有未被容器使用的镜像包括你可能想保留的中间镜像。使用前请确认。仅删除悬空镜像docker image prune查看磁盘使用详情docker system df这个命令会清晰显示镜像、容器、数据卷和构建缓存各占用了多少空间。清理特定数据卷谨慎操作确保数据已备份。docker volume prune10.4 容器内时间与主机时间不一致问题容器内的时间不是东八区CST或与主机时间不同。解决在运行容器时将主机的时区文件挂载到容器内。docker run -d --name some-app \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ your-image:ro表示只读挂载防止容器修改主机文件。10.5 性能优化小贴士使用.dockerignore文件在构建镜像的目录下创建.dockerignore文件列出不需要打包进镜像的文件和目录如.git,node_modules,*.log。这可以显著减少构建上下文大小加快构建速度。多阶段构建Multi-stage Builds对于需要编译的应用如Go、Java在Dockerfile中使用多阶段构建。第一个阶段使用完整的SDK环境进行编译第二个阶段只复制编译好的二进制文件到一个极小的运行时镜像如alpine中可以大幅减小最终镜像的体积。合理设置资源限制使用--cpus,--memory等参数限制容器可使用的CPU和内存资源防止单个容器耗尽主机资源。docker run -d --name limited-container --cpus1.5 --memory512m nginx选择合适的基础镜像优先选择官方镜像并选择带有-alpine、-slim标签的变体它们体积更小安全性也相对更高。安装Docker只是第一步真正的价值在于你如何使用它来封装、分发和运行你的应用。从单个容器的简单服务到使用Compose编排的复杂应用栈再到更高级的Swarm或Kubernetes集群Docker为你提供了一套标准化的容器生态基石。多动手实践从运行一个Nginx开始逐步尝试将自己的应用容器化你会逐渐体会到它带来的巨大便利。
返回列表