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

我需要将容器与存储传统绑定到另一个app2-legacy,但是我需要app2-legacy中的应用程序可以通过本地主机连接到存储 – 传统。

我知道`docker run -P -ti –rm –name app2-legacy –link storage-legacy:storage-legacy my \ storage-legacy app.sh

但是我需要连接127.0.0.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 

我遇到了一个问题,我不能转发一个容器的任何端口的lo接口到另一个链接到这个容器。 几小时后,下面的function诞生了=)

简单的例子:

 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 } 

您可以将t wo容器放在同一个networking名称空间中 ,这意味着它们将共享lo接口,并且每个容器的进程都可以通过本地主机访问来自其他容器的端口。

--net=container:<name|id>做到这一点

 docker run container1 docker run --net=container:container1 container2 

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