今天要來嘗試透過網路來當作橋梁,讓ubuntu能夠訪問sftp server。
也有透過將network設成host再將port export出來,然後在host做之間的連接,不過看起來麻煩多了,而且也不需要將sftp公開到host,因此還是用overlay就好。
首先是要先建置ubuntu,並且在其中安裝好openssh-client。
在我們昨天建立好的專案建立interfact資料夾,用來擺放ubuntu的Dockerfile
ubuntu的Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y openssh-client
建置interfact
docker build -t interfact:1.0 ./interfact/
接下來修改一下compose-file將interfact以及sftp放在compose file底下,使用Swarm啟動服務時就會自動建立之間的網路。
version: "3.8"
services:
first-sftp:
image: first-sftp:1.0
build:
context: ./sftp/
dockerfile: Dockerfile
volumes:
- ./secret/ssh_host_server_ed25519_key:/etc/ssh/ssh_host_ed25519_key
- d:/share:/home/user/share
command: user:1111:1001
# 因為使用密鑰做連結時,他說密鑰too open,還沒辦法解決就先用密碼來連接
interfact:
image: interfact:1.0
build:
context: ./interfact/
dockerfile: Dockerfile
tty: true
接下來使用stack deploy服務
$ docker stack deploy -c docker-compose.yaml sftp-app
Ignoring unsupported options: build
Creating network sftp-app_default
Creating service sftp-app_interfact
Creating service sftp-app_first-sftp
接下來我們要尋找sftp的位址才能訪問它。我們在啟動服務時就有自動建立網路sftp-app_default
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
x8vyt8z9atok sftp-app_default overlay swarm
$ docker inspect x8vyt8z9atok
[
{
"Name": "sftp-app_default",
...
"Containers": {
"6f36d50f02ac35c5a00f0c6c3fdb563838e314be6af5768732c1d8584fdfa38e": {
"Name": "sftp-app_interfact.1.xhqv0t6wmh0ec8bx1dvj8rxva",
"EndpointID": "e58344715ce3e8e03117fc390135f872f794e04061c2c4f6b5c309935ea583d6",
"MacAddress": "02:42:0a:00:06:03",
"IPv4Address": "10.0.6.3/24",
"IPv6Address": ""
},
"b60c57592989e5135489a0a5d4294ead1522a68b8ab40d7058203f965f233b4d": {
"Name": "sftp-app_first-sftp.1.kjvc21vjr1ttt9lup53dx7du9",
"EndpointID": "0c77844764b723813ab9dd043816f7da651c9eaf445225b5b9fa2bec8c10b41b",
"MacAddress": "02:42:0a:00:06:06",
"IPv4Address": "10.0.6.6/24",
"IPv6Address": ""
},
"lb-sftp-app_default": {
"Name": "sftp-app_default-endpoint",
"EndpointID": "f89f87b635ba197de1a7f2fed64fb9eb3ea99cb6a61596e6c1cc3a3915d241dc",
"MacAddress": "02:42:0a:00:06:04",
"IPv4Address": "10.0.6.4/24",
"IPv6Address": ""
}
},
...
}
]
查看我們inspect網路之後的輸出,可以在Containers中找到Name為sftp-app_first-sftp的container,其中的IPv4Address就是sftp在sftp-app_default
這個網路中的位址。
可以看到IPv4Address為10.X.X.X代表其為私有網路
有了sftp的位址之後我們就可以使用exec連接到interfact來做sftp訪問
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
b60c57592989 first-sftp:1.0 "/entrypoint user:11…" 17 seconds ago Up 13 seconds 22/tcp
sftp-app_first-sftp.1.kjvc21vjr1ttt9lup53dx7du9
6f36d50f02ac interfact:1.0 "/bin/bash" 21 seconds ago Up 18 seconds
sftp-app_interfact.1.xhqv0t6wmh0ec8bx1dvj8rxva
$ docker exec -it 6f36d50f02ac bash
root@6f36d50f02ac:/# sftp user@10.0.6.6:22
user@10.0.6.6's password:
Connected to 10.0.6.6.
sftp>
看到sftp>
就代表連接成功了
接下來我就要試著在ubuntu容器內創建金鑰加密,並將public key加入first-sftp的container,這些就會在明天的文章內了,那如果這是不可行的就會再想其他方法...