搭建运行环境,以便进行后续的开发和学习。 这里选择 Ubuntu 20.04 LTS (Long Term Support) 作为基础操作系统,因为它稳定、可靠,且拥有广泛的社区支持。
操作系统镜像下载:
建议使用 Ubuntu 20.04.4 LTS 或更高版本。
选择 ubuntu-20.04.5-live-server-amd64.iso
镜像文件。
该镜像可用于在虚拟机 (如 VMware, VirtualBox) 或物理机上安装 Ubuntu Server 系统。 服务器版本占用资源少,适合作为开发环境。
镜像源配置 (加速软件安装):为了加速软件安装和更新速度,建议更换为国内镜像源。 提供两种配置方式。
方法一:在安装过程中配置 (推荐):
在虚拟机安装 Ubuntu 系统时,安装程序通常会询问镜像源配置。
如图所示,可以手动输入镜像服务器地址。 推荐使用阿里云镜像源或其他国内可靠的镜像源。
输入正确的镜像源地址,可以大幅缩短安装时间。
方法二:安装完成后修改 (适用于已安装系统):如果已经安装了 Ubuntu 系统,可以通过修改 /etc/apt/sources.list
文件来更换镜像源。
操作步骤:
备份 sources.list
文件 (重要!):在修改之前,务必备份原始配置文件,以便在出现问题时可以恢复。 执行命令:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
编辑 sources.list
文件: 使用文本编辑器 (例如 vim
, nano
) 打开该文件,并替换其中的默认源地址。
sudo vim /etc/apt/sources.list
将文件中所有的 http://archive.ubuntu.com/ubuntu/
替换为阿里云镜像源地址:http://mirrors.aliyun.com/ubuntu/
。 可以选择其他的国内镜像源,例如清华大学、中科大的镜像源。
更新软件包列表: 修改完成后,保存并关闭文件。 然后执行以下命令来更新软件包列表,使配置生效。
sudo apt-get update
该命令会从新的镜像源下载软件包列表,如果一切顺利,就可以更快地安装和更新软件了。
注意事项:
确保选择与您的 Ubuntu 版本相对应的镜像源地址。
在修改配置文件时,请仔细检查,避免出现拼写错误或其他格式错误。
如果 apt-get update
命令报错,请检查网络连接和镜像源地址是否正确。
通过以上步骤,就可以成功搭建 Ubuntu 20.04 主机环境,并配置国内镜像源,为后续的开发工作做好准备。
本节将指导在 Ubuntu 20.04 主机上安装 Docker,并进行一些必要的配置。
(1) Docker 安装 (使用 apt 包管理器):虽然 Docker 提供了多种安装方式,但使用 apt 包管理器是最便捷的方式之一。 也可以参考 Docker 官方文档进行安装,这里提供更简化的步骤。
执行以下命令安装 Docker:
sudo apt update # 更新软件包列表,确保安装最新版本
sudo apt install docker.io
Docker 卸载 (如果需要):如果需要卸载 Docker,可以执行以下命令,这将移除 Docker 以及相关的配置和数据:
sudo apt-get purge docker.io # 彻底移除 Docker 包
sudo rm -rf /var/lib/docker # 删除 Docker 数据目录
sudo rm -rf /var/lib/containerd # 删除 Containerd 数据目录 (如果存在)
(2) 用户权限配置 (无需 sudo 执行 Docker 命令):默认情况下,执行 Docker 命令需要 sudo
权限。为了方便使用,可以将当前用户添加到 docker
用户组。
添加用户到 docker 组:
sudo usermod -aG docker $USER # 将当前用户添加到 docker 组
newgrp docker # 刷新用户组信息 (或重新登录)
或者,也可以显式地指定用户名:
sudo addgroup <username> docker
重启 Docker 服务:
sudo systemctl restart docker
验证配置:使用 id
命令查看当前用户信息,确认 docker
组已包含在用户所属的组列表中:
id
如果没有 docker
组,可以尝试注销并重新登录。 现在,应该可以在没有 sudo
的情况下执行 Docker 命令了。
(3) 安装 OpenSSH Server (可选,但强烈推荐):OpenSSH Server 允许通过 SSH 远程连接到主机。 这对于远程管理和开发非常有用。
安装 OpenSSH Server:
sudo apt-get update
sudo apt-get install openssh-server
配置 OpenSSH Server (可选,但建议配置公钥登录):可以配置 SSH 密钥认证,提高安全性,避免每次输入密码。 具体步骤请参考相关文档。
启动和管理 OpenSSH Server:
sudo systemctl enable ssh # 设置开机启动
sudo systemctl restart ssh # 重启 SSH 服务
sudo systemctl status ssh # 查看 SSH 服务状态
确保 SSH 服务正在运行,并且可以通过端口 22 连接。
(4) 设置 Docker 镜像加速器 (可选,但强烈推荐):由于 Docker Hub 位于国外,拉取镜像的速度可能较慢。 配置镜像加速器可以显著提高镜像下载速度。
编辑 Docker 配置文件:不同版本的 Docker 配置文件位置可能略有不同,通常位于 /etc/docker/daemon.json
。 如果该文件不存在,则创建它。
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
添加镜像加速器地址:将以下 JSON 内容添加到 /etc/docker/daemon.json
文件中 (替换为你选择的镜像源):
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
可以选择多个镜像源,Docker 会自动尝试。 推荐使用阿里云或网易云的镜像源,速度较快。
重启 Docker 服务:
sudo systemctl restart docker
验证配置:执行 docker info
命令,检查输出中是否包含 Registry Mirrors
字段,并且列出了配置的镜像加速器地址。
通过以上步骤,就成功安装了 Docker,并进行了必要的用户权限配置和镜像加速器设置。 为后续的 Docker 容器化开发奠定基础。
Docker 是一种流行的容器化技术,提供了一个高效、可移植的平台,用于构建、发布和运行分布式应用程序。 Docker 的核心思想是将应用程序及其所有依赖项(例如库、运行时环境和配置文件)打包到一个称为容器的独立单元中。 容器彼此隔离,并与底层操作系统隔离,从而确保应用程序在各种环境中以一致的方式运行。
环境一致性问题: Docker 解决了应用程序在开发、测试和生产环境中运行不一致的问题。 通过将应用程序及其依赖项打包到容器中,可以确保应用程序在任何支持 Docker 的平台上都能以相同的方式运行,避免了 "在我机器上运行正常" 的问题。
资源管理问题: Docker 容器允许对应用程序的资源使用情况进行精细控制。 可以在创建容器时指定内存和 CPU 限制,从而确保应用程序不会占用过多的系统资源,并提高整体资源利用率。
快速扩展和弹性伸缩: Docker 容器启动速度快,资源占用少,使得应用程序的快速扩展和弹性伸缩变得简单。 可以根据需要快速部署新的容器,并根据负载自动调整容器的数量。
Docker 主要针对应用及其依赖环境进行容器化,遵循单一职责原则。 最佳实践是每个容器只运行一个主进程。 将多个进程部署在同一个容器中存在以下弊端:
更新困难: 更新单个进程的镜像会导致整个容器重启,影响其他进程的可用性。
故障扩散: 一个进程出现问题可能导致整个容器崩溃,影响容器内所有进程。
违反单一职责原则: 容器应该代表一个独立的、可部署的单元。
如果需要在单个 Docker 实例中运行多个应用程序,建议采用以下方法:
使用进程管理工具: 例如 Supervisor 或 systemd,在容器内启动一个守护进程来管理多个应用程序。
使用 Docker Compose: 使用 Docker Compose 定义和管理多容器应用程序。
软件交付方式的变革: Docker 简化了软件的构建、发布和部署流程,实现了应用程序的快速交付。
虚拟机替代方案: Docker 容器比虚拟机更轻量级、启动速度更快,资源占用更少,在某些场景下可以作为虚拟机的替代方案。
用户体验的提升: Docker 简化了软件的安装和使用过程,用户可以通过简单的命令快速部署和运行应用程序。
企业成本的降低: Docker 提高了资源利用率,降低了基础设施成本,并简化了应用程序的管理和维护。
持续集成/持续部署 (CI/CD) 的推动: Docker 为 CI/CD 流程提供了可靠的基础,使得应用程序的持续集成和持续部署成为可能。
微服务架构的促进: Docker 容器轻量级、可移植的特性非常适合微服务架构,每个微服务可以打包成一个独立的容器,实现独立部署和扩展。
特性 | Docker (容器) | 虚拟机 (VM) |
---|---|---|
虚拟化级别 | 操作系统级别虚拟化 (共享内核) | 硬件级别虚拟化 (完整操作系统) |
资源占用 | 轻量级 (资源占用少,启动速度快) | 重量级 (资源占用多,启动速度慢) |
镜像大小 | 通常较小 (几 MB 到几百 MB) | 通常较大 (几 GB 到几十 GB) |
隔离性 | 共享内核,隔离性相对较弱 | 完整操作系统,隔离性强 |
启动速度 | 秒级 | 分钟级 |
应用场景 | 应用开发、快速部署、微服务 | 资源隔离、运行多个操作系统、服务器整合 |
核心解决的问题 | 应用开发、测试和部署的环境一致性问题 | 资源调配、硬件资源的虚拟化 |
是否包含 Guest OS | No | Yes |
镜像 (Image): Docker 镜像是一个只读的模板,用于创建 Docker 容器。 它包含应用程序及其所有依赖项。 可以将镜像视为一个应用程序的快照。 例如,一个 Ubuntu 镜像包含 Ubuntu 操作系统的基本文件系统和工具。
容器 (Container): 容器是 Docker 镜像的运行时实例。 它是一个独立运行的进程,包含应用程序及其所有依赖项。 容器是可写的,可以在其中运行应用程序、修改文件和安装软件。
客户端 (Client): Docker 客户端是用户与 Docker 守护进程交互的工具。 客户端可以通过命令行或 API 与守护进程通信。
主机 (Host): Docker 主机是运行 Docker 守护进程和容器的物理或虚拟机。
注册中心 (Registry): Docker 注册中心是存储和共享 Docker 镜像的仓库。 Docker Hub 是一个公共的注册中心,包含了大量的官方和社区镜像。 您也可以搭建私有的 Docker 注册中心,用于存储和管理私有镜像。
Docker Machine (已逐渐被其他工具替代): Docker Machine 是一个用于简化 Docker 安装的工具,可以帮助您在不同的平台上(例如本地机器、云服务器)安装 Docker。
通过一个简单的示例,演示 Docker 客户端如何通过 Socket 与 Docker 守护进程通信。
安装 socat:
sudo apt update sudo apt install socat
使用 socat 监听 Unix Socket:
socat -v UNIX-LISTEN:/tmp/dockerapi.sock UNIX-CONNECT:/var/run/docker.sock &
socat
是一个多功能的网络工具,用于在两个数据流之间建立连接。
-v
参数用于显示详细的通信信息。
UNIX-LISTEN:/tmp/dockerapi.sock
指定 socat 监听 /tmp/dockerapi.sock
Unix Socket。
UNIX-CONNECT:/var/run/docker.sock
指定 socat 连接到 Docker 守护进程的 Unix Socket (/var/run/docker.sock
)。
&
将 socat 命令放到后台运行。
使用 Docker 客户端与 socat 建立连接:
docker -H unix:///tmp/dockerapi.sock ps
-H unix:///tmp/dockerapi.sock
指定 Docker 客户端连接到 /tmp/dockerapi.sock
Unix Socket。
ps
命令用于列出正在运行的 Docker 容器。
会看到 Docker 客户端通过 socat 发送 HTTP 请求到 Docker 守护进程,并接收来自守护进程的响应。 这证明了 Docker 客户端和守护进程之间的通信是基于 Socket 的。
> 2022/12/04 09:21:30.864275 length=82 from=0 to=81 HEAD /_ping HTTP/1.1\r Host: docker\r User-Agent: Docker-Client/20.10.12 (linux)\r \r < 2022/12/04 09:21:30.865645 length=281 from=0 to=280 HTTP/1.1 200 OK\r Api-Version: 1.41\r Cache-Control: no-cache, no-store, must-revalidate\r Content-Length: 0\r Content-Type: text/plain; charset=utf-8\r Docker-Experimental: false\r Ostype: linux\r Pragma: no-cache\r Server: Docker/20.10.12 (linux)\r Date: Sun, 04 Dec 2022 09:21:30 GMT\r \r > 2022/12/04 09:21:30.869675 length=97 from=82 to=178 GET /v1.41/containers/json HTTP/1.1\r Host: docker\r User-Agent: Docker-Client/20.10.12 (linux)\r \r < 2022/12/04 09:21:30.870824 length=205 from=281 to=485 HTTP/1.1 200 OK\r Api-Version: 1.41\r Content-Type: application/json\r Docker-Experimental: false\r Ostype: linux\r Server: Docker/20.10.12 (linux)\r Date: Sun, 04 Dec 2022 09:21:30 GMT\r Content-Length: 3\r \r [] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
通过这个示例,了解 Docker 客户端和守护进程之间如何通过 Socket 进行通信,为理解 Docker 的内部工作原理打下了基础。
Docker可以安装多个应用程序,但是Docker只有一个程序入口,也就是docker的启动命令只有一条。
Docker和虚拟机不一样,Docker本身是一个软件,管理自己的进程,没有虚拟硬件设备。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有