(致谢技术非常强的专家

00 需求

需要配置一些新的服务器,只能通过 ssh boss@172.16.1.100 来连接,然后在 /data1 磁盘下创建自己的 docker,用 ssh 连接 docker 来使用服务器。

(boss 和 172.16.1.100 地址均为虚构,在使用时,需要替换成自己希望配置的服务器地址,和可以使用的账号)

系统:Ubuntu 20.04,有 nvidia 显卡。

01 安装 docker

(我需要配置的服务器里已经安装了 docker,因此没有做这个步骤。以下教程是 LLM 生成的)

# 首先,确保系统中没有旧版本的 Docker
sudo apt-get remove docker docker-engine docker.io containerd runc # 然后,更新包列表并安装必要的包
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common # 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 设置 Docker 的稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 更新包列表以包含 Docker 仓库中的软件包
sudo apt-get update # 安装 Docker CE、Docker CLI 和 Containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io # 检查 Docker 的安装版本
docker --version # 验证 Docker 是否安装成功,这个命令会下载并运行一个测试镜像
sudo docker run hello-world # 最后,配置 Docker 开机自启
sudo systemctl enable docker

为了不使用 sudo 运行 Docker 命令,可以将当前用户添加到 docker 组:

sudo usermod -aG docker $USER

重新登录或重启系统以使组更改生效。

02 准备工作

新建准备放 docker 的目录,并改变目录权限:(<user_name> 是我的名字,在跑命令时,需要替换成希望 docker 拥有的名字)

sudo mkdir /data1/<user_name>
sudo chown boss /data1/<user_name>/ -R
sudo chgrp boss /data1/<user_name>/ -R
mkdir /data1/<user_name>/docker
mkdir /data1/<user_name>/project

配置 ssh 的 authorized_keys:

cd /data1/<user_name>/docker/
vim authorized_keys
# 把本地电脑 user/.ssh 里面的 id_rsa.pub 的内容复制上去

03 配置 Dockerfile 和 docker composer

新建 Dockerfile:

cd /data1/<user_name>/docker/
vim Dockerfile

Dockerfile 的具体内容:

# 看一下 docker images 里面有哪些镜像
FROM nvidia/cuda:11.6.0-devel-ubuntu20.04 # 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 安装基础软件
RUN apt-get update && \
apt-get install -y \
openssh-server \
python3 \
python3-pip \
vim \
git \
wget \
curl \
unzip \
sudo \
net-tools \
iputils-ping \
build-essential \
cmake \
htop \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* # 安装其他软件
RUN apt-get update && \
apt-get install -y \
tmux \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* # 创建用户(保持与宿主机相同的 UID 避免权限问题)
RUN useradd -m -u 1001 -s /bin/bash <user_name> # sudo without password
RUN echo "<user_name> ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers USER <user_name>
WORKDIR /home/<user_name> # 创建 .ssh 目录并设置权限
RUN mkdir -p /home/<user_name>/.ssh && \
chown -R <user_name>:<user_name> /home/<user_name>/.ssh && \
chmod 700 /home/<user_name>/.ssh # 安装 Conda
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \
bash miniconda.sh -b -p /home/<user_name>/miniconda && \
rm miniconda.sh
RUN /home/<user_name>/miniconda/bin/conda init bash CMD ["/bin/bash"]

配置 docker composer 之前,先确认哪个端口可用:

sudo netstat -tuln
# 找一个不被列出的端口,比如 8012

然后,新建 docker composer:

cd /data1/<user_name>/docker/
vim docker-compose.yml

docker-compose.yml 的具体内容:

version: '3.8'

services:
<user_name>:
container_name: <user_name> # 设置容器名称
build: . # 使用当前目录下的 Dockerfile 构建镜像
image: <user_name> # 镜像名称
restart: unless-stopped
runtime: nvidia # 启用 GPU 支持
ports:
- "8012:22" # 选择一个未被占用的端口(请确认 8012 可用)
volumes:
- /data1/<user_name>/project:/home/<user_name>/project # 挂载项目目录
- /data1/<user_name>/docker/authorized_keys:/home/<user_name>/.ssh/authorized_keys # SSH
environment:
- NVIDIA_DRIVER_CAPABILITIES=all
command: /bin/bash -c "sudo service ssh start && sleep infinity"

一个兼容旧版本 docker 的 docker composer(我并不懂什么旧版本,都是专家写的)

services:
container_name: <user_name> # 设置容器名称
build: . # 使用当前目录下的 Dockerfile 构建镜像
restart: unless-stopped
ports:
- "8012:22" # 选择一个未被占用的端口(请确认 8012 可用)
volumes:
- /data1/<user_name>/project:/home/<user_name>/project # 挂载项目目录
- /data1/<user_name>/docker/authorized_keys:/home/<user_name>/.ssh/authorized_keys # SSH
environment:
- NVIDIA_DRIVER_CAPABILITIES=all
command: /bin/bash -c "sudo service ssh start && sleep infinity"

04 启动 docker

然后,启动 docker:

cd /data1/<user_name>/docker/
docker compose build # build Dockerfile
docker compose up -d # 启动 docker
# 旧版本 docker
docker-compose build # build Dockerfile
docker-compose up -d # 启动 docker # 进入 docker 看一下
docker exec -it <user_name> bash
# 然后 ls,会看到 miniconda 和 project 两个目录,所有需要映射到磁盘、不希望丢失的文件都需要放到 project 里 # 查看目录权限
ls -al # 发现权限有问题,退出 docker,再改一下目录的权限
sudo chown boss /data1/<user_name>/ -R
sudo chgrp boss /data1/<user_name>/ -R # 如果发现 Dockerfile 写错了,或者想加一些东西,可以再跑
docker compose build # build Dockerfile
docker compose up -d # 启动 docker # 假设已经进入了 docker,想改 docker 的 ./ssh 的权限
docker exec -it <user_name> bash
sudo chown <user_name> ~/.ssh -R
sudo chgrp <user_name> ~/.ssh -R # 暂时停止和启动 docker
docker compose stop
docker compose start # 把 docker 杀掉
docker compose down

05 测试能否 ssh 连接这个 docker(可能需要结合 04 来 debug)

# 在本地电脑上连接
ssh -p 8012 <user_name>@172.16.1.100

ssh 连接不成功(比如让输密码),很可能是 docker 内外的 .ssh 或 authorize_keys 的权限出了问题,docker 外要改成 boss,dockers 内要改成 <user_name>。

如果连接时出现

ECDSA host key for [172.16.1.100]:8012 has changed and you have requested strict checking.
Host key verification failed.

则需要把 known_host 里面的 172.16.1.100 删除,上面的错误提示会给出需要执行的命令。

Docker | 如何在 Linux 服务器使用 docker的更多相关文章

  1. 如何在Linux服务器中隐藏PHP版本

    通常,大多数默认设置安装的web服务器存在信息泄露,这其中之一就是PHP.PHP 是如今流行的服务端html嵌入式语言(之一?).在如今这个充满挑战的时代,有许多攻击者会尝试发现你服务端的漏洞.因此, ...

  2. 如何在linux服务器上使用hanlp

    关于如何在linux服务器上使用hanlp也有分享过一篇,但分享的内容与湘笑的这篇还是不同的.此处分享一下湘笑的这篇hanlp在linux服务器上使用的文章,供新手朋友学习之用. 本文主要工作是在li ...

  3. 如何在linux服务器部署Rstudio server,配置ODBC远程访问win 服务器上的SQL server

    如何在linux服务器部署Rstudio server,配置ODBC后通过RODBC包远程访问SQL server 背景介绍:之前写过一篇文章,提到近期要部署Rstudio server(搭建数据分析 ...

  4. 如何在Linux服务器上部署禅道

    最近换了新的项目团队,由于新团队比较年轻化,没有实行正规的项目管理,于是我自告奋勇要为团队管理出一份力,帮助团队建立敏捷化的项目管理,经过多方考究和对比后,选择了目前较受欢迎的开源项目管理软件:禅道. ...

  5. linux服务器创建docker

    关于Docker在Linux服务器中的安装以及使用1 安装: yum install docker 2 启动: systemctl start docker.service 3.加入开机启动: sys ...

  6. 如何在Linux服务器和windows系统之间上传与下载文件

    Do not let dream just be your dream. 背景:Linux服务器文件上传下载. XShell+Xftp安装包(解压即用)百度网盘链接:https://pan.baidu ...

  7. 如何在Linux服务器上部署Mysql

    一.安装mysql 1.通过文件上传工具,将mysql安装包上传到linux服务器上 2.卸载mariadb包,由于系统中存在mariadb包会导致mysql安装时报错mariadb-libs被mys ...

  8. Linux服务器使用Docker部署.net Core项目

    发布ASP.NET Core项目 和普通的项目发布一样,将项目发布到目标文件夹中 构建Dockerfile文件 在目标文件根目录新建Dockerfile文件(没有后缀) FROM microsoft/ ...

  9. .net core3.0部署Linux服务器 使用Docker容器和Nginx反代理教程

    本人刚接触.net core 由于公司项目需要部署在Linux上 近些日子学习和网上大面积搜教程 我在这给大家归拢归拢借鉴的教程做了套方案(我写的可以实现 但不一定是最好的 仅供参考) 我只用过cor ...

  10. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

随机推荐

  1. klippy — reactor模块

    该模块负责管理事件的注册.调度和处理,充当事件驱动的核心引擎,驱动整个klippy系统的运行. 该模块提供了一个统一的接口register_callback,使各个模块能够注册自己的回调函数以响应特定 ...

  2. 注册中心如何选型?Eureka、Zookeeper、Nacos怎么选

    这是小卷对分布式系统架构学习的第9篇文章,第8篇时只回答了注册中心的工作原理的内容,面试官的第二个问题还没回答,今天再来讲讲各个注册中心的原理,以及区别,最后如何进行选型 上一篇文章:如何设计一个注册 ...

  3. Appium_WebDriverAgent安装

      一.WebDriverAgent安装到ios测试设备 a) 切换到appium 的appium-webdriveragent目录(/Applications/Appium.app/Contents ...

  4. CDS标准视图:维护计划员组 I_MAINTENANCEPLANNERGROUP

    视图名称:维护计划员组 I_MAINTENANCEPLANNERGROUP 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Planne ...

  5. js操作shadow-root内的DOM元素

    其实就是 documentfragment元素,就是动态生成的文档碎片元素. 1,项目中在DOM结构里遇到了shadow-root(open),用JS方法无法直接获取其内的DOM元素 2.shadow ...

  6. SSH 框架的搭建

    Structs1+spring+Hibernate Structs  相当于mvc设计模式中V.C,即jsp页面和Servlet: spring 管理业务逻辑,即Service: Hibernate ...

  7. sql注入学校后台

    有运气成分,遇到两个学校,子域名查询了一下发现有登录平台,然后就直接sql了 payload:admin'or 1=1--+ 很离谱,这年头这两学校还能直接被sql进入后台. 然后进学校后台后就可以直 ...

  8. oracle数据导入导出,备份还原命令expdp&impdp(只导出元数据,不导出表数据,最全,最完善的步骤)

    感谢金龙鱼先生分享,原文来自https://blog.csdn.net/kou869929526/article/details/125791113 一,编码要求以及数据库版本要求 检查数据库版本(用 ...

  9. 创新突破!天翼云荣膺CCF HPC China 2024高性能计算创新大奖

    近日,第20届CCF全国高性能计算学术年会(CCF HPC China 2024)在武汉隆重召开.CCF HPC China是全球高性能计算领域三大标志性盛会之一,本届大会以"华章廿载 新质 ...

  10. windows 安装Nacos步骤

    一.Nacos中文文档网址 1.Nacos官网地址:https://nacos.io/en-us/ Nacos中文文档网址:Nacos 快速开始https://nacos.io/zh-cn/docs/ ...