如何确认docker 和 宿主机上 veth 设备的关系?

简介: docker 和 宿主机上 veth 设备的关系没有命令可以直接查到。不过可以进入容器可以看到。如果有个脚本能看到就好太多,docker 后续应该在docker ps加入一个类似的功能。

docker 和 宿主机上 veth 设备的关系没有命令可以直接查到。不过可以进入容器可以看到。如果有个脚本能看到就好太多,docker 后续应该在docker ps加入一个类似的功能。

传统方式:

1、docker exec 进入容器内部

2、宿主机上执行: ip a

自动化方式:

#!/bin/sh
NL=$'\n'
####################
# DEFINE FUNCTIONS #
####################
usage () {
    printf %s \
"dockerveth.sh - Show which docker containers are attached to which
\`veth\` interfaces.
Usage: dockerveth.sh [DOCKER PS OPTIONS] | [-h, --help]
Options:
    DOCKER PS OPTIONS   Pass any valid \`docker ps\` flags. Do not pass
                        a '--format' flag.
    -h, --help          Show this help and exit.
Output:
    If stdout is not a tty, column headers are omitted.
"
}
get_container_data () {
    # Get data about the running containers. Accepts arbitrary arguments, so you can pass
    # a filter to `docker ps` if desired.
    # Input: `docker ps` arguments (optional)
    # Output: A multi-line string where each line contains the container id, followed by
    # a space, and then any friendly names.
    docker ps --format '{{.ID}} {{.Names}}' "$@"
}
get_veth () {
    # Get the host veth interface attached to a container.
    # Input: docker container ID; also needs $dockerveth__addrs
    # Output: the veth name, like "veth6638cfa"
    c_if_index=$(get_container_if_index "$1")
    a="${dockerveth__addrs%%@if${c_if_index}:*}"
    b="${a##*${NL}}"
    printf "${b#* }"
}
get_container_if_index () {
    # Get the index number of a docker container's first veth interface (typically eth0)
    # Input: the container ID
    # Output: The index number, like "42"
    c_pid=$(get_pid "$1")
    ip_netns_export "$c_pid"
    ils=$(ip netns exec "ns-${c_pid}" ip link show type veth)
    printf "${ils%%:*}"
}
ip_netns_export () {
    # Make a docker container's networking info available to `ip netns`
    # Input: the container's PID
    # Output: None (besides return code), but performs the set-up so that `ip netns` commands
    # can access this container's namespace.
    if [ ! -d /var/run/netns ]; then
        mkdir -p /var/run/netns
    fi
    ln  -sf "/proc/${1}/ns/net" "/var/run/netns/ns-${1}"
}
get_pid () {
    # Get the PID of a docker container
    # Input: the container ID
    # Output: The PID, like "2499"
    docker inspect --format '{{.State.Pid}}' "$1"
}
make_row () {
    # Produce a table row for output
    # Input:
    #     1 - The container ID
    #     2 - The container's friendly name
    # Output: A row of data, like "1e8656e195ba veth1ce04be thirsty_meitner"
    id="${1}"
    name="${2}"
    veth=$(get_veth "$id")
    printf "${id}\t${veth}\t${name}"
}
make_table () {
    # Produce a table for output
    # Input: raw data rows, like `c26682fe4545 friendly-name`
    # Output: A multi-line string consisting of rows from `make_row`. Does not
    # contain table column headers.
    for i in $@; do
        id="${i%% *}"
        name="${i#* }"
        r=$(make_row "$id" "$name")
        printf "${r}\n"
    done
}
######################
# PARSE COMMAND LINE #
######################
case "$1" in
    -h|--help)
    usage
    exit 0
    ;;
    *)
    ;;
esac
##################
# EXECUTE SCRIPT #
##################
set -e
container_data=$(get_container_data "$@")
dockerveth__addrs="$(ip address show)"
table=$(IFS="$NL"; make_table $container_data)
if [ -t 1 ]; then
    printf "CONTAINER ID\tVETH       \tNAMES\n"
fi
printf "${table}\n"

45b62d656a984c99872fc477bac99d78.png

目录
相关文章
|
NoSQL MongoDB Docker
Docker Compose安装MongoDB,并向宿主机映射数据文件/配置文件/日志文件
本文为博主实践Docker Compose方式安装MongoDB记录,希望对大家有所帮助。
2478 0
|
6天前
|
Linux Docker 容器
更改docker容器中的时间而不影响宿主机
更改docker容器中的时间而不影响宿主机
|
8天前
|
存储 安全 数据中心
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
【5月更文挑战第8天】Docker容器利用Namespace和Cgroups实现资源隔离,保证CPU、内存、网络和存储的独立,提升资源利用率和系统安全性。资源隔离有助于简化应用部署与管理,但也带来资源竞争、监控管理及安全挑战。理解并善用资源隔离机制能实现更高效、安全的容器运行。随着技术进步,Docker容器资源隔离将持续优化。
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
|
8天前
|
存储 关系型数据库 Linux
CentOS如何使用Docker部署Plik服务并实现公网访问本地设备上传下载文件
CentOS如何使用Docker部署Plik服务并实现公网访问本地设备上传下载文件
38 4
|
8天前
|
关系型数据库 MySQL Docker
Docker从容器中项目如何访问到宿主机MYSQL
Docker从容器中项目如何访问到宿主机MYSQL
195 0
|
8天前
|
关系型数据库 MySQL 数据库
docker容器访问宿主机mysql数据库
docker容器访问宿主机mysql数据库
94 0
|
8天前
|
消息中间件 Linux 开发工具
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
|
8天前
|
Docker 容器
docker环境时区与宿主机不一致的解决办法
docker环境时区与宿主机不一致的解决办法
|
9月前
|
Docker 容器
Docker文件传输丨如何挂载目录?实现容器和宿主机之间的数据共享,方便开发和部署
Docker文件传输丨如何挂载目录?实现容器和宿主机之间的数据共享,方便开发和部署
|
Linux 网络虚拟化 数据中心
【docker】容器间跨宿主机通信-基于overlay
【docker】容器间跨宿主机通信-基于overlay
600 0
【docker】容器间跨宿主机通信-基于overlay