---
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-拓展|拓展]]