2 種通過 SSH 連接到正在運行的 Docker 容器的方法

在本教程中,我們將看看如何獲得 bash 在後台運行的 Docker 容器上的 shell。 它還將介紹如何在沒有活動控制台會話的情況下通過 ssh 進入一個已啟動並在後台運行的 docker 容器。

Docker 的應用非常廣泛,尤其是在微服務和開發領域。 大多數長時間運行的 Docker 容器沒有活動的 shell 控制台。 您可能會連接到 bash 按需 shell,即當您想在終端上運行某些命令時。 另一種方法是使用 IP 地址通過 ssh 連接到容器。

得到 bash 後台運行的容器可以通過兩種方式實現

1) 使用 docker exec 命令

Docker 引擎有一個命令行工具 docker,用於與容器進行交互。 命令選項 執行 用於在正在運行的容器中運行命令。 通過傳遞一些參數,我們應該可以得到 bash 會議。 使用的命令語法是:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

以下是可用於此的選項列表。

-d, –分離 分離模式:在後台運行命令
-i, –interactive 即使未連接,也要保持 STDIN 打開
-t, –tty 分配一個偽 TTY
-u, –user 字符串 用戶名或 UID(格式:[:<group|gid>])
-w, –workdir string 容器內的工作目錄

我們的興趣在於選項 -t -一世 自從 bash 必須以交互模式運行。 讓我們考慮一個 example 明確這一點。

拉取 Nginx Docker 鏡像:

# docker pull nginx 
Using default tag: latestlatest: Pulling from library/nginx
f2aa67a397c4: Pull complete 3c091c23e29d: Pull complete 4a99993b8636: Pull complete 
Digest: sha256:0edf702c890e9518b95b2da01286509cd437eb994b8d22460e40d72f6b79be49Status: 
Downloaded newer image for nginx:latest

根據下載的 docker 鏡像在後台啟動一個測試容器。

# docker run --name nginx-bg -d nginx 
3bd76e19ad6ce2ff15657ebf4de4cc42eb503c55f608071a438de6ca709ba73b

這將啟動一個名為的容器 nginx-bg 在背景中來自 nginx 碼頭工人形象. 檢查以確認容器正在運行:

# docker ps

現在運行以下命令來獲取 bash 此容器上的控制台。

# docker exec -it nginx-bg /bin/bash
root@3bd76e19ad6c:/# apt-get update
Get:2 https://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 https://cdn-fastly.deb.debian.org/debian stretch InRelease 
Get:3 https://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Hit:4 https://cdn-fastly.deb.debian.org/debian stretch Release
Fetched 185 kB in 2s (83.4 kB/s) 
Reading package lists... Done

其中 nginx-bg 是容器名稱和 /斌/bash 是通往 bash 容器上的二進製文件。 一旦完成執行命令 bash shell,你可以通過輸入exit命令退出。

root@3bd76e19ad6c:/# exit

2)使用docker attach命令

docker exec 的另一種方法是 docker attach。 語法是

# docker attach <container-name>

所以在我們的例子中,我們將運行:

# docker attach nginx-bg

這應該讓你進入 bash 外殼默認。

ssh 進入正在運行的容器

如果要通過 ssh 連接到正在運行的 Docker 容器,則需要在 /etc/hosts 或網絡中的有效 DNS 記錄上配置容器 IP 地址或主機名。

如果您不知道容器的 IP 地址,可以使用以下命令獲取:

export INSTANCE_NAME="nginx-bg"
docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $INSTANCE_NAME

例子:

# export INSTANCE_NAME="nginx-bg"
# docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $INSTANCE_NAME
172.17.0.7

請注意,您可以將容器名稱替換為其 ID。 我們得到的 IP 地址是 172.17.0.7,嘗試 ping 它看看是否有響應。

# ping -c 2 172.17.0.7

PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.058 ms
--- 172.17.0.7 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.058/0.082/0.107/0.026 ms

在對容器運行 ssh 命令之前,您需要在容器上配置 ssh。 配置後,您可以使用用戶名和容器的 IP 地址 ssh 到它。

# ssh [email protected] 
[email protected]'s password: 
Linux 672175da3a51 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@672175da3a51:~#

容器之間的無密碼SSH

如果您需要無密碼身份驗證,請考慮在運行時將 SSH 公鑰複製到容器中。 我不建議創建帶有公鑰的映像,而是將所有公鑰都授權的主機系統上的文件。

讓我們創建一個文件:

# mkdir ~/container-ssh-keys
# vim  ~/container-ssh-keys/authorized_keys
# chmod 0600 ~/container-ssh-keys/authorized_keys

然後將您的公共 SSH 密鑰添加到文件中,您可以添加任意數量的。 現在啟動容器時,將此文件映射到 /root/.ssh/authorized_keys 在容器上,例如

# docker run --name mycon -it -v $HOME/container-ssh-keys/authorized_keys:/root/.ssh/authorized_keys 
ubuntu:16.04 /bin/bash

然後,您應該能夠使用複制的公鑰的私鑰對從您的主機系統 ssh,而不會提示您輸入密碼。

# ssh root@container-ip

另請閱讀:

  • 如何設置 DockerUI – Docker 的 Web 界面
  • 為桌面用戶打造的 20 個很棒的 Docker 容器

這標誌著指南的結束。 我希望這在使用 Docker 容器時有所幫助並且是一個很好的參考。