通过其他 docker 容器访问 ftp 服务
Access ftp service via other docker container
我有一个 Golang 应用程序,它应该连接到 FTP 服务器。
现在,Golang 应用程序和 FTP 服务器都已 docker 化,但我不知道如何从 Golang 应用程序
连接到 FTP 服务器
这是我的 docker-compose.yml
version: '2'
services:
myappgo:
image: myappgo:exp
volumes:
- ./volume:/go
networks:
myappgo_network:
env_file:
- test.env
ftpd-server:
container_name: ftpd-server
image: stilliard/pure-ftpd:hardened
ports:
- "21:21"
- "30000-30009:30000-30000"
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: "test"
FTP_USER_PASS: "test"
FTP_USER_HOME: "/home/test"
restart: on-failure
networks:
myappgo_network:
networks:
myappgo_network:
当我运行docker撰写时,所有服务都启动了。
我可以通过以下方式获取 ftp 容器的 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ftpd-server
然后,我在我的 golang 容器中安装了一个 ftp alpine 客户端,lftp:
docker exec -it my_app_go sh
apk add lftp
lftp -d ftp://test:test@172.19.0.2 # -d for debug
lftp test@172.19.0.2:~> ls
---- Connecting to 172.19.0.2 (172.19.0.2) port 21
`ls' at 0 [Connecting...]
我错过了什么?
首先简化你的dockerfile
version: '3' # i assume you can migrate to version 3, yes?
services:
myappgo:
image: myappgo:exp
volumes:
- ./volume:/go
env_file:
- test.env
ftpd-server:
image: stilliard/pure-ftpd:hardened
environment:
PUBLICHOST: "0.0.0.0"
FTP_USER_NAME: "test"
FTP_USER_PASS: "test"
FTP_USER_HOME: "/home/test"
restart: on-failure
其次,默认网络由docker-compose
创建;不需要明确地做。所有服务都以其名称连接到它,因此您不是通过 ip
访问它们,而是通过 ftpd-server
这样的名称访问它们
第三,如果您从内部访问它们,则不需要公开您的端口。如果你需要从外部访问它们,那么你就公开了。
接下来,启动 ftp 并绑定到 0.0.0.0
- 将任何 tcp 服务绑定到 localhost
或 127.0.0.1
使其只能在本地访问。
最后,使用服务名称进行连接。忘记 ip
地址和 docker inspect
。从 myappgo
到 ftp 的连接看起来像 ftp://ftpd-server/foo/bar
至少,您需要 21/TCP 用于命令,20/TCP 用于 ftp-服务器上的数据:
ports:
- "21:21"
- "20:20"
- "30000-30009:30000-30009"
我稍微更改了您的撰写文件:
version: '2'
services:
myappgo:
image: alpine:3.8
tty: true
networks:
swarm_default:
ftpd-server:
container_name: ftpd-server
image: stilliard/pure-ftpd:hardened
ports:
- "21:21"
- "20:20"
- "30000-30009:30000-30009"
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: "test"
FTP_USER_PASS: "test"
FTP_USER_HOME: "/home/test"
restart: on-failure
networks:
swarm_default:
networks:
swarm_default:
然后我在 ftp-server 文件 /home/test/1
上创建,我可以从 mygoapp-container 中看到它:
/ # lftp ftp://test:test@172.19.0.2
lftp test@172.19.0.2:/> dir
-rw-r--r-- 1 0 0 0 Jan 22 14:18 1
我有一个 Golang 应用程序,它应该连接到 FTP 服务器。
现在,Golang 应用程序和 FTP 服务器都已 docker 化,但我不知道如何从 Golang 应用程序
连接到 FTP 服务器这是我的 docker-compose.yml
version: '2'
services:
myappgo:
image: myappgo:exp
volumes:
- ./volume:/go
networks:
myappgo_network:
env_file:
- test.env
ftpd-server:
container_name: ftpd-server
image: stilliard/pure-ftpd:hardened
ports:
- "21:21"
- "30000-30009:30000-30000"
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: "test"
FTP_USER_PASS: "test"
FTP_USER_HOME: "/home/test"
restart: on-failure
networks:
myappgo_network:
networks:
myappgo_network:
当我运行docker撰写时,所有服务都启动了。
我可以通过以下方式获取 ftp 容器的 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ftpd-server
然后,我在我的 golang 容器中安装了一个 ftp alpine 客户端,lftp:
docker exec -it my_app_go sh
apk add lftp
lftp -d ftp://test:test@172.19.0.2 # -d for debug
lftp test@172.19.0.2:~> ls
---- Connecting to 172.19.0.2 (172.19.0.2) port 21
`ls' at 0 [Connecting...]
我错过了什么?
首先简化你的dockerfile
version: '3' # i assume you can migrate to version 3, yes?
services:
myappgo:
image: myappgo:exp
volumes:
- ./volume:/go
env_file:
- test.env
ftpd-server:
image: stilliard/pure-ftpd:hardened
environment:
PUBLICHOST: "0.0.0.0"
FTP_USER_NAME: "test"
FTP_USER_PASS: "test"
FTP_USER_HOME: "/home/test"
restart: on-failure
其次,默认网络由docker-compose
创建;不需要明确地做。所有服务都以其名称连接到它,因此您不是通过 ip
访问它们,而是通过 ftpd-server
第三,如果您从内部访问它们,则不需要公开您的端口。如果你需要从外部访问它们,那么你就公开了。
接下来,启动 ftp 并绑定到 0.0.0.0
- 将任何 tcp 服务绑定到 localhost
或 127.0.0.1
使其只能在本地访问。
最后,使用服务名称进行连接。忘记 ip
地址和 docker inspect
。从 myappgo
到 ftp 的连接看起来像 ftp://ftpd-server/foo/bar
至少,您需要 21/TCP 用于命令,20/TCP 用于 ftp-服务器上的数据:
ports:
- "21:21"
- "20:20"
- "30000-30009:30000-30009"
我稍微更改了您的撰写文件:
version: '2'
services:
myappgo:
image: alpine:3.8
tty: true
networks:
swarm_default:
ftpd-server:
container_name: ftpd-server
image: stilliard/pure-ftpd:hardened
ports:
- "21:21"
- "20:20"
- "30000-30009:30000-30009"
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: "test"
FTP_USER_PASS: "test"
FTP_USER_HOME: "/home/test"
restart: on-failure
networks:
swarm_default:
networks:
swarm_default:
然后我在 ftp-server 文件 /home/test/1
上创建,我可以从 mygoapp-container 中看到它:
/ # lftp ftp://test:test@172.19.0.2
lftp test@172.19.0.2:/> dir
-rw-r--r-- 1 0 0 0 Jan 22 14:18 1