Docker+PyCharm+ssh部署深度学习docker环境

安装并配置docker

1. 更新软件源

bash 复制代码
   sudo apt update
   sudo apt upgrade

2. 安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库

bash 复制代码
	sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

3. 添加 Docker 的官方 GPG 密钥和官方库

bash 复制代码
	curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
	echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. 更新ubuntu源列表

bash 复制代码
	sudo apt update

5. 安装最新的docker ce

bash 复制代码
	sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

(可选)查看可以安装的其他docker版本

bash 复制代码
	apt-cache madison docker-ce
复制代码
输出如下所示:
"
    docker-ce | 5:27.3.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:27.3.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:27.2.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:27.2.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:27.1.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:27.1.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:27.1.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
"

挑选版本进行安装,如下:

bash 复制代码
   sudo apt install docker-ce=5:27.3.0-1~ubuntu.22.04~jammy docker-ce-cli=5:27.3.0-1~ubuntu.22.04~jammy containerd.io

6. 验证 Docker 服务是否在运行

bash 复制代码
 	systemctl status docker
复制代码
如果输出如下,则安装成功.
bash 复制代码
  "● docker.service - Docker Application Container Engine
      Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
      Active: active (running) since Wed 2024-11-27 08:32:25 CST; 20min ago
      TriggeredBy: ● docker.socket
      Docs: https://docs.docker.com
      Main PID: 49566 (dockerd)
      Tasks: 21
      Memory: 21.5M
        CPU: 759ms
      CGroup: /system.slice/docker.service
              └─49566 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/con>
    "

7. Docker配置

7.1 Docker设置代理

7.1.1 创建或编辑Docker配置文件

bash 复制代码
	sudo gedit /etc/systemd/system/docker.service.d/http-proxy.conf

7.1.2 在文件中添加内容如下(<PROXY_URL>为自己的代理地址):

bash 复制代码
	"
	    [Service]
	    Environment="HTTP_PROXY=http://<PROXY_URL>"
	    Environment="HTTPS_PROXY=http://<PROXY_URL>"
	"

7.1.3 重新加载和重启 Docker

bash 复制代码
	sudo systemctl daemon-reload
	sudo systemctl restart docker

7.1.4 验证代理配置

bash 复制代码
	docker info | grep Proxy
7.2 Docker加入用户组(避免每次使用sudo)

7.2.1 将用户加入docker用户组,避免每次都要使用sudo.

7.2.2 检查 docker组是否存在:

bash 复制代码
    getent group docker

如果输出中有 docker❌...,说明组存在。

7.2.3 将用户添加到docker组:

bash 复制代码
    sudo usermod -aG docker $USER

7.2.4 注销并重新登录: 让组权限生效,需要注销当前会话并重新登录。

验证: 执行以下命令,验证是否还需要 sudo.

bash 复制代码
    docker run hello-world

如果不再需要 sudo,说明权限配置成功。

docker的基本使用

1. docker镜像拉取

bash 复制代码
   docker pull <镜像名>:<tag id>  

2. 查看docker中存在的镜像

bash 复制代码
    docker images

3 删除指定镜像

bash 复制代码
    docker rmi <镜像ID>

4. 从镜像创建docker容器并运行

bash 复制代码
    docker run -it \
        -p 2222:22
        --name $CONTAINER_NAME \
        --network host \
        --privileged \
        --gpus all \
        -e DISPLAY=$DISPLAY \
        -e QT_X11_NO_MITSHM=1 \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        -v $WORKSPACE_DIR:/workspace \
        -v /dev:/dev \
        -v /etc/localtime:/etc/localtime:ro \
        -v /var/run/docker.sock:/var/run/docker.sock \
        --security-opt seccomp=unconfined \
        $IMAGE_NAME \
        /bin/bash 

5. 开启容器

bash 复制代码
   docker start <容器ID或容器名>

6. 停止容器

bash 复制代码
   docker stop <容器ID或容器名>

7. 进入已经存在的容器

bash 复制代码
   docker exec -it <容器名>   /bin/bash

8. 列出docker中的所有容器

bash 复制代码
   docker ps -a

9. 删除指定容器

bash 复制代码
   docker rm <容器ID或容器名>    (已经停止的容器)    
   docker rm -f  <容器ID或容器名> (强制删除一个运行中的容器)

常用脚本

Nvidia docker一键安装脚本(nvidia_container_install.sh)

bash 复制代码
# 添加 NVIDIA 包仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
         sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
         sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 更新包列表
sudo apt-get update

# 安装 NVIDIA Container Toolkit
sudo apt-get install -y nvidia-container-toolkit

# 配置 Docker 守护进程
sudo nvidia-ctk runtime configure --runtime=docker

# 重启 Docker 守护进程
sudo systemctl restart docker

一键创建带有ssh的docker终端的shell脚本(setup_nvidia_docker.sh)

bash 复制代码
#!/bin/bash

# ====== 用户自定义参数 ======
IMAGE_NAME="pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime"      # Docker镜像名
CONTAINER_NAME="sparseocc"            # 容器名称
USER_NAME="sparseocc"                     # 容器内用户名
USER_PASSWORD="210510"             # 容器内用户密码
HOST_SSH_PORT=2248                       # 主机映射的SSH端口
HOST_MOUNT_DIR="/home/kiku/data/code_data/docker/workspace/sparseocc_project"     # 本地挂载目录
CONTAINER_MOUNT_DIR="/workspace"    # 容器内挂载目录
# ===========================

# 1. 生成容器并安装ssh、sudo、x11依赖
docker run -itd \
  --gpus all \
  --name ${CONTAINER_NAME} \
  --hostname ${CONTAINER_NAME} \
  -p ${HOST_SSH_PORT}:22 \
  -e DISPLAY=$DISPLAY \
  -e QT_X11_NO_MITSHM=1 \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v ${HOST_MOUNT_DIR}:${CONTAINER_MOUNT_DIR} \
  ${IMAGE_NAME} \
  bash

# 2. 配置X11转发(主机需允许本地连接)
xhost +local:root

# 3. 在容器内创建用户、安装ssh、设置密码等
docker exec -it ${CONTAINER_NAME} bash -c "
apt update && apt install -y sudo openssh-server vim
useradd -m -s /bin/bash ${USER_NAME}
echo '${USER_NAME}:${USER_PASSWORD}' | chpasswd
usermod -aG sudo ${USER_NAME}
mkdir -p /var/run/sshd
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config
service ssh start
"

# 4. 设置SSH端口映射(host模式下可省略,直接用容器IP和22端口)
# docker run时如用-p ${HOST_SSH_PORT}:22 --network bridge,则需此步

echo "容器已启动,用户名: ${USER_NAME},密码: ${USER_PASSWORD}"
echo "SSH登录命令(host网络模式下,容器IP与主机一致):"
echo "ssh ${USER_NAME}@localhost -p ${HOST_SSH_PORT}"
echo "如需图形界面,确保主机已执行:xhost +local:root"

PyCharm远程ssh进入docker中使用docker的python解释器

1. 确保使用setup_nvidia_docker.sh 安装完成了docker容器中的nvidia驱动,并且在docker hub中拉取你需要的镜像,然后使用setup_nvidia_docker.sh脚本,创建对应的容器。

2. 查看容器当前的状态以及对应的端口号

如下所示:

容器的端口号对应为2248,与sh脚本中设置的一致,并且docker处于激活状态。可以直接在pycharm中添加对应的解释器了。

3. pycharm进行ssh解析器配置

Username:输入上述脚本中对应的名字, Host输入本机的ip(localhost) 端口与sh脚本中自定义端口一致,点击 Next,进入下一步。

密码栏输入sh脚本中设置的自定义密码,点击Next。

Interpreter选择docker环境中你需要使用的python解释器,sync folders选择的分别是你本机上的工作空间与docker环境中的工作空间路径,pycharm会给这两个路径之间生成映射。这样整个环境就配置完成了。

此时查看右下角的解释器就变为了docker中的解释器了。

相关推荐
loopdeloop33 分钟前
基于CentOS的分布式GitLab+Jenkins+Docker架构:企业级CI/CD流水线实战全记录
分布式·docker·centos
码农101号3 小时前
Linux中Docker Compose介绍和使用
linux·运维·docker
IT成长日记4 小时前
【Docker基础】Dockerfile多阶段构建:Multi-stage Builds详解
运维·docker·容器·multi-stage·builds
BUTCHER510 小时前
Docker镜像使用
java·docker·容器
小趴菜吖10 小时前
使用macvlan实现容器的跨主机通信
docker
无敌糖果10 小时前
K8S的Helm包管理器
docker·容器·kubernetes·helm·helm安装包
筱小虾米10 小时前
Docker配置国内镜像源
运维·docker·容器
爱听许嵩歌11 小时前
新版本PyCharm Conda环境设置 “找不到conda可执行文件”的解决
ide·pycharm·conda
开挖掘机上班13 小时前
基于Alpine构建MySQL镜像
mysql·docker·容器
todoitbo13 小时前
docker搭建freeswitch实现点对点视频,多人视频
docker·容器·音视频·freeswitch·视频聊天