--- title: "26-租服务器及配置环境" created: 2025-11-25 tags: - 项目 --- # 租服务器及配置环境 这章用不到 没买linux课不能用acteminal 但经过之前的建站折腾 租服务器配环境以及docker其实都已经会了 这里把y总笔记抄过来一下 看看以后用得着吗 ## 概述 云平台的作用: 存放我们的docker容器,让计算跑在云端。 获得公网IP地址,让每个人可以访问到我们的服务。 任选一个云平台即可,推荐配置: 1核 2GB(后期可以动态扩容,前期配置低一些没关系) 网络带宽采用按量付费,最大带宽拉满即可(费用取决于用量,与最大带宽无关) 系统版本:ubuntu 20.04 LTS(推荐用统一版本,避免后期出现配置不兼容的问题) (已有的是centos 等下看看要不要重置吧) ## 云服务器 阿里云地址: 腾讯云地址: 华为云地址: 服务器选择.mp4 选择服务器 服务器选择.mp4 创建工作用户acs并赋予sudo权限 登录到新服务器。打开AC Terminal,然后: ```bash ssh root@xxx.xxx.xxx.xxx # xxx.xxx.xxx.xxx替换成新服务器的公网IP ``` 创建acs用户: ```bash adduser acs # 创建用户acs usermod -aG sudo acs # 给用户acs分配sudo权限 ``` 配置免密登录方式 退回AC Terminal,然后配置acs用户的别名和免密登录,可以参考4. ssh——ssh登录。 配置新服务器的工作环境 将AC Terminal的配置传到新服务器上: ```bash scp .bashrc .vimrc .tmux.conf server_name: # server_name需要换成自己配置的别名 ``` 安装tmux和docker 登录自己的服务器,然后安装tmux: ```bash sudo apt-get update sudo apt-get install tmux ``` 打开tmux。(养成好习惯,所有工作都在tmux里进行,防止意外关闭终端后,工作进度丢失) 然后在tmux中根据[docker安装教程](https://docs.docker.com/engine/install/ubuntu/)安装docker即可。 ## 关于多用户 我尝试在自己的云服务器创建了一个acs用户 用于使用acs进行连接(使用root可能不安全 因为毕竟在别人号上) 发现一个很奇怪的东西 明明很多东西在下面的文件夹可以看到 但ls却什么都显示不出来 是因为权限问题吗 但是我给acs赋予了管理员权限 理应和root同级 那么这种多用户到底是什么呢 chatgpt: 在 Linux 系统中,**用户权限和多用户环境**的概念是非常重要的。不同用户具有不同的权限,可以访问、修改或运行不同的文件和命令。即使一个用户被授予了管理员权限(通过 `sudo` 命令),仍然有权限上的区别。接下来我将解释几个核心概念,以及 `root` 用户和普通用户(如 `acs`)之间的差异。 ### 1. Root 用户 `root` 用户是系统中的超级用户,拥有完全的控制权。`root` 可以: - 访问和修改系统中的所有文件(无论权限如何)。 - 安装、删除软件包,修改系统配置文件。 - 添加、删除用户,修改权限。 - 直接操作所有设备和资源。 在 Linux 中,`root` 用户可以执行任何操作,无需经过任何权限验证。这也是为什么我们常常建议谨慎使用 `root` 用户,因为错误操作可能会破坏整个系统。 ### 2. 普通用户 普通用户(如 `acs`)是系统中有**有限权限**的用户: - 普通用户只能访问和操作自己拥有的文件和目录(例如 `/home/acs`)。 - 没有权限访问其他用户的文件(包括系统级别的文件)——除非通过 `sudo` 来提升权限。 - 普通用户在进行需要管理员权限的操作时需要使用 `sudo` 来临时获得 `root` 权限。 ### 3. `sudo` 提升权限 当你为 `acs` 用户添加了 `sudo` 权限时,这并不意味着 `acs` 用户变成了 `root`。而是表示 `acs` 用户可以通过 `sudo` 命令在需要的时候临时获得管理员权限。例如,执行 `sudo ls /root` 来查看 `root` 目录的内容,或者使用 `sudo` 来安装软件包。 因此,`acs` 用户在正常情况下只能访问自己的文件和目录,而要访问系统文件或执行系统管理任务时,需要通过 `sudo` 命令来提升权限。 ### 4. 权限体系 Linux 使用三种权限类型来管理文件和目录的访问: - **读权限 (r)**:允许查看文件内容或列出目录内容。 - **写权限 (w)**:允许修改文件或在目录中创建/删除文件。 - **执行权限 (x)**:允许执行文件(比如脚本)或进入目录。 每个文件或目录都有三个权限集,分别适用于三类用户: - **文件拥有者**(用户):文件或目录的创建者。 - **文件所属组**:与文件拥有者相关的用户组成员。 - **其他用户**:系统中所有其他用户。 你可以使用 `ls -l` 命令查看文件的权限。例如: `-rw-r--r-- 1 acs acs 4096 Oct 21 10:00 example.txt` 这表示 `example.txt` 文件: - 文件所有者(`acs`)具有读写权限。 - 文件所属组成员具有读权限。 - 其他用户也只有读权限。 ### 5. 为什么 `acs` 看不到某些文件 即使你给 `acs` 用户授予了 `sudo` 权限,`acs` 依然是普通用户。当 `acs` 直接登录系统时,它只具有普通用户权限,因此它无法访问属于 `root` 或其他用户的某些文件。 要访问这些文件,可以使用 `sudo` 提升权限。例如: `sudo ls /root` 这样 `acs` 用户将临时以 `root` 权限查看 `root` 用户的文件。你也可以通过 `sudo` 执行其他需要管理员权限的命令,如编辑系统文件、安装软件等。 ### 6. 多用户环境 Linux 设计为多用户操作系统,允许多个用户同时使用系统,并确保他们之间的资源隔离。这种隔离包括: - 用户只能访问自己的文件和数据,不能随意查看或修改其他用户的数据。 - 管理员(通过 `sudo`)可以控制用户权限,确保安全性。 多用户环境的好处: - **安全性**:不同用户的权限受到严格控制,防止无关用户篡改重要文件。 - **灵活性**:系统管理员可以为不同的用户分配不同的权限。 - **隔离性**:用户之间不会相互干扰,确保数据的隐私和独立性。 ### 总结: - **`root` 用户**拥有无限制权限,可以做任何事。 - **普通用户(如 `acs`)**有有限权限,通常只能操作自己的文件。 - 通过 `sudo`,普通用户可以临时获得管理员权限,执行更高权限的操作。 - 权限体系确保了文件的安全性,避免未授权的访问和修改。 你可以通过 `sudo` 命令来完成需要管理员权限的操作,而 `acs` 用户在不使用 `sudo` 时依然是一个普通用户,权限有限。 ![[6413e891054cd946e1689c4e52558933-44b9c333.png]] 可以发现 root登入 直接会进到/目录下的 root文件夹 而acs登入 进入的是 /home/acs文件夹 也对应了前面讲的 用户登入在home文件夹下 当我尝试用acs用户进入root文件夹时 出现了权限拒绝 ![[78d12435c721a4e9594ef143793a8a85-240ac7ff.png]] 而用root进入acs文件夹 却畅通无阻 ![[783572cab3f0f3841d00125458a4d628-cfd42703.png]] `acs` 用户默认登录进入的是 `/home/acs` 目录,而 `root` 用户进入的是 `/root` 目录。这是因为每个用户都有自己的**主目录**,普通用户的主目录位于 `/home` 目录下,而 `root` 用户的主目录位于 `/root`。 正如你所看到的,`acs` 用户尝试访问 `/root` 目录时,出现了权限拒绝 (`Permission denied`)。这是因为 `/root` 目录通常只允许 `root` 用户访问,即使 `acs` 用户有 `sudo` 权限,直接访问该目录也是不被允许的,除非使用 `sudo` 提升权限。 ### 创建用户命令整理 懂得了这些 那么当然 像acs这样的用户就可以创建很多 所用到的命令在这里做个整理 #### 1. 创建 `acs` 用户 首先,你在服务器上创建了一个新用户 `acs`,并为其设置了密码: ```bash # 创建新用户 acs adduser acs # 为 acs 用户设置密码 passwd acs ``` #### 2. 为 `acs` 用户添加 `sudo` 权限 接着,为了让 `acs` 用户具备管理员权限,你将其添加到 `wheel` 组: ```bash # 将 acs 用户添加到 wheel 组(具有 sudo 权限) usermod -aG wheel acs ``` #### 3. 测试 `acs` 用户的 `sudo` 权限 切换到 `acs` 用户,并测试其是否能够使用 `sudo` 命令: ```bash # 切换到 acs 用户 su - acs # 测试 sudo 权限 sudo whoami ``` 如果输出 `root`,则表示 `acs` 用户的 sudo 权限已经生效。 #### 4. 为 `acs` 用户配置 SSH 连接 为了让 `acs` 用户能够通过 SSH 密钥登录,你需要将你的私钥公钥对正确配置: 1. **生成或检查现有的私钥(假设你使用的是 `wei_01.pem` 私钥)** 在本地提取公钥: ```bash ssh-keygen -y -f ~/.ssh/wei_01.pem ``` 2. **将生成的公钥添加到远程服务器的 `acs` 用户授权文件中** 登录到远程服务器,切换到 `acs` 用户,并创建 `.ssh` 目录和 `authorized_keys` 文件: ```bash # 切换到 acs 用户 su - acs # 创建 .ssh 目录并设置权限 mkdir -p ~/.ssh chmod 700 ~/.ssh # 添加公钥到 authorized_keys 文件中,并设置权限 echo "你的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ``` 3. **配置 SSH 客户端连接** 在本地机器的 `~/.ssh/config` 文件中,添加如下配置,以确保 SSH 使用正确的私钥连接远程服务器: ```ssh-config Host alserver HostName 8.130.142.189 # 远程服务器的IP地址 User acs # 使用 acs 用户 IdentityFile ~/.ssh/wei_01.pem # 私钥文件路径 ``` 4. **测试 SSH 连接** 完成配置后,可以通过以下命令测试连接: ```bash ssh alserver ``` ## docker ### 概念 ![[ebede1738c378c9483d84748dde26f3b-0220ed84.png]] 方便不同云的数据迁移 方便 安全 之后的任务都在docker中进行 即使服务器版本、云服务平台不同 也能保证所有人环境相同 这就是docker的跨平台 直接从本地连接到docker里面 无关中间层 ![[0bd3f8d648ece588251f9e0948f08abd-dacbc321.png]] 由相同镜像生成的容器是完全一样的 然后我们的项目在容器中 由镜像生成 同时反过来 项目升级 也可以变成新的镜像 这个升级的过程 可能有多个版本 而必然有相同的部分 这也同git似的 docker会为我们进行管理 把相同部分进行压缩 #### 整理 1. **Docker 架构**: - **Docker** 通过镜像(Image)生成容器(Container)。镜像是静态的,可以理解为一个预配置的操作系统或应用程序模板。容器是运行时的实例,基于镜像启动,提供隔离的运行环境。 - 每个镜像可以生成多个容器,这些容器之间是相互独立的,但基于同样的镜像。 2. **容器的跨平台优势**: - Docker 的一个关键优势是能够在不同的平台上保持一致的运行环境。无论是在本地、不同的云服务平台,还是不同版本的服务器操作系统,Docker 都能通过镜像保证相同的环境。 - 这种隔离性和跨平台兼容性确保了开发和生产环境的一致性,大大简化了开发、部署和运维流程。 3. **方便数据迁移**: - Docker 提供了高度的灵活性,可以很方便地将应用程序从一个环境迁移到另一个环境。这对于云服务平台上的项目迁移尤为方便,同时确保了安全性。 4. **项目升级与镜像管理**: - 项目可以通过升级容器中的内容并生成新的镜像来实现更新。与 Git 的版本管理类似,Docker 也能够通过镜像层进行管理,将相同部分压缩,避免重复存储。 5. **连接到容器**: - 在开发和测试过程中,用户可以直接从本地连接到容器中进行操作,容器与宿主系统的环境是隔离的,因此无需担心平台或版本的差异。 总结来说,Docker 提供了一种高效的应用程序部署、管理和迁移方式,特别适用于多云平台和跨环境的应用开发。 迁移就直接 容器生成镜像 镜像打包到新服务器 再重新生成容器 就能保证和之前一模一样(打包带走 再拎包入住 )(致命魔术瞬间移动例子) 唉可惜没早些知道还能这样 不然之前做的那些东西也不至于都没了 ### 将当前用户添加到docker用户组 为了避免每次使用docker命令都需要加上sudo权限,可以将当前用户加入安装中自动创建的docker用户组(可以参考[官方文档](https://docs.docker.com/engine/install/linux-postinstall/)): ```bash sudo usermod -aG docker acs ``` 执行完此操作后,需要退出服务器,再重新登录回来,才可以省去sudo权限。 ### 镜像(images) 所有的镜像由两个部分构成 xxxx:xx (名称:版本号) 1. `docker pull ubuntu:20.04`:拉取一个镜像 2. `docker images`:列出本地所有镜像 3. `docker image rm ubuntu:20.04` 或 `docker rmi ubuntu:20.04`:删除镜像ubuntu:20.04 4. `docker [container] commit CONTAINER IMAGE_NAME:TAG`:创建某个container的镜像 5. `docker save -o ubuntu_20_04.tar ubuntu:20.04`:将镜像ubuntu:20.04导出到本地文件`ubuntu_20_04.tar`中 6. `docker load -i ubuntu_20_04.tar`:将镜像ubuntu:20.04从本地文件ubuntu\_20\_04.tar中加载出来 ### 容器(container) 把容器当成一个新的虚拟机或服务器 1. `docker [container] create -it ubuntu:20.04`:利用镜像ubuntu:20.04创建一个容器。 2. `docker ps -a`:查看本地的所有容器 3. `docker [container] start CONTAINER`:启动容器 4. `docker [container] stop CONTAINER`:停止容器 5. `docker [container] restart CONTAINER`:重启容器 6. `docker [contaienr] run -itd ubuntu:20.04`:创建并启动一个容器 7. `docker [container] attach CONTAINER`:进入容器 先按Ctrl-p,再按Ctrl-q可以挂起容器 8. `docker [container] exec CONTAINER COMMAND`:在容器中执行命令 9. `docker [container] rm CONTAINER`:删除容器 10. `docker container prune`:删除所有已停止的容器 11. `docker export -o xxx.tar CONTAINER`:将容器CONTAINER导出到本地文件xxx.tar中 12. `docker import xxx.tar image_name:tag`:将本地文件xxx.tar导入成镜像,并将镜像命名为image\_name:tag 13. `docker export/import`与`docker save/load`的区别: export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态 save/load会保存完整记录,体积更大 14. `docker top CONTAINER`:查看某个容器内的所有进程 15. `docker stats`:查看所有容器的统计信息,包括CPU、内存、存储、网络等信息 16. `docker cp xxx CONTAINER:xxx` 或 `docker cp CONTAINER:xxx xxx`:在本地和容器间复制文件 17. `docker rename CONTAINER1 CONTAINER2`:重命名容器 18. `docker update CONTAINER --memory 500MB`:修改容器限制 ### 实战 进入AC Terminal,然后: ```bash scp /var/lib/acwing/docker/images/docker_lesson_1_0.tar server_name: # 将镜像上传到自己租的云端服务器 ssh server_name # 登录自己的云端服务器 docker load -i docker_lesson_1_0.tar # 将镜像加载到本地 docker run -p 20000:22 --name my_docker_server -itd docker_lesson:1.0 # 创建并运行docker_lesson:1.0镜像 docker attach my_docker_server # 进入创建的docker容器 passwd # 设置root密码 ``` 去云平台控制台中修改安全组配置,放行端口20000。 返回AC Terminal,即可通过ssh登录自己的docker容器: ```bash ssh root@xxx.xxx.xxx.xxx -p 20000 # 将xxx.xxx.xxx.xxx替换成自己租的服务器的IP地址 ``` 然后,可以仿照上节课内容,创建工作账户acs。 最后,可以参考4. ssh——ssh登录配置docker容器的别名和免密登录。 #### 操作 将acterminal中的docker镜像上传到阿里云 ```bash scp /var/lib/acwing/docker/images/docker_lesson_1_0.tar alserver: ssh alserver ls ``` ![[b64d20c7d530d5213bb207563b54394f-aa6df86f.png]] 提取镜像文件 并查看 ```bash docker load -i docker_lesson_1_0.tar docker images ``` ![[17fceb2412770c7e6fd0bad8235267f2-10f9a1fb.png]] 创建并运行容器 安全组开放20000端口 ![[image-6069fea3.png]] ```bash docker run -p 20000:22 --name my_docker_server -itd docker_lesson:1.0 docker ps ``` (容器内的22端口映射到本地的20000端口) 成功 宝塔上也看得到 ![[a5ba771e9a6bdac0ba4dac038d452700-f3ebc94d.png]] 进入创建的容器 生成密码 为后续本地直接连接容器内部而不是阿里云服务器再进去做铺垫 ```bash docker attach my_docker_server passwd ``` ![[8f8f2ffe672b2c354c2191b782a92f93-02f44c32.png]] ctrl+p ctrl+q 挂起 ![[f8b48f79d1c46aae182b6e96ee8ec8c7-d53af326.png]] 本地(服务器上)登入 ```bash ssh root@localhost -p 20000 ``` ![[1cbfc5032b66f519e9918f06135a71d7-509ea738.png]] 远程登入 记得开放安全组 acterminal: ```bash ssh root@8.130.142.189 -p 20000 ``` ![[8e292507cd2f900e31ddeeebb1bb9fcd-4b192253.png]] 本地win: ![[0aeed3be8efd47a25d885263936cf5b0-c408fcc7.png]] 成功 所以可以在任意设备进入容器中操作了 这意味着什么 可以想象成 自己在阿里云服务器里又创建了一个服务器 我们又可以做创建用户、做项目git上传等等一系列操作 没有所谓的其他项目环境的干扰 专心可以完成自己的某一个项目 这想必就是docker的隔离性 而且对于之后的迁移 也无需再考虑什么下载相关依赖 不同的liunx系统啊 不同的服务提供商啊 直接跳过了他们这一环节 在一个封闭的“容器”里实现自己的项目 这就是可移植性 之前的晦涩的概念在这一下全具象化了 这就是y总 把一个容器就想象成一个服务器 你甚至可以继续套娃 再在容器里下一个docker 再配置镜像、容器……当然 也可以配置ssh 密钥对 实现免密登入 但没必要 ##### 容器的隔离性 通过这种方式,实际上是在阿里云服务器上创建了一个独立的 "小服务器"(即容器)。在这个容器中,你可以创建新的用户、部署项目、上传代码等,所有操作都不会影响宿主机或其他容器。这就是 Docker 的隔离性:每个容器都有自己的文件系统、网络环境和进程空间,确保容器之间的互不干扰。 这种隔离性带来了以下好处: - **环境独立性**:不同的项目可以在各自的容器中运行,避免环境依赖冲突。 - **可移植性**:可以将容器迁移到不同的服务器或平台,保证环境的一致性。 - **安全性**:容器之间隔离,某个容器的故障不会影响其他容器或宿主机。 在容器里下一些工具: ```bash apt-get install sudo sudo apt-get update sudo apt-get install tmux ``` 将本地的一些配置传到容器中 ```bash scp -P 20000 .bashrc .vimrc .tmux.conf root@8.130.142.189: ``` ![[742ae8ae8af61e94f29912ddc17c7206-4d28b636.png]] 这样一来 就找到了熟悉的感觉 这里我把三个文件提取到本地 以后都可以方便的导入配置linux配置.zip ##### 为容器配置免密登入 安装ssh服务 ```bash apt-get update apt-get install openssh-server ``` 设置允许密码登入 ```bash vim /etc/ssh/sshd_config 保证以下内容未被注释 # 允许密码认证 PasswordAuthentication yes # 允许 root 用户登录 PermitRootLogin yes 重启ssh服务 service ssh restart ``` 传输公钥 配置文件至容器 用户目录下的.ssh目录 ```bash scp -P 20000 authorized_keys config known_hosts root@localhost:~/.ssh ``` 修改主动连接机的.ssh/config win: ![[5efdbcf9c420c4e8ab7d6a98157dc97a-5ad7bcda.png]] 云(local) ![[c5d750617e38693c1f7e51b243d79374-f66304da.png]] 这里改成localhost应该也是没问题的 ![[dd8d16ef3f8588b2fe0e4a2d05afbc7f-49dcb25d.png]] 现在密钥登入已经用过很多遍了 原理就是 把公钥传到被连接端~/.ssh 然后在主动连接端设置好别名 私钥路径 以及端口 就可以很方便的连接上 另外一个类似的玩机小技巧 我们知道win+r cmd可以启动终端 那么win+r输入自定义命令打开想要打开的程序该怎么做? 只需要将程序的exe文件创建快捷方式 移动到C:\Windows目录下 然后改名为指定命令即可 ![[cc1cd869fcf1e29716c3634b9b9cab58-a9aebd44.png]] ![[d8d5fc9f56875360f3b770cc13641ab3-d8d5fc9f.gif]] ### 小Tips 如果apt-get下载软件速度较慢,可以参考[清华大学开源软件镜像站](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)中的内容,修改软件源。 --- **项目分区导航**:[[25-管道、环境变量、常用命令|管道、环境变量、常用命令]] ⬅️ | 26-租服务器及配置环境 | ➡️ [[27-拓展|拓展]]