我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?
我在Linux机器上本机运行docker。
更新:
除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?
我在Linux机器上本机运行docker。
更新:
除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
当前回答
您可以通过两种方式访问运行在主机上的本地web服务器。
使用公网IP的方法1 使用主机公网IP地址访问Jenkins docker容器中的webserver。 与主机网络的方法2 使用"——net host"将Jenkins docker容器添加到主机的网络堆栈上。部署在主机堆栈上的容器具有对主机接口的全部访问权。您可以使用主机的私有IP地址访问docker容器中的本地web服务器。
NETWORK ID NAME DRIVER SCOPE
b3554ea51ca3 bridge bridge local
2f0d6d6fdd88 host host local
b9c2a4bc23b2 none null local
启动带有主机网络的容器 例如:docker运行——net host -it ubuntu并运行ifconfig来列出所有可从docker容器访问的可用网络IP地址。
我在我的本地主机上启动了一个nginx服务器,我能够从Ubuntu docker容器访问nginx网站的url。
Docker运行——net主机- ubuntu
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a604f7af5e36 ubuntu "/bin/bash" 22 seconds ago Up 20 seconds ubuntu_server
使用私有网络IP地址从Ubuntu docker容器访问Nginx web服务器(运行在本地主机上)。
root@linuxkit-025000000001:/# curl 192.168.x.x -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 05:12:12 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes
其他回答
我探索了各种解决方案,我发现这是最简单的解决方案:
定义网桥网关的静态IP地址。 在extra_hosts指令中添加网关IP作为额外的条目。
唯一的缺点是,如果你有多个网络或项目这样做,你必须确保它们的IP地址范围不冲突。
下面是一个Docker Compose的例子:
version: '2.3'
services:
redis:
image: "redis"
extra_hosts:
- "dockerhost:172.20.0.1"
networks:
default:
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1
然后,您可以使用主机名“dockerhost”从容器内部访问主机上的端口。
为此我创建了一个docker容器https://github.com/qoomon/docker-host
然后,您可以简单地使用容器名称dns访问主机系统。 curl http://dockerhost: 9200
这是一个老问题,有很多答案,但没有一个足够适合我的背景。在我的例子中,容器非常精简,不包含从容器中提取主机ip地址所需的任何网络工具。
此外,使用——net="host"方法是一种非常粗略的方法,当人们希望使用多个容器进行良好隔离的网络配置时,这种方法并不适用。
因此,我的方法是在主机侧提取主机的地址,然后用——add-host参数将其传递给容器:
$ docker run --add-host=docker-host:`ip addr show docker0 | grep -Po 'inet \K[\d.]+'` image_name
或者,将主机的IP地址保存在一个环境变量中,以后再使用:
$ DOCKERIP=`ip addr show docker0 | grep -Po 'inet \K[\d.]+'`
$ docker run --add-host=docker-host:$DOCKERIP image_name
然后docker-host被添加到容器的hosts文件中,你可以在你的数据库连接字符串或API url中使用它。
您可以通过两种方式访问运行在主机上的本地web服务器。
使用公网IP的方法1 使用主机公网IP地址访问Jenkins docker容器中的webserver。 与主机网络的方法2 使用"——net host"将Jenkins docker容器添加到主机的网络堆栈上。部署在主机堆栈上的容器具有对主机接口的全部访问权。您可以使用主机的私有IP地址访问docker容器中的本地web服务器。
NETWORK ID NAME DRIVER SCOPE
b3554ea51ca3 bridge bridge local
2f0d6d6fdd88 host host local
b9c2a4bc23b2 none null local
启动带有主机网络的容器 例如:docker运行——net host -it ubuntu并运行ifconfig来列出所有可从docker容器访问的可用网络IP地址。
我在我的本地主机上启动了一个nginx服务器,我能够从Ubuntu docker容器访问nginx网站的url。
Docker运行——net主机- ubuntu
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a604f7af5e36 ubuntu "/bin/bash" 22 seconds ago Up 20 seconds ubuntu_server
使用私有网络IP地址从Ubuntu docker容器访问Nginx web服务器(运行在本地主机上)。
root@linuxkit-025000000001:/# curl 192.168.x.x -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 05:12:12 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes
我们发现,对于所有这些网络垃圾,一个更简单的解决方案是仅为服务使用域套接字。如果您无论如何都试图连接到主机,只需将套接字作为卷挂载,就可以了。对于postgresql,这很简单:
docker run -v /var/run/postgresql:/var/run/postgresql
然后,我们只需设置数据库连接以使用套接字而不是网络。就是这么简单。