用幾條簡單的指令快速在Ubuntu Linux架設一個SAMBA伺服器,並透過Docker容器隔離,讓Windows電腦可以存取SMB共享資料夾。
SAMBA是SMB協定(網路上的芳鄰)的開源實作,目的在於讓Linux可以與Windows電腦分享檔案以及印表機等資源。只要在Linux跑SAMBA服務,Windows電腦便可以透過區域網路連線,用檔案總管打開Linux的共享資料夾,在兩台電腦間傳輸檔案。
1. 為什麼我要用Docker跑SAMBA#
在Linux直接安裝SAMBA安裝太麻煩啦。我只是要分享電腦上的一些檔案而已。我希望這個過程應該是dead simple的。
看看SAMBA - Arch Wiki列出的步驟,不知道在Ubuntu設定SMB共用資料夾為什麼要搞那麼麻煩,SAMBA要寫設定檔和規定權限,還要建立一個專門用戶,好複雜,堪比NFS,難道是因為這個技術實在太古老了嗎,或者是為了Windows的複雜權限管理所設計。
雖然現在SAMBA能用Systemd自動管理但還是覺得不方便。因此我都用SSHFS(SFTP)居多,因為直接跟SSH共用通訊埠就好了 。
但是SMB是更廣泛實現的協定,從Windows 95以降的系統都有內建,無需額外安裝軟體就能用,若要跟Windows電腦交換檔案還是有個SMB比較好。
使用Docker容器跑SAMBA的話,可以將SMABA服務與Linux宿主系統隔離,並且只暴露需要的目錄到網路上。即使權限設定不很嚴格,從外部存取SMB的人也看不到Docker容器內部和掛載進去以外的資料夾,這樣可以增加系統安全性。
關於SAMBA安全性:目前已知SMB v1.0有嚴重安全性漏洞,可能被勒索病毒利用。故現在SAMBA使用的協定版本多半已經升級到3.0了。
2. 安裝Docker#
參見:Linux系統各發行版安裝Docker Engine教學
3. 撰寫docker-compose#
不用自己打包Docke映像檔,Github上面有很多現成的範本。請找至少一年內還有在更新的。例如這個:Docker container of Samba 它已經幫你做好範本了,只要在docker-compose.yml填入連線時候的帳號密碼,還有要分享的資料夾路徑就行。
- 新增存放資料的路徑
mkdir ~/samba-docker
cd ~/samba-docker- 從Github取得
smb.conf範本,按需修改
wget -O smb.conf https://raw.githubusercontent.com/dockur/samba/refs/heads/master/smb.conf- 例如,我為了提昇安全性,在
smb.conf加入以下設定,限定客戶端連線進來的最低SMB協定版本為SMBv2
[global]
min protocol = SMB2- 取得
docker-compose.yml範本,按需修改
wget -O docker-compose.yml https://github.com/dockur/samba/blob/master/compose.yml- 例如這是我的範例,分享Linux家目錄下的
~/下載目錄
services:
samba:
image: dockurr/samba
container_name: samba
environment:
NAME: "Linux" # 分享的名稱
USER: "samba" # 使用者帳號
PASS: "12345678" # 密碼
UID: "1000" # 符合目前Linux使用者的權限
GID: "1000"
ports:~/samba-docker
- 445:445 # 冒號左邊是對外開放的通訊埠
volumes:
- /honme/user/下載/:/storage # 冒號左邊是要分享的目錄路徑
- ./smb.conf:/etc/samba/smb.conf # 允許自訂smb.conf內容
restart: always # 開機自動啟動- 然後啟動就可以了。
docker compose up -d- SMB預設通訊埠是445,如果防火牆有擋記得開放
sudo ufw allow 445
sudo ufw reload使用
ip addr取得Linux電腦的IPV4位址,通常應該是192.168.開頭的。在同一區域網路的另外一台Windows電腦,開啟檔案總管,開啟網路,在檔案路徑輸入
\\Linux電腦IP,輸入帳號密碼,就可以連線到Linux的SAMBA。若不用Docker容器的時候就把這個服務關掉。
cd ~/samba-docker
docker compose down

