教你如何通過?SSH?連接到?Docker?容器

SSH 是系統(tǒng)管理員工具箱中最常用的命令之一,但它并不常見于 Docker。以下是如何通過 SSH 連接到正在運行的容器,以及為什么在這樣做之前應(yīng)該三思而后行。
你應(yīng)該在 Docker 容器中使用 SSH 嗎?
SSH 進(jìn)入 Docker 容器通常是一種不好的做法,應(yīng)該避免。docker exec使用命令在容器中獲取 shell幾乎總是更好。
Docker 新手可能會嘗試使用 SSH 來更新容器內(nèi)的文件。容器應(yīng)該是一次性的,所以它們在創(chuàng)建后應(yīng)該被視為不可變的,除了存儲在卷中的持久數(shù)據(jù)。編輯源代碼時創(chuàng)建新圖像并重新啟動容器。
除了多步驟配置過程之外,在 Docker 映像中安裝 SSH 會添加幾個依賴包并暴露另一個潛在的攻擊向量。在具有多個活動容器的系統(tǒng)上,您將運行多個獨立的 SSH 進(jìn)程,并且必須記住每個容器的正確端口。
無需將 SSH 添加到單個容器,只需在運行 Docker 的物理主機(jī)上安裝一次即可。使用 SSH 連接到您的主機(jī),然后運行docker exec -it my-container bash以訪問各個容器。
雖然docker exec是首選方法,但仍然存在 SSH 可能有用的場景。您可以將其作為權(quán)宜之計引入,以與遺留部署系統(tǒng)集成。它也可能被一些 IDE 和構(gòu)建工具用于在開發(fā)期間提供實時重新加載功能。
在 Docker 容器中安裝 SSH 服務(wù)器
大多數(shù)流行的 Docker 基礎(chǔ)鏡像都被有意簡化了。您需要自己添加 OpenSSH 服務(wù)器,即使是從流行的操作系統(tǒng)發(fā)行版派生的圖像。
Dockerfile這是基于 Debian 的映像的示例:
RUN apt-get update && apt-get install -y openssh-server RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config ENTRYPOINT service ssh start && bash
SSH 配置已修改,因此您可以root以 Docker 容器中的默認(rèn)用戶身份登錄。為了提高安全性,請改為設(shè)置專用用戶帳戶:
RUN useradd -m -s /bin/bash sshuser
這將創(chuàng)建一個名為主sshuser目錄 ( -m)的新用戶。該-s開關(guān)將用戶的默認(rèn)登錄 shell 設(shè)置為 Bash。
使用ENTRYPOINT確保 SSH 服務(wù)總是在容器啟動時啟動。然后將執(zhí)行交給 Bash 作為容器的前臺進(jìn)程。您可以將其替換為您的應(yīng)用程序的二進(jìn)制文件。
配置身份驗證
接下來,您需要設(shè)置身份驗證系統(tǒng)。您可以為您的sshuser帳戶分配一個密碼并使用該密碼登錄:
RUN echo "sshuser:Changeme" | changepasswd
更安全的方法是設(shè)置 SSH 密鑰身份驗證。您需要在客戶端計算機(jī)上創(chuàng)建一個密鑰對,然后將公共部分復(fù)制到容器中。這樣,SSH 守護(hù)程序可以在您連接時驗證您機(jī)器的身份。
更改您為您的用戶Dockerfile設(shè)置.ssh配置文件夾。使用docker cp命令或COPY. Dockerfile在后一種情況下,密鑰將被烘焙到圖像中,任何有權(quán)訪問的人都可以看到。
COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys RUN chown -R sshuser:sshuser /home/sshuser/.ssh RUN chmod 600 /home/sshuser/.ssh/authorized_keys
這一系列命令使用工作目錄中的公鑰創(chuàng)建 SSHauthorized_keys文件。id_rsa.pub調(diào)整文件系統(tǒng)權(quán)限以匹配 SSH 的要求。
連接到容器
現(xiàn)在您已準(zhǔn)備好連接到您的容器。使用綁定到主機(jī)的端口 22 運行容器:
docker run -p 22:22 my-image:latest
運行ssh sshuser@example.com會給你一個容器內(nèi)的外殼。
如果要從托管 Docker 容器的機(jī)器進(jìn)行連接,則可以跳過綁定端口。用于docker inspect獲取容器的 IP 地址,然后將其傳遞給 SSH 連接命令。
docker inspect <id-or-name> | grep 'IPAddress' | head -n 1
使用您機(jī)器上的 SSH 客戶端連接到容器:
ssh root@172.17.0.1 # OR ssh sshuser@172.17.0.1
如果您在主機(jī)上運行單獨的 SSH 服務(wù)器,或者您有多個需要端口 22 的容器,則需要使用備用端口。以下是當(dāng) SSH 綁定到端口 2220 時啟動連接的方法:
cker run -p 22:2220 my-image:latest ssh root@172.17.0.1 -p 2220
使用 SSH Config 設(shè)置容器快捷方式
您可以操作 SSH 配置文件以簡化與各個容器的連接。編輯~/.ssh/config以定義具有預(yù)配置端口的速記主機(jī):
Host my-container
HostName 172.17.0.1
Port 2220
User sshuser現(xiàn)在你可以ssh my-container直接跑到你的容器中了。這使得在不記住容器 IP 和端口的情況下處理多個連接變得更容易。
改用 Dockssh 簡化容器管理
Dockssh項目通過提供另一個讓您運行的守護(hù)進(jìn)程更進(jìn)一步ssh my-container@example.com,無需任何手動 SSH 配置。您不需要在容器中安裝 SSH 服務(wù)器;Dockssh 自動代理 SSH 連接并運行正確的docker exec命令。
你必須先安裝 Redis 來存儲 Dockssh 的配置數(shù)據(jù):
sudo apt install redis
接下來,通過添加帶有容器名稱和 SSH 連接密碼的 Redis 記錄來定義要公開的容器:
redis-cli set dockssh:my-container:pass "container-password-here"
然后下載 Dockssh:
sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh sudo chmod +x /usr/local/bin/dockssh sudo ufw allow 22022 # Start DockSSH server dockssh
現(xiàn)在您可以連接到您的容器:
ssh my-container@example.com -p 22022
Dockssh 默認(rèn)監(jiān)聽 22022 端口。打開防火墻以允許使用該端口的傳入連接。
連接時,系統(tǒng)會提示您輸入容器的密碼。這是container-password-here在我們上面的 Redis 記錄中設(shè)置的。
使用 Dockssh 可以輕松地通過 SSH 連接到大量 Docker 容器。當(dāng)您定期從遠(yuǎn)程主機(jī)連接到您的容器時,這種方法是理想的,因為它將兩步“SSH then docker exec”序列簡化為一個令人難忘的命令。
將 Dockssh 注冊為系統(tǒng)服務(wù)以供長期使用:
sudo nano /etc/systemd/system/dockssh.service
[Unit] Description=Dockssh service After=network.target [Service] type=simple Restart=always RestartSec=1 User=root ExecStart=/usr/local/bin/dockssh [Install] WantedBy=multi-user.target
使用啟用服務(wù)systemctl:
sudo systemctl enable dockssh.service sudo systemctl start dockssh
Dockssh 現(xiàn)在將在您的系統(tǒng)啟動時自動啟動。
概括
將 SSH 與 Docker 容器相結(jié)合被廣泛認(rèn)為是一種反模式,但它仍然在開發(fā)、測試和遺留環(huán)境中使用。如果沒有其他選擇,您可以將 SSH 服務(wù)器添加到容器中,復(fù)制公鑰,然后通過容器的 IP 或主機(jī)端口綁定進(jìn)行連接。
想要遠(yuǎn)程管理大量 Docker 容器的系統(tǒng)管理員可以試試 Dockssh。ssh它允許您通過無縫的幕后映射來運行熟悉的命令docker exec,使用未修改的圖像為您提供兩全其美的體驗。
到此這篇關(guān)于通過 SSH 連接到 Docker 容器的文章就介紹到這了,更多相關(guān)SSH 連接到 Docker 容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker鏡像發(fā)布到Docker?Hub的實現(xiàn)方法
本文主要介紹了Docker鏡像發(fā)布到Docker?Hub的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
docker imageid 和 digest區(qū)別解析
在Docker中,image ID和digest是兩個不同的標(biāo)識符,用于唯一標(biāo)識和引用Docker鏡像的不同方面,這篇文章主要介紹了docker imageid 和 digest區(qū)別,需要的朋友可以參考下2023-06-06
基于docker 搭建Prometheus+Grafana的過程詳解
這篇文章主要介紹了基于docker 搭建Prometheus+Grafana的過程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
使用Maven打包構(gòu)建Docker鏡像并推送到倉庫
這篇文章主要介紹了使用Maven打包構(gòu)建Docker鏡像并推送到倉庫問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Docker部署Kafka以及Spring Kafka實現(xiàn)
這篇文章主要介紹了Docker部署Kafka以及Spring Kafka實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
docker安裝elastic?search和kibana的實現(xiàn)
本文主要介紹了docker安裝elastic?search和kibana的實現(xiàn),,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

