我需要将一个带有 storage-legacy 的容器绑定到另一个 app2-legacy,但我需要 app2-legacy 内的应用程序可以通过 localhost 连接到 storage-legacy。
我知道'docker run -P -ti --rm --name app2-legacy --link storage-legacy:storage-legacy my\storage-legacy app.sh
但我需要通过 127.0.0.1 进行连接。我该怎么做?
答案1
从我的头脑来看,iptables 可能是你的问题的答案之一。
如何做(假设是 ubuntu)?
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport #{app2-legacy-port} -j DNAT --to-destination ${storage-legacy-ip}:#{storage-legacy-port}
iptables -t nat -A POSTROUTING -j MASQUERADE
答案2
我遇到一个问题,我无法在容器的 lo 接口上将任何端口转发到链接到此容器的另一个容器。几个小时后,下面的功能诞生了 =)
简单示例:
forward_port webserver 80 mysql 80
bash 功能:
SUDO=""
if [ "$(id -u)" != "0" ]; then
SUDO=`which sudo 2> /dev/null`
fi
########################################
# Forward port xxx from a container CT_SRC to a container CT_DST dest port yyyy
########################################
# EXAMPLE:
# forward_port b7cbbdc83aed 80 6a513762267f 80
#######################################
function forward_port()
{
#set +x
# CT_ID of container where you need
local CT_SRC=${1:-}
# local CT_SRC_INTERFACE=${2:-}
local CT_SRC_PORT=${2:-}
local CT_DST=${3:-}
local CT_DST_PORT=${4:-}
local CT_SRC_IP=$(${SUDO} docker inspect --format='{{ .NetworkSettings.IPAddress}}' "$CT_SRC")
# if [[ "$CT_SRC_INTERFACE" =~ ^lo.* ]];then
# CT_SRC_IP="127.0.0.1"
# fi
local CT_DST_IP=$(${SUDO} docker inspect --format='{{ .NetworkSettings.IPAddress}}' "$CT_DST")
local DOCKERPID=$(${SUDO} docker inspect --format='{{ .State.Pid }}' "$CT_SRC")
local NSPID=$DOCKERPID
[ ! -d /var/run/netns ] && mkdir -p /var/run/netns
rm -f "/var/run/netns/$NSPID"
ln -s "/proc/$NSPID/ns/net" "/var/run/netns/$NSPID"
local LOCAL_IP=${CT_SRC_IP}
local LPORT=${CT_SRC_PORT}
local REMOTE_HOST=${CT_DST_IP}
local RPORT=${CT_DST_PORT}
local ip_ns="ip netns exec $NSPID"
${SUDO} $ip_ns sysctl -w net.ipv4.conf.all.route_localnet=1 > /dev/null
${SUDO} $ip_ns iptables -t nat -A OUTPUT -m tcp -p tcp --dport $LPORT -j DNAT --to $REMOTE_HOST:$RPORT > /dev/null
${SUDO} $ip_ns iptables -t nat -A POSTROUTING -m tcp -p tcp --dport $LPORT --dst $REMOTE_HOST -j SNAT --to-source $LOCAL_IP > /dev/null
}
#################################################################
#
# Flush forwarding rules & create namespace for CT_ID
#
#################################################################
function flush_forward_rules()
{
local CT_ID=${1:-}
local DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' "$CT_ID")
local NSPID=$DOCKERPID
[ ! -d /var/run/netns ] && mkdir -p /var/run/netns
rm -f "/var/run/netns/$NSPID"
ln -s "/proc/$NSPID/ns/net" "/var/run/netns/$NSPID"
local ip_ns="ip netns exec $NSPID"
$ip_ns iptables -F
$ip_ns iptables -t nat -F
$ip_ns iptables -X
$ip_ns iptables -F
$ip_ns iptables -X
$ip_ns iptables -t nat -F
$ip_ns iptables -t nat -X
$ip_ns iptables -t mangle -F
$ip_ns iptables -t mangle -X
$ip_ns iptables -P INPUT ACCEPT
$ip_ns iptables -P FORWARD ACCEPT
$ip_ns iptables -P OUTPUT ACCEPT
}
答案3
你可以把两个容器位于同一网络命名空间中,这意味着它们将共享lo
接口,并且每个容器的进程都可以通过 localhost 访问来自另一个容器的端口。
这样做--net=container:<name|id>
docker run container1
docker run --net=container:container1 container2
请注意,容器也将共享其其他网络接口,例如外部网络连接。