如何利用ssh使得pycharm连接服务器的docker容器内部环境

如题,想要配置服务器的python编译器环境,来查看容器内部环境安装的包的情况。

首先,需要确定容器的状态,使用docker ps 查看,只有ports那一栏有内容才证明容器暴露了端口出来。如果没有暴露,就需要将容器打包成镜像,然后将镜像再启动一个容器才可以。步骤如下:

如何打包镜像:(里面包括了将镜像从A服务器远程传输到B服务器后使用的方法,如果是在本服务器自己使用,那么忽略远程传输的步骤)

# 创建一个基于当前容器状态的新镜像,以便可以分发或重新使用。
docker commit my_container my_new_image
#  docker commit:此命令用于将容器的当前文件系统更改保存为新的镜像。
#  my_container:要提交的容器的名称或 ID。
#  my_new_image:新镜像的名称。

docker images
# 命令列出了当前系统中的所有镜像,包括你刚刚创建的新镜像,用于查看imagesID。

# 将镜像保存为一个可移植的压缩文件,便于传输和分发。
docker save d0f2ae8beba3 | pigz > msit_t63_4g.tgz
# docker save d0f2ae8beba3:将指定镜像(由 ID d0f2ae8beba3 标识)保存为 tar 存档。
# | pigz:通过管道将 tar 存档传递给 pigz 工具进行压缩。
# > msit_t63_4g.tgz:将压缩后的输出保存为 msit_t63_4g.tgz 文件。
# 这一步会等待一两分钟

# 将压缩的镜像文件从当前机器传输到远程机器 71.14.88.29 的指定目录。
scp xxx.tgz [email protected]:/home/q00885284
# scp:安全复制协议,用于在本地主机和远程主机之间.copy文件。
# xxx.tgz:要传输的文件名。
# [email protected]:/home/q00885284:远程主机的用户名、IP 地址和目标目录。
# 这一步会让你输入密码

# 在远程机器上恢复镜像,使其可用于创建容器。
docker load -i xxx.tgz
# docker load:加载一个镜像存档到 Docker 镜像库。
# -i xxx.tgz:指定要加载的镜像文件。

#因为当时压缩时候没有标签,所以这一步要查看新的镜像并重新打回标签
docker images

#给没有名字和标签的镜像重新命名
docker tag  :
# image_id 你查出来的镜像id;new_repository:镜像名字;new_tag:标签名,例如latest,v1.0等

然后重新run一个容器(注意要去掉--network=host参数,要加上-p 8080:22参数,这样就可以让容器暴露一个端口出来)

需要替换的内容:--name 后面的 “my_container”是容器名称,自己替换

最后一行的 123456789ad ,实际是镜像的id,通过docker images 命令可以查到,替换掉

docker run --name my_container  -it -d --shm-size=500g \
    --privileged=true \
    -w /home \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --entrypoint=bash \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /usr/local/sbin:/usr/local/sbin \
    -v /home:/home \
    -v /data:/data \
    -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
    -p 8080:22 \
    123456789ad

创建好容器之后,就按照如下两个网站一步一步走即可(注意主要参考第一个网站)

blog.csdn.net

blog.csdn.net

ps1:如果里面的passwd命令没发现,需要

apt update && apt install -y passwd

或者

yum install -y passwd

ps2:如果服务器是yum命令的操作系统(即上述攻略中的操作不起作用),那么ssh启动服务步骤如下:

#寻找sshd服务位置
whereis sshd
#终端输出:sshd: /usr/sbin/sshd

开启ssh服务:
/usr/sbin/sshd
#终端输出:
/etc/ssh/sshd_config line 139: Deprecated option RSAAuthentication
Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
#上述输出表示,SSH 服务无法启动的原因是缺少主机密钥文件(host keys)。SSH 服务需要这些密钥文件来加密通信,如果它们不存在,服务将无法启动。
#解决方案如下


---

### 1. **生成 SSH 主机密钥**
SSH 主机密钥文件通常位于 `/etc/ssh/` 目录下,包括:
- `/etc/ssh/ssh_host_rsa_key`
- `/etc/ssh/ssh_host_ecdsa_key`
- `/etc/ssh/ssh_host_ed25519_key`

你可以使用以下命令生成这些密钥文件:
```bash
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
```

---

### 2. **检查密钥文件的权限**
确保生成的密钥文件具有正确的权限:
```bash
chmod 600 /etc/ssh/ssh_host_*_key
chmod 644 /etc/ssh/ssh_host_*_key.pub
```

---

### 3. **修复配置文件中的过时选项**
错误信息中提到 `/etc/ssh/sshd_config line 139: Deprecated option RSAAuthentication`,说明配置文件中有一个过时的选项 `RSAAuthentication`。

打开配置文件:
```bash
vi /etc/ssh/sshd_config
```
找到第 139 行,删除或注释掉 `RSAAuthentication` 选项:
```bash
# RSAAuthentication yes
```
保存并退出。

---

### 4. **重新启动 SSH 服务**
生成密钥文件并修复配置文件后,尝试重新启动 SSH 服务:
```bash
/usr/sbin/sshd
```

---

### 5. **检查 SSH 服务是否运行**
使用以下命令检查 SSH 服务是否正在运行:
```bash
ps aux | grep sshd
```
如果看到 `/usr/sbin/sshd` 进程,说明 SSH 服务已成功启动。

---

上述解决过程具体在终端中的输入和输出如下(供参考):

[root@afaa384fd67d home]# /usr/sbin/sshd
/etc/ssh/sshd_config line 139: Deprecated option RSAAuthentication
Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
[root@afaa384fd67d home]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
Generating public/private rsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_rsa_key
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub
The key fingerprint is:
SHA256:3eWKzdd05BeKz3I1ShTrC+j6Viem3Eb7L7iuzCOzr3U root@afaa384fd67d
The key's randomart image is:
+---[RSA 3072]----+
|             .   |
|              o  |
|             o...|
|         ...+o.o.|
|        S..o.+.o=|
|        .  O=o+o+|
|        .oBEO*. .|
|       o==.=oo   |
|       +O*=oo.o. |
+----[SHA256]-----+
Generating public/private ecdsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_ecdsa_key
Your public key has been saved in /etc/ssh/ssh_host_ecdsa_key.pub
The key fingerprint is:
SHA256:yChURNODeY16W/jEdVny+9Eq9L3UAZJYgjXE0i8n21o root@afaa384fd67d
The key's randomart image is:
+---[ECDSA 256]---+
|   o=+ o*= ..o.  |
|   .o.=o.o* +o   |
|  .  o +.o.+ ..  |
| .  .oo.+o o. ...|
|  . ..o=S * . .o.|
|   .  . .. E . ++|
|          o . o.+|
|         .   .. .|
|               . |
+----[SHA256]-----+
Generating public/private ed25519 key pair.
Your identification has been saved in /etc/ssh/ssh_host_ed25519_key
Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub
The key fingerprint is:
SHA256:42YoLnW+/IRsKaVPiz/oMF1OU6geenJtJnrAFl+f/Cs root@afaa384fd67d
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|       .         |
|      . .        |
|  .  ...         |
| . oo.=oS.       |
|  ++oX.*+.       |
| .=oX+% =.       |
|  .Oo%o=E .      |
|  .++.*+....     |
+----[SHA256]-----+
[root@afaa384fd67d home]# chmod 600 /etc/ssh/ssh_host_*_key
chmod 644 /etc/ssh/ssh_host_*_key.pub
[root@afaa384fd67d home]# vi /etc/ssh/sshd_config
[root@afaa384fd67d home]# /usr/sbin/sshd
[root@afaa384fd67d home]# ps aux | grep sshd
root         288  0.0  0.0  16188  1220 ?        Ss   17:46   0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root         290  0.0  0.0   3040  1212 pts/1    S+   17:46   0:00 grep --color=auto sshd

ps3:mapping后的目录操作(本地项目与ssh项目映射)

 如何利用ssh使得pycharm连接服务器的docker容器内部环境_第1张图片

 前述创建ssh连接时候有一步是填mapping地址的,建议将本地一个准备好的空文件夹与ssh远程的项目目录文件夹对应。然后点击上图中的Download会自动将ssh远程目录文件下载到本地,上传应该是反过来的。

ps4:

不要把数据集、权重之类的数据文件夹放到pycharm工作目录里面,不然对比更新特别费劲。

以上操作完成后,远程可以连接到docker内部了

你可能感兴趣的:(docker,容器,运维,pycharm,ssh)