标签: docker-networking

docker 容器 IP 在重启时会发生变化吗?

我是 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 在另一个等

nginx docker docker-compose docker-networking

3
推荐指数
1
解决办法
4739
查看次数

如何正确设置 docker 网络以使用 localhost 连接?

我有两个服务。服务 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)

的 …

iptables localhost docker docker-compose docker-networking

3
推荐指数
1
解决办法
2万
查看次数

当容器在localhost接口上侦听时Docker端口转发不起作用

我有无法解决的端口转发问题。我在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上不起作用。

docker docker-compose docker-networking docker-network

2
推荐指数
1
解决办法
2369
查看次数

从一个容器到另一个容器的 SSH

我想创建一个容器网络,其中一个中央容器应该能够通过 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)

ssh containers docker docker-networking docker-network

2
推荐指数
2
解决办法
7372
查看次数

用户定义的 docker 网络中的 Docker 容器 - 只能从主机访问

我有一个应用程序正在用户定义的 docker network 中创建几个容器。

目前,我已将该网络中的某些容器的几个端口转发(映射)主机,以便我可以从主机访问它们。容器之间的交互(容器到容器)是通过网络中定义的别名进行的。

不幸的是,主机的映射端口在我的主机上公开公开。有没有办法只能从我的主机的本地主机访问这些映射的端口?

docker docker-networking

1
推荐指数
1
解决办法
111
查看次数

通过其他docker容器访问ftp服务

我有一个 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 客户端: …

ftp docker docker-compose docker-networking

0
推荐指数
1
解决办法
9606
查看次数