iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 23

Day23 連接ubuntu與sftp的橋樑

今天要來嘗試透過網路來當作橋梁,讓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,這些就會在明天的文章內了,那如果這是不可行的就會再想其他方法...


上一篇
Day22 sftp APP建置專案架構
下一篇
Day24 將private key安全地放入容器內
系列文
自我學習Docker的30天奇幻旅程24

尚未有邦友留言

立即登入留言