我是 docker 的新手,我一直在单个服务器中对我的所有应用程序进行 dockerizing。到目前为止,一切都很好并且工作正常。然而,我不明白一件事。我对所有内容都使用 docker-compose(我还没有为我的项目创建 dockerfile)并且 docker ports-compose 中有这个属性。如果我写这样的东西:
ports:
8085:80
Run Code Online (Sandbox Code Playgroud)
它将侦听 0.0.0.0:8085,这意味着外部世界可以访问我的服务器。经过一些讨论和 google-ing,我发现我可以在我的 docker 网桥网络中获取 IP 地址并轻松进行端口映射:
ports:
172.17.0.1:8085:80
Run Code Online (Sandbox Code Playgroud)
这将仅在 172.17.0.1:8085 上侦听,这很好,因为它仅在内部侦听并且我的 nginx 将流量代理到必要的端口。(例如proxy_pass http://172.17.0.1:8085)。在进一步了解 docker 并了解它们的工作原理后,我意识到所有这些容器都有自己的 IP 地址,端口仅暴露给这些地址。例如,我的一个“web”容器的 IPv4 地址为 172.17.0.10,并且暴露了端口 80。如果我docker inspect在这些容器之一上执行操作,我将看到容器的 IP 地址。
现在,我想在我的 nginx 中使用这些 IP 地址。而不是proxy_pass http://172.17.0.1:8085,我想做http://172.17.0.10。我个人认为这是一个非常优雅的界面,但有一点让我担心。如果我重新启动机器会发生什么?所有容器都将以某种顺序启动。如果我有 5 个 Web 容器并且它们以随机顺序启动,我可以确定这些容器的 IP 是相同的吗?或者他们会改变吗?我应该总是ports在 docker-compose 中使用以供 nginx 使用吗?如果是,我如何为每个容器使用不同的 IP 而不是具有相同 IP 的不同端口?如果我创建另一个 docker 网络接口(假设在子网 172.17.1.0 中),并将该接口的不同 IP 分配给公开的“公共”端口,是否可以?我的意思是基本上172.17.1.1:80:80在一个容器中使用,172.17.1.2:80:80 在另一个等
我有两个服务。服务 A 像这样调用服务 B:
HttpGet request = new HttpGet("http://127.0.0.1:8083/getTest");
HttpResponse httpResponse = httpClient.execute(request);
Run Code Online (Sandbox Code Playgroud)
我有错误:
There was an unexpected error (type=Internal Server Error, status=500).
Connect to 127.0.0.1:8083 [/127.0.0.1] failed: Connection refused: connect
Run Code Online (Sandbox Code Playgroud)
这是docker ps 输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a8eaf08881a service_A "./gradlew bootRun" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp service_A
b7436a77e438 service_B "go-wrapper run" About an hour ago Up 4 seconds 0.0.0.0:8083->8083/tcp service_B
Run Code Online (Sandbox Code Playgroud)
我创建了docker网络:
docker network create webproxy
Run Code Online (Sandbox Code Playgroud)
我的 …
我有无法解决的端口转发问题。我在VM中运行Linux,并且正在使用该VM中的docker。例如,当我尝试从docker compose设置端口转发时:
ports:
- "3080:3080"
Run Code Online (Sandbox Code Playgroud)
它仅在容器中运行的应用程序正在侦听0.0.0.0:3080的情况下起作用。问题是,我正在码头化的大多数应用程序都在监听localhost。0.0.0.0以外的任何接口都会导致端口转发不起作用。您是否知道为什么会这样或如何解决?
我在跑:
Docker版本17.05.0-CE,内部版本89658be
docker-compose版本1.17.1,构建未知
谢谢
PS我发现了一个临时的解决方法。我为容器指定了网络模式“主机”,强制容器使用主机OS网络,但是这种方法在MacOS上不起作用。
我想创建一个容器网络,其中一个中央容器应该能够通过 ssh 连接到所有其他容器。通过 ssh 中央容器可以使用 Ansible 更改所有其他容器的配置。我知道不建议从一个容器 ssh 到另一个容器,我们可以使用 volume 进行数据共享,但这不适合我的用例。我能够从主机 ssh 到容器,但我不能从一个容器到另一个容器。
我正在使用的 Docker 文件是:
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y netcat ssh iputils-ping
EXPOSE 22
Run Code Online (Sandbox Code Playgroud)
Dockerfile 创建的镜像名为 ubuntu:v2
然后使用下面的命令我创建了两个容器 u1 和 u2
docker run -p 22 --rm -ti --name u1 ubuntu:v2 bash
docker run -p 22 --rm -ti --name u2 ubuntu:v2 bash
Run Code Online (Sandbox Code Playgroud)
在容器中,我正在运行以下命令以在容器中创建用户。在 u1 容器中创建用户 u1,在 u2 容器中创建用户 u2
root@d0b0e44f7517:/# mkdir /var/run/sshd
root@d0b0e44f7517:/# chmod 0755 /var/run/sshd
root@d0b0e44f7517:/# /usr/sbin/sshd
root@d0b0e44f7517:/#
root@d0b0e44f7517:/# useradd --create-home --shell /bin/bash --groups …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序正在用户定义的 docker network 中创建几个容器。
目前,我已将该网络中的某些容器的几个端口转发(映射)到主机,以便我可以从主机访问它们。容器之间的交互(容器到容器)是通过网络中定义的别名进行的。
不幸的是,主机的映射端口在我的主机上公开公开。有没有办法只能从我的主机的本地主机访问这些映射的端口?
我有一个 Golang 应用程序,它应该连接到 FTP 服务器。
现在,Golang app 和 FTP Server 都已dockerized,但我不知道如何从 Golang app 连接到 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:
Run Code Online (Sandbox Code Playgroud)
当我运行 docker compose 时,所有服务都已启动。
我可以通过以下方式获取 ftp 容器的 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ftpd-server
Run Code Online (Sandbox Code Playgroud)
然后,我在我的 golang 容器 lftp 中为 alpine 安装了一个 ftp 客户端: …