Docker | 如何在 Linux 服务器使用 docker

news/2025/3/19 0:29:58/文章来源:https://www.cnblogs.com/moonout/p/18780126

目录
  • 00 需求
  • 01 安装 docker
  • 02 准备工作
  • 03 配置 Dockerfile 和 docker composer
  • 04 启动 docker
  • 05 测试能否 ssh 连接这个 docker(可能需要结合 04 来 debug)


(致谢技术非常强的专家

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/sudoersUSER <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 bashCMD ["/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-stoppedruntime: 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=allcommand: /bin/bash -c "sudo service ssh start && sleep infinity"

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

services:container_name: <user_name> # 设置容器名称build: . # 使用当前目录下的 Dockerfile 构建镜像restart: unless-stoppedports:- "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=allcommand: /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  # 会变成 Recreating <user_name># 假设已经进入了 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 删除,上面的错误提示会给出需要执行的命令。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清理 Python 包管理工具 pip 的缓存

清理 Python 包管理工具 pip 的缓存清理 Python 包管理工具 pip 的缓存 要清理 pip 的缓存,可以按照以下步骤操作(适用于 Python 的包管理工具 pip):检查 pip 缓存位置 pip 默认会将下载的包缓存在本地。你可以通过以下命令查看缓存目录: pip cache dir常见的缓存路径:Wi…

清理 Python 的包管理工具 pip 的缓存

清理 Python 的包管理工具 pip 的缓存清理 Python 的包管理工具 pip 的缓存 要清理 pip 的缓存,可以按照以下步骤操作(适用于 Python 的包管理工具 pip):检查 pip 缓存位置 pip 默认会将下载的包缓存在本地。你可以通过以下命令查看缓存目录: pip cache dir常见的缓存路径…

微服务的网关配置

微服务的网关配置 1. 网关路由 1.1 网关 1.1.1 存在问题 单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:每个微服务都需要编写身份校验、用户信息获取的接口,非常麻烦。 用户…

博客图床 VsCode + PigGo + 阿里云OSS方案

关键字 写博客,图床,VsCode,PigGo,阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上,但是图片上传遇到了问题。我需要手动到不同平台上传文件,非常耗费时间和经历。 为了解决这个问题,我想到了图床方案,我只需要把图片链接放到我本地写好的…

20244203张晨曦 实验一《Python程序设计》实验报告

20244203张晨曦《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 张晨曦 学号:20244203 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 专选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和…

Cobalt Strike基础

Cobalt Strike基础 Staged(有阶段) 在有阶段的执行方式中,分为Stager和Stage两个阶段Stager(初始执行载荷):​ 定义:Stager是Stage 1,是一个较小的、轻量级的初始执行载荷 ​ 作用:与服务端建立初始连接,并从服务器下载更大的Payload,也就是Stage2Stage(更大、…

OP222柔性振动白色料盘污染会引发的问题

下图为污损的料盘料盘污损会导致以下问题: 1.料盘里面缺料但是后面料仓就是不送料 柔性振动系统里面设置了加料个数,下图里面设置为15,表示如果相机识别区域里面的总阴影面积<15个零件面积,料仓加一次料。下图红框是识别区域,里面一道道横杠就是污损导致的阴影,这些阴…

鸿蒙特效教程05-鸿蒙很开门特效

鸿蒙特效教程05-鸿蒙很开门特效本教程适合HarmonyOS初学者,通过简单到复杂的步骤,通过层叠布局 + 动画,一步步实现这个"鸿蒙很开门"特效。本教程能收获Stack 层叠布局 animate、animateTo 动画 @State 状态管理最终效果预览 屏幕上有一个双开门,点击中间的按钮后…

An Elder Brother Is Like a Father :My True Story

![](https://img2024.cnblogs.com/blog/3617180/202503/3617180-20250318230914275-242579668.jpg)An Elder Brother Is Like a Father :My True Story In your life, do you have a very important person? Who is he/she? Why is he/she significant for you and whats you…

element-plus学习 -2025/3/18

{ ...this.form } 是 JavaScript 中的 ​扩展运算符(Spread Operator)​,它的作用是将 this.form 对象的所有属性“展开”到一个新的对象中 例如 form :{ name : , score: } 简易学生分数管理系统 element-plus实现 <!DOCTYPE html> <html lang="en">…

web161笔记(getimagesize()图片文件头检测)

这次上传失败了,尝试在头部加了图片文件头,就过去了,所以这里应该是用了getimagesize()进行检测getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求所以在上题的基础上都加个GIF89a图片头就可以了 GIF89a加个图⽚的头欺骗检测 .u…

MIT6.5840 2024 Spring Lab1

MIT6.5840 2024 Spring Lab1 前言本文主要作为笔记使用,这次实验基本是边查GO的语法边做的,所以代码写的不够优雅,无法充分发挥GO的一些特性,因此本文的代码实现有很大的优化空间,欢迎各位大佬指正,希望本文能给一些正在学习的小伙伴提供一些思路。最后希望小伙伴们不要抄代码,…