如何将一个docker容器绑定到另一个docker容器到127.0.0.1?

如何将一个docker容器绑定到另一个docker容器到127.0.0.1?

我需要将一个带有 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

请注意,容器也将共享其其他网络接口,例如外部网络连接。

相关内容