Linux下Docker安装与容器运行教程
从现在开始,我们要努力学习啦!今天我给大家带来《Linux安装Docker及容器运行教程》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!
在Linux系统上安装Docker前,需确保系统已更新、清理旧版本Docker,并检查内核版本是否支持(如3.10以上),同时配置防火墙开放所需端口(如80端口),并预留足够磁盘空间以应对镜像和容器的存储需求。

在Linux系统上安装Docker并运行容器,其核心在于遵循官方推荐的安装流程,这通常涉及添加Docker的软件源、安装核心组件,然后通过几个简单的命令就能拉取镜像并启动你的第一个应用。这不仅简化了应用的部署和环境配置,更重要的是,它为我们提供了一个高度隔离且可移植的运行环境,极大地提升了开发与运维的效率。在我看来,掌握这一技能是现代软件工程师的必备素养之一。
解决方案
要在Linux系统上从零开始部署Docker并运行容器,我通常会推荐以下步骤,以Ubuntu/Debian系系统为例,因为它最常见,但核心思想适用于大多数发行版。
1. 系统准备与旧版本清理
在开始之前,确保你的系统是最新的,并且移除任何可能存在的旧版Docker安装,这能避免很多意想不到的冲突。
sudo apt update sudo apt upgrade -y # 移除旧版本Docker(如果存在) sudo apt remove docker docker-engine docker.io containerd runc
2. 安装必要的依赖包
Docker需要一些包来通过HTTPS使用APT仓库。
sudo apt install ca-certificates curl gnupg lsb-release -y
3. 添加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
4. 设置Docker稳定版仓库
将Docker的稳定版仓库添加到APT源列表中。
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
5. 安装Docker Engine
更新APT包索引并安装Docker Engine、containerd和Docker Compose。
sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
6. 验证安装
运行经典的hello-world容器来验证Docker是否正确安装并运行。
sudo docker run hello-world
如果看到类似“Hello from Docker!”的输出,说明Docker已成功安装。
7. 配置非root用户使用Docker
默认情况下,运行docker命令需要sudo权限。为了方便和安全,我通常会把当前用户添加到docker组,这样就无需每次都输入sudo了。
sudo usermod -aG docker $USER newgrp docker # 或者直接注销并重新登录
8. 运行你的第一个实用容器
现在,我们可以尝试运行一个更实用的容器,比如Nginx Web服务器。
docker run -d -p 80:80 --name my-nginx nginx:latest
-d:让容器在后台运行。-p 80:80:将宿主机的80端口映射到容器的80端口。--name my-nginx:为容器指定一个易于识别的名称。nginx:latest:指定要使用的镜像(Nginx的最新版本)。
现在,你可以在浏览器中访问http://localhost(或你的Linux服务器IP地址),应该能看到Nginx的欢迎页面。
在安装Docker前,我的Linux系统需要做哪些准备?
在我看来,除了上面提到的系统更新和旧版本清理,还有几个关键点值得我们提前考虑,这能帮助我们避免一些常见的“坑”。
一个是对内核版本的检查。Docker依赖于Linux内核的特定功能,例如cgroups和namespaces。虽然现代Linux发行版的内核版本通常都足够新(例如,至少需要3.10版本),但如果你的系统比较老旧,可能需要考虑升级内核。Docker官方推荐使用overlay2作为存储驱动,它对内核版本也有一定要求,不过在大多数主流发行版中,这都不是问题。你可以通过uname -r命令查看当前内核版本。
其次是防火墙配置。容器默认的网络模式通常会通过docker0桥接网络与宿主机通信。如果你在宿主机上启用了防火墙(如ufw或firewalld),并且想要从外部访问容器中运行的服务(比如上面Nginx的80端口),那么你需要在防火墙中明确地开放这些端口。我见过不少新手在容器跑起来后,却发现外部无法访问,最后才发现是防火墙在“作祟”。例如,对于ufw,你需要运行sudo ufw allow 80/tcp。
还有一点是关于存储空间。Docker镜像和容器都会占用磁盘空间,特别是当你拉取了大量镜像或运行了许多容器后,磁盘空间可能会迅速增长。因此,在安装前,确保你的系统有足够的可用存储空间,并且最好将Docker的数据目录(默认为/var/lib/docker)放置在一个空间充裕的分区上。如果空间紧张,后续清理无用镜像和容器(docker system prune)将成为你常做的事情。
Docker容器的生命周期管理:启动、停止、删除与查看日志
容器的生命周期管理是日常使用Docker的核心。理解这些命令,就像是掌握了与容器对话的语言。我个人觉得,这套命令设计得非常直观,一旦上手,效率会非常高。
- 查看运行中的容器:
docker ps- 这个命令会列出所有当前正在运行的容器。它会显示容器ID、镜像、命令、创建时间、状态、端口映射和容器名称。
- 查看所有容器(包括已停止的):
docker ps -a- 当你发现容器不见了,但又不确定它是否已停止时,这个命令就派上用场了。
- 启动容器:
docker start [容器ID或名称]- 例如:
docker start my-nginx。这会将一个已停止的容器重新启动。
- 例如:
- 停止容器:
docker stop [容器ID或名称]- 例如:
docker stop my-nginx。这会向容器发送一个SIGTERM信号,让其优雅地关闭。Docker会等待一段时间(默认为10秒),如果容器没有关闭,则会发送SIGKILL强制终止。
- 例如:
- 重启容器:
docker restart [容器ID或名称]- 这个命令等同于先
stop再start,非常方便。
- 这个命令等同于先
- 删除容器:
docker rm [容器ID或名称]- 例如:
docker rm my-nginx。注意,只能删除已停止的容器。如果你想强制删除一个正在运行的容器,可以使用-f或--force参数:docker rm -f my-nginx。但我通常不推荐这样做,除非你清楚你在做什么。
- 例如:
- 删除镜像:
docker rmi [镜像ID或名称]- 例如:
docker rmi nginx:latest。要删除一个镜像,必须确保没有容器正在使用它。
- 例如:
- 查看容器日志:
docker logs [容器ID或名称]- 这是排查容器内部问题最常用的命令。默认显示所有历史日志。
docker logs -f [容器ID或名称]:实时跟踪日志输出,就像tail -f一样。docker logs --tail 100 [容器ID或名称]:只显示最新的100行日志。
- 进入运行中的容器:
docker exec -it [容器ID或名称] bash- 这会打开一个交互式的shell会话,让你像SSH到虚拟机一样在容器内部操作。对于调试和查看容器内部文件系统非常有用。
bash可以替换为sh或其他容器内存在的shell。
- 这会打开一个交互式的shell会话,让你像SSH到虚拟机一样在容器内部操作。对于调试和查看容器内部文件系统非常有用。
这些命令构成了我们日常与Docker容器交互的基础。熟练掌握它们,能让你在容器化的世界里游刃有余。
如何确保Docker容器数据持久化?理解卷(Volumes)的重要性
这是容器化部署中一个非常关键且容易被忽视的问题:数据持久化。容器本身是设计为无状态的,这意味着如果你不做特殊处理,容器内部产生的数据会在容器被删除时一并消失。这对于数据库、用户上传文件等需要长期保存的数据来说是灾难性的。我个人在早期使用Docker时,就曾因为没有正确处理数据持久化而丢失过一些测试数据,那次经历让我深刻认识到了卷(Volumes)的重要性。
Docker提供了几种机制来实现数据持久化,其中最常用且推荐的是卷(Volumes)。
1. 卷(Named Volumes)
命名卷是Docker管理数据持久化的首选方式。它们由Docker引擎创建和管理,通常存储在宿主机文件系统的特定位置(例如/var/lib/docker/volumes/下),但其具体路径我们通常不需要关心,因为Docker会负责管理。
- 创建命名卷:
docker volume create my-data-volume
- 将命名卷挂载到容器:
docker run -d -p 80:80 \ --name my-nginx-with-volume \ -v my-data-volume:/usr/share/nginx/html \ nginx:latest
这里,
my-data-volume是我们在宿主机上创建的命名卷,它被挂载到Nginx容器内部的/usr/share/nginx/html路径。这意味着所有写入到容器内/usr/share/nginx/html的数据,都会实际存储在my-data-volume中,即使容器被删除,卷中的数据依然存在。 - 优点:
- 由Docker管理,易于备份、迁移和在不同容器之间共享。
- 与宿主机的文件系统路径解耦,更具可移植性。
- 在Linux上,命名卷的性能通常优于绑定挂载,因为它们绕过了宿主机的一些文件系统抽象层。
2. 绑定挂载(Bind Mounts)
绑定挂载允许你将宿主机上的任意文件或目录直接挂载到容器内部。这对于开发环境非常方便,可以直接将宿主机的源代码目录挂载到容器中,实现代码的实时同步。
- 使用绑定挂载:
docker run -d -p 80:80 \ --name my-nginx-bind-mount \ -v /path/to/your/host/html:/usr/share/nginx/html \ nginx:latest
这里的
/path/to/your/host/html是宿主机上的一个实际目录,它被直接映射到容器内的/usr/share/nginx/html。 - 优点:
- 直接控制宿主机上的文件,非常适合开发场景。
- 易于理解和操作,因为路径是显式的。
- 缺点:
- 宿主机路径是硬编码的,降低了容器的可移植性。
- 权限管理可能更复杂,需要确保宿主机和容器用户对挂载点有适当的读写权限。
- 在某些情况下,性能可能不如命名卷。
什么时候选择哪种方式?
我通常会这样选择:
- 生产环境和需要长期存储的数据(如数据库数据、日志文件): 优先使用命名卷。它们由Docker管理,更健壮,更易于备份和恢复。
- 开发环境和需要频繁修改宿主机文件并同步到容器的场景(如Web应用源代码): 优先使用绑定挂载。
3. tmpfs挂载
这是一种特殊类型的挂载,它将数据存储在宿主机的内存中,而不是磁盘上。这使得数据读写速度非常快,但缺点是数据是非持久化的,一旦容器停止,数据就会丢失。我通常会在需要高性能临时存储或不希望数据写入磁盘的场景中使用,比如缓存或敏感的临时文件。
docker run -d -p 80:80 \ --name my-nginx-tmpfs \ --tmpfs /usr/share/nginx/html \ nginx:latest
理解并正确使用这些数据持久化机制,是构建健壮、可靠的容器化应用的关键。它能让你在享受容器带来的便利的同时,避免数据丢失的风险。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。
Win8游戏卡顿优化技巧分享
- 上一篇
- Win8游戏卡顿优化技巧分享
- 下一篇
- Excel设置打印区域步骤教程
-
- 文章 · linux | 7小时前 |
- Linux用mkdir创建文件夹方法
- 226浏览 收藏
-
- 文章 · linux | 8小时前 |
- Linux登录失败记录查看方法
- 116浏览 收藏
-
- 文章 · linux | 10小时前 |
- LinuxSamba配置与权限管理全攻略
- 175浏览 收藏
-
- 文章 · linux | 17小时前 |
- Linux定时任务设置教程crontab使用详解
- 218浏览 收藏
-
- 文章 · linux | 19小时前 |
- Linux网络配置及故障排查教程
- 454浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux流量监控技巧分享
- 146浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux救援模式进入方法详解
- 270浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux下SSH密钥生成教程
- 214浏览 收藏
-
- 文章 · linux | 1天前 |
- LINUXchroot命令使用与环境隔离教程
- 407浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3182次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3393次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3424次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4528次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3802次使用
-
- 命令行工具:应对Linux服务器安全挑战的利器
- 2023-10-04 501浏览
-
- 如何使用Docker进行容器的水平伸缩和负载均衡
- 2023-11-07 501浏览
-
- linux .profile的作用是什么
- 2024-04-07 501浏览
-
- 如何解决s权限位引发postfix及crontab异常
- 2024-11-21 501浏览
-
- 如何通过脚本自动化Linux上的K8S安装
- 2025-02-17 501浏览

