远程连接服务器中的Docker容器

前言

利用虚拟机(Ubuntu20.04)模拟服务器,在其上利用Docker创建一个容器,为了方便数据传输,直接使用XShell等软件(笔者使用Tabby)对所创建的容器进行连接。


服务器连接

服务器数据:

  • ip:192.168.75.138
  • port:22

利用Tabby配置后实现连接

安装Docker

docker学习参考:https://yeasy.gitbook.io/docker_practice/

文章末尾有关于docker操作的命令总结。

  1. 首先在终端输入

    1
    2
    sudo apt update
    sudo apt-get install ca-certificates curl gnupg lsb-release
  2. 安装证书

    1
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  3. 写入软件源信息

    1
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  4. 安装Docker

    1
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  5. 启动Docker

    1
    2
    sudo systemctl enable docker
    sudo systemctl start docker
  6. 安装工具

    1
    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-commonsudo docker run --rm hello-world
  7. 重启Docker

    1
    sudo service docker restart
  8. 测试

    1
    sudo docker run --rm hello-world

    如果出现以下回显,则说明Docker安装成功

  9. 可以查看Docker版本

    1
    sudo docker version
  10. 可以查看刚刚创建的镜像

    1
    sudo docker images

Docker基本操作

镜像操作

Docker Hub 上有大量的高质量的镜像可以使用。

  1. 通过docker pull命令获取镜像,具体格式如下:

    docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

    注:镜像地址格式一般为<域名/IP>[:端口号],如果不加默认为Docker Hub(docker.io)。

    以Ubuntu 23.04为例,从Docker Hub中获取该镜像:

    1
    sudo docker pull ubuntu:23.04

  2. 可以通过docker image ls命令列出已经下载好的镜像

    1
    sudo docker image ls

  3. 通过docker image rm <镜像>命令来删除一个没有任何容器依赖的镜像。

    其中<镜像>可以是 镜像短 ID镜像长 ID镜像名 或者 镜像摘要

    以hello-world镜像为例:

    1
    sudo docker image rm feb

容器操作

  1. 通过docker run [OPTIONS] <镜像> [COMMAND]可以基于指定镜像创建容器

    1
    sudo docker run -it -d -p 10000:22 --name containerName_nbw ubuntu:23.04 /bin/bash

    一些参数说明:

    • -i:表示运行容器 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    • --name 容器名:创建容器的名字。
    • -d:在后台运行容器并打印容器ID。
    • -p 外部端口:容器端口:完成宿主机和容器之间的端口映射。(以上述为例:将容器的22端口映射到宿主机的10000端口)
    • -v 外部目录:容器目录:完成宿主机和容器之间的目录映射。(例:-v ./hosts:/etc/hosts:ro:将当前宿主机的hosts目录映射到容器的/etc/hosts目录,并且已只读的方式映射)
    • --gpus all:允许容器使用GPU,可使用nvidia-smi命令查看GPU运行状态。

    /bin/bash命令:启动一个 bash 终端,允许用户进行交互。

  2. 通过docker container ls -a命令查看已经创建的容器

    1
    sudo docker container ls -a

  3. 通过docker container start <容器>命令来启动指定的容器,下面以刚创建的容器containerName_nbw为例:

    1
    sudo docker container start aca
  4. 通过docker container stop <容器>命令来停止指定的容器,下面以刚创建的容器containerName_nbw为例:

    1
    sudo docker container stop aca
  5. 通过docker attach <容器> 命令或 docker exec [参数] <容器> [COMMAND] 命令进入容器进行操作

    推荐使用docker exec,原因如下:

    • docker attach :从容器中执行exit,会导致容器的停止。
    • docker exec:从容器中执行exit,不会导致容器的停止。

    以容器containerName_nbw为例:

    1
    sudo docker exec -it aca bash

    参数说明:

    • 只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
    • -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
  6. 在容器内通过exit命令退出容器

    1
    exit

  7. 通过 docker container rm <容器> 命令来删除一个处于终止状态的容器。

    1
    sudo docker container rm aca
    • 如果要强制删除一个正在运行的容器,可以添加-f参数。(例:docker container rm -f aca
    • 使用docker container prune可以删除所有处于终止状态的容器。

远程连接Docker容器

  1. 首先进入容器,设置root用户密码:

    1
    passwd

    设置密码是ssh连接所需要的。

  2. 在容器内下载vim以及openssh

    1
    2
    3
    apt-get update
    apt-get install vim
    apt-get install openssh-server
  3. 修改ssh_config配置文件:

    1
    vim /etc/ssh/sshd_config

    PermitRootLogin prohibit-password注释(默认为注释状态)

    添加PermitRootLogin yes

  4. 重启ssh服务

    1
    /etc/init.d/ssh restart

  5. 通过配置Tabby进行远程容器连接

    此时输入exit命令将会直接断开连接。

    如果从另一个终端执行docker container stop 命令,该链接也会断开。

  6. 通过工具可以很方便地进行数据传输


后记

关于Docker的一些操作命令总结:

命令 描述
docker version 查看docker版本
docker pull <镜像> 获取docker镜像
docker image rm <镜像> 删除一个没有任何容器依赖的镜像
docker image ls 查看已经下载好的镜像
docker run [OPTIONS] <镜像> [COMMAND] 基于指定镜像创建容器
docker container ls -a 查看已经创建的容器
docker container start <容器> 启动指定容器
docker container stop <容器> 停止指定容器
docker attach <容器> / docker exec [参数] <容器> [COMMAND] 进入容器进行操作
exit 退出当前容器
docker container rm [OPTIONS] <容器> 删除指定容器