当前位置: 代码网 > 服务器>服务器>Linux > Linux服务器上使用docker的简单教程

Linux服务器上使用docker的简单教程

2025年03月19日 Linux 我要评论
00 需求需要配置一些新的服务器,只能通过 ssh boss@172.16.1.100 来连接,然后在 /data1 磁盘下创建自己的 docker,用 ssh 连接 docker 来使用服务器。(b

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  # 会变成 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 删除,上面的错误提示会给出需要执行的命令。

以上就是linux服务器上使用docker的简单教程的详细内容,更多关于linux使用docker的资料请关注代码网其它相关文章!

(0)

相关文章:

  • Linux书签上下移动方式

    Linux书签上下移动方式

    linux书签上下移动步骤读书签文件,分割到qstringlist,点击右键菜单获取序号,交换序号,写书签文件。qstringlist.swap(int, in... [阅读全文]
  • Linux深入理解进程和文件及内存管理问题

    Linux深入理解进程和文件及内存管理问题

    一、重谈linux下一切皆文件我们说了一切皆文件,对于操作系统来说,磁盘键盘显示屏等等一系列的外设都是文件。举一个访问外设的例子:进程运行,从进程pcb中找到指... [阅读全文]
  • Linux中的日志插件详解

    一、日志文件的重要性故障排查与问题定位快速发现问题:日志能够实时记录系统运行过程中的各种事件和状态信息,当系统出现故障或异常时,通过查看日志可以快速察觉到问题的发生,例如,服务器突…

    2025年03月20日 服务器
  • Linux systemV消息队列和信号量详解

    Linux systemV消息队列和信号量详解

    一、消息队列1、实现原理操作系统在内核建立一个队列,通信的两个进程ab以数据块的形式将需要发送的数据pushback到队列中,数据块是一个结构体,其中有字段标识... [阅读全文]
  • Linux中的进程间通信之匿名管道解读

    一、基本概念我们知道多个进程之间是互相独立的,但是有时候我们需要将一个进程的数据传递到另一个进程,实现数据传输的效果,有的时候多个进程之间要共享同样的资源,有的时候一个进程要对其他…

    2025年03月20日 服务器
  • Linux中的缓冲区和文件系统详解

    一、file结构1、fdfile是在c中封装起来的一个结构体,那我们访问文件的时候都是通过fd访问的,自然在file中是封装了fd的,file结构体中,int _file存放的就是…

    2025年03月20日 服务器

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com