首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将主机端口转发到坞站容器

将主机端口转发到坞站容器
EN

Stack Overflow用户
提问于 2013-07-21 17:32:41
回答 7查看 184.2K关注 0票数 205

主机是否可以打开Docker容器访问端口?具体地说,我在主机上运行了MongoDB和RabbitMQ,我想在Docker容器中运行一个进程来监听队列并(可选)写入数据库。

我知道我可以将容器中的端口转发到主机(通过-p选项),并从Docker容器中连接到外部世界(即互联网),但我不希望将主机的RabbitMQ和MongoDB端口暴露给外部世界。

编辑:一些说明:

代码语言:javascript
复制
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT     STATE SERVICE
6311/tcp open  unknown

joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway

Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT     STATE    SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds

我必须使用这个技巧来获得与容器的任何互联网连接:My firewall is blocking network connections from the docker container to outside

编辑:最终,我使用pipework创建了一个自定义网桥,并让服务监听网桥的IP地址。我采用了这种方法,而不是让MongoDB和RabbitMQ监听docker网桥,因为它提供了更多的灵活性。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-06 05:14:28

您的docker主机向所有容器公开一个适配器。假设你使用的是最近的ubuntu,你可以运行

代码语言:javascript
复制
ip addr

这将为您提供一个网络适配器列表,其中一个如下所示

代码语言:javascript
复制
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
inet6 fe80::a402:65ff:fe86:bba6/64 scope link
   valid_lft forever preferred_lft forever

您将需要告诉rabbit/mongo绑定到该IP (172.17.42.1)。在此之后,您应该能够从容器中打开到172.17.42.1的连接。

票数 70
EN

Stack Overflow用户

发布于 2014-09-29 07:11:45

一种简单但相对不安全的方法是对docker run使用--net=host选项。

该选项使得容器可以使用主机的网络堆栈。然后,只需使用"localhost“作为主机名,就可以连接到主机上运行的服务。

这更容易配置,因为您不必将服务配置为接受来自docker容器的IP地址的连接,也不必告诉docker容器要连接的特定IP地址或主机名,只需告知端口即可。

例如,您可以通过运行以下命令对其进行测试,该命令假设您的映像名为my_image,您的映像包含telnet实用程序,并且您要连接的服务位于端口25上:

代码语言:javascript
复制
docker run --rm -i -t --net=host my_image telnet localhost 25

如果您考虑这样做,请参阅本页关于安全性的注意事项:

https://docs.docker.com/articles/networking/

上面写着:

--net=host --告诉Docker跳过将容器放在单独的网络堆栈中。本质上,这个选择告诉Docker不要将容器的网络容器化!虽然容器进程仍将受限于它们自己的文件系统、进程列表和资源限制,但一个快速的ip addr命令将向您显示,在网络方面,它们位于主Docker主机中的“外部”,并具有对其网络接口的完全访问权限。请注意,这不会让容器重新配置主机网络堆栈--这将需要--privileged=true --但它允许容器进程像其他根进程一样打开编号较低的端口。它还允许容器访问本地网络服务,如D-bus。这可能会导致容器中的进程能够执行意想不到的操作,如重新启动计算机。您应该谨慎使用此选项。

票数 147
EN

Stack Overflow用户

发布于 2016-07-07 15:53:32

还可以创建一个ssh隧道。

docker-compose.yml

代码语言:javascript
复制
---

version: '2'

services:
  kibana:
    image: "kibana:4.5.1"
    links:
      - elasticsearch
    volumes:
      - ./config/kibana:/opt/kibana/config:ro

  elasticsearch:
    build:
      context: .
      dockerfile: ./docker/Dockerfile.tunnel
    entrypoint: ssh
    command: "-N elasticsearch -L 0.0.0.0:9200:localhost:9200"

docker/Dockerfile.tunnel

代码语言:javascript
复制
FROM buildpack-deps:jessie

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive \
    apt-get -y install ssh && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY ./config/ssh/id_rsa /root/.ssh/id_rsa
COPY ./config/ssh/config /root/.ssh/config
COPY ./config/ssh/known_hosts /root/.ssh/known_hosts
RUN chmod 600 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/config && \
    chown $USER:$USER -R /root/.ssh

config/ssh/config

代码语言:javascript
复制
# Elasticsearch Server
Host elasticsearch
    HostName jump.host.czerasz.com
    User czerasz
    ForwardAgent yes
    IdentityFile ~/.ssh/id_rsa

这样,elasticsearch就有一个隧道连接到正在运行的服务(Elasticsearch、MongoDB、PostgreSQL)所在的服务器,并公开该服务的端口9200。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17770902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档