{"id":23601,"date":"2025-07-02T06:43:37","date_gmt":"2025-07-02T06:43:37","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=23601"},"modified":"2025-07-12T05:38:38","modified_gmt":"2025-07-12T05:38:38","slug":"docker-lab-excercise-assignment-4-docker-networking","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/docker-lab-excercise-assignment-4-docker-networking\/","title":{"rendered":"Docker Lab, Excercise &#038; Assignment &#8211; 4 &#8211; Docker Networking"},"content":{"rendered":"\n<p>Here\u2019s an <strong>in-depth, step-by-step tutorial and lab manual<\/strong> for Docker Networking\u2014starting from basics, covering all core concepts, and providing a hands-on guide to every feature and command. This guide uses the <strong>Ubuntu image<\/strong> for all labs and examples.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Docker Networking Concepts &amp; Lab Manual (Beginner to Advanced)<\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. <strong>Docker Networking Concepts: Introduction<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 What is Docker Networking?<\/h3>\n\n\n\n<p>Docker networking is the system that allows Docker containers to communicate with each other, with the Docker host, and with external networks. Each container, by default, is attached to a network, typically the <code>bridge<\/code> network.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. <strong>Core Concepts<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Types of Docker Networks<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Network Type<\/th><th>Driver<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>bridge<\/td><td>bridge<\/td><td>Default network for containers. Each container gets a virtual Ethernet interface (veth) in its own network namespace.<\/td><\/tr><tr><td>host<\/td><td>host<\/td><td>Shares the host&#8217;s networking stack. No isolation between host and container network.<\/td><\/tr><tr><td>none<\/td><td>null<\/td><td>No networking for the container. Only loopback.<\/td><\/tr><tr><td>custom<\/td><td>bridge<\/td><td>User-defined networks for more control.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Core Components<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bridge<\/strong>: A virtual switch for containers on the same host.<\/li>\n\n\n\n<li><strong>veth Pair<\/strong>: A pair of virtual ethernet devices. One end is in the container, the other in the host.<\/li>\n\n\n\n<li><strong>eth0<\/strong>: The default network interface inside the container.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. <strong>Lab Manual: Hands-on with Docker Networking<\/strong><\/h2>\n\n\n\n<p>All commands below are to be run on a Docker host with the <strong>Ubuntu<\/strong> image pulled (<code>docker pull ubuntu<\/code>).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 <strong>Listing Docker Networks<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network ls\n<\/code><\/span><\/pre>\n\n\n<p><strong>Output:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">NETWORK ID     NAME      DRIVER    SCOPE\n<span class=\"hljs-number\">0<\/span>bb0cc0920f0   bridge    bridge    local\n<span class=\"hljs-number\">8<\/span>acf821ccc8a   host      host      local\na8c348b5037b   none      <span class=\"hljs-literal\">null<\/span>      local\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 <strong>Inspecting a Docker Network<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network inspect bridge\n<\/code><\/span><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Shows subnet, gateway, attached containers, etc.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 <strong>Creating Custom Networks<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network create dev\ndocker network create qa\ndocker network create --driver bridge devopsschool\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 <strong>Inspecting Custom Networks<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network inspect dev\ndocker network inspect qa\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.5 <strong>Running Containers with Specific Networks<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Create and attach container to 'qa' network<\/span>\ndocker run -itd --name qa1 --net=qa ubuntu\n\n<span class=\"hljs-comment\"># Create and attach container to 'dev' network<\/span>\ndocker run -itd --name dev1 --net=dev ubuntu\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.6 <strong>Viewing Network Interfaces in Containers<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">docker exec -it qa1 \/bin\/bash\nip a\n<span class=\"hljs-comment\"># Check eth0 interface, assigned IP, etc.<\/span>\n<span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.7 <strong>Network Connection Scenarios<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>A. Connecting a Container to Multiple Networks<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">docker network connect dev qa1\ndocker inspect qa1 | grep -A <span class=\"hljs-number\">20<\/span> <span class=\"hljs-string\">\"Networks\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\"><strong>B. Disconnecting a Container from a Network<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">docker network disconnect dev qa1\ndocker inspect qa1 | grep -A <span class=\"hljs-number\">20<\/span> <span class=\"hljs-string\">\"Networks\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.8 <strong>Testing Connectivity Between Containers<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create two containers on the same network: <br><code>docker run -itd --name qa2 --net=qa ubuntu<\/code><\/li>\n\n\n\n<li>Install <code>ping<\/code> utility (inside both containers): <br><code>docker exec -it qa1 apt update <\/code><br><code>docker exec -it qa1 apt install iputils-ping -y <\/code><br><code>docker exec -it qa2 apt update <\/code><br><code>docker exec -it qa2 apt install iputils-ping -y<\/code><\/li>\n\n\n\n<li>Get the IP of <code>qa2<\/code>: <code>docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' qa2<\/code><\/li>\n\n\n\n<li>Ping from <code>qa1<\/code> to <code>qa2<\/code>: <code>docker exec -it qa1 ping &lt;qa2-IP&gt;<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.9 <strong>Default Networks: host and none<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>A. Host Network<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">docker run -itd --name host1 --net=host ubuntu\ndocker exec -it host1 ip a\n<span class=\"hljs-comment\"># Shares all network interfaces with host.<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\"><strong>B. None Network<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">docker run -itd --name none1 --net=none ubuntu\ndocker exec -it none1 ip a\n<span class=\"hljs-comment\"># Only loopback interface is present.<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.10 <strong>Understanding veth, Bridge, eth0<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Each container connected to a bridge gets a pair of virtual ethernet interfaces (veth):\n<ul class=\"wp-block-list\">\n<li>One end in container as <strong>eth0<\/strong><\/li>\n\n\n\n<li>Other end in the Docker bridge on the host.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Lab: See the veth pair<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Find container PID: <code>docker inspect --format '{{.State.Pid}}' qa1<\/code><\/li>\n\n\n\n<li>On host, see interfaces: <code>ip link # Look for veth... interfaces<\/code><\/li>\n\n\n\n<li>In container: <code>docker exec -it qa1 ip a # eth0<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.11 <strong>Removing and Pruning Networks<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">docker network rm dev\ndocker network prune  <span class=\"hljs-comment\"># Removes all unused networks<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.12 <strong>Advanced Networking Commands<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>A. List Containers on a Network<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network inspect qa | grep Name\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\"><strong>B. Assign Static IP to Container<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network create --subnet=192.168.100.0\/24 staticnet\ndocker run -itd --name static1 --net=staticnet --ip=192.168.100.10 ubuntu\ndocker exec -it static1 ip a\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.13 <strong>Network Namespace Lab (Linux)<\/strong><\/h3>\n\n\n\n<p><strong>View container&#8217;s network namespace:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Get container PID: <code>docker inspect --format '{{.State.Pid}}' qa1<\/code><\/li>\n\n\n\n<li>On host: <code>nsenter -t &lt;PID&gt; -n ip a<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. <strong>Docker Network CLI Cheat Sheet<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>docker network ls<\/td><td>List all networks<\/td><\/tr><tr><td>docker network create<\/td><td>Create a new network<\/td><\/tr><tr><td>docker network inspect<\/td><td>Inspect network details<\/td><\/tr><tr><td>docker run &#8211;net= &#8230;<\/td><td>Run container on a specific network<\/td><\/tr><tr><td>docker network connect<\/td><td>Attach container to network<\/td><\/tr><tr><td>docker network disconnect<\/td><td>Detach container from network<\/td><\/tr><tr><td>docker network rm<\/td><td>Remove a network<\/td><\/tr><tr><td>docker network prune<\/td><td>Remove all unused networks<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. <strong>Advanced Scenarios<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 <strong>Container to Host Networking<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bridge:<\/strong> Containers can communicate with the host via the gateway IP of the bridge.<\/li>\n\n\n\n<li><strong>Host:<\/strong> Full access, same as host.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 <strong>Container to External World<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>By default, containers can reach the outside world unless firewalled.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. <strong>Sample Lab Scenarios<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Scenario 1: Multi-network Container<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create two networks: <code>docker network create netA docker network create netB<\/code><\/li>\n\n\n\n<li>Run container in netA: <code>docker run -itd --name multi1 --net=netA ubuntu<\/code><\/li>\n\n\n\n<li>Connect it to netB: <code>docker network connect netB multi1<\/code><\/li>\n\n\n\n<li>Inspect: <code>docker inspect multi1 | grep -A 20 \"Networks\"<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Scenario 2: Communication Restriction<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Run two containers, one on <code>dev<\/code>, one on <code>qa<\/code>.<\/li>\n\n\n\n<li>They cannot ping each other (different networks).<\/li>\n\n\n\n<li>Connect one container to both networks; now it can access both.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Scenario 3: Isolated Network<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a network with <code>--internal<\/code> flag (blocks external access): <code>docker network create --internal isolated docker run -itd --net=isolated --name isoc1 ubuntu<\/code><\/li>\n\n\n\n<li>Try to ping external site\u2014it will fail.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. <strong>Cleaning Up<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker network prune\ndocker network rm <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">network_name<\/span>&gt;<\/span>\ndocker rm -f $(docker ps -aq)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Summary: Docker Networking Deep Dive<\/strong><\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bridge<\/strong>: Default, most common network. Use for most container-to-container communication.<\/li>\n\n\n\n<li><strong>veth<\/strong>: Connects container\u2019s network stack to host bridge.<\/li>\n\n\n\n<li><strong>eth0<\/strong>: Network interface in container.<\/li>\n\n\n\n<li><strong>host\/none<\/strong>: Special cases for sharing host stack or isolating.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Further Learning<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Overlay networks (for Docker Swarm\/multi-host).<\/li>\n\n\n\n<li>Macvlan networks.<\/li>\n\n\n\n<li>DNS resolution within Docker networks.<\/li>\n\n\n\n<li>Exposing and publishing ports (<code>-p<\/code>, <code>--expose<\/code>).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Full Docker Networking Lab Script (Ready to Use)<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Step 1: Pull Ubuntu image<\/span>\ndocker pull ubuntu\n\n<span class=\"hljs-comment\"># Step 2: List Docker networks<\/span>\ndocker network ls\n\n<span class=\"hljs-comment\"># Step 3: Inspect bridge network<\/span>\ndocker network inspect bridge\n\n<span class=\"hljs-comment\"># Step 4: Create custom networks<\/span>\ndocker network create dev\ndocker network create qa\n\n<span class=\"hljs-comment\"># Step 5: List and inspect<\/span>\ndocker network ls\ndocker network inspect dev\n\n<span class=\"hljs-comment\"># Step 6: Run containers on custom networks<\/span>\ndocker run -itd --name dev1 --net=dev ubuntu\ndocker run -itd --name qa1 --net=qa ubuntu\n\n<span class=\"hljs-comment\"># Step 7: Inspect container network interfaces<\/span>\ndocker exec -it dev1 ip a\ndocker exec -it qa1 ip a\n\n<span class=\"hljs-comment\"># Step 8: Connect dev1 to qa<\/span>\ndocker network connect qa dev1\n\n<span class=\"hljs-comment\"># Step 9: Disconnect dev1 from qa<\/span>\ndocker network disconnect qa dev1\n\n<span class=\"hljs-comment\"># Step 10: Host and none networks<\/span>\ndocker run -itd --name host1 --net=host ubuntu\ndocker run -itd --name none1 --net=none ubuntu\n\n<span class=\"hljs-comment\"># Step 11: Assign static IP<\/span>\ndocker network create --subnet=<span class=\"hljs-number\">192.168<\/span><span class=\"hljs-number\">.55<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">24<\/span> staticnet\ndocker run -itd --name static1 --net=staticnet --ip=<span class=\"hljs-number\">192.168<\/span><span class=\"hljs-number\">.55<\/span><span class=\"hljs-number\">.10<\/span> ubuntu\n\n<span class=\"hljs-comment\"># Step 12: Network cleanup<\/span>\ndocker network prune\ndocker network rm dev qa staticnet\ndocker rm -f $(docker ps -aq)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Here\u2019s a <strong>comprehensive manual<\/strong> listing all essential <strong>Linux networking commands<\/strong> to explore, inspect, and troubleshoot <strong>Docker container networking<\/strong> on Ubuntu. This guide covers how to analyze networking at the <strong>host<\/strong> level and <strong>inside the container<\/strong>\u2014from simple checks to advanced network namespace tricks.<br><\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Manual: Linux Networking Commands for Exploring Docker Container Networking<\/strong><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Checking Network Interfaces<\/strong><\/h2>\n\n\n\n<p><strong>On the Host:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">ip a             <span class=\"hljs-comment\"># Shows all network interfaces (look for docker0, veth*, etc.)<\/span>\nifconfig -a      <span class=\"hljs-comment\"># Alternative view (may need 'net-tools' package)<\/span>\nip link          <span class=\"hljs-comment\"># Lists all interfaces (states, MACs)<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Inside a Container:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span> ip a\ndocker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span> ifconfig -a\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Tip:<\/strong> The container\u2019s main interface is usually <code>eth0<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Checking Routing Tables<\/strong><\/h2>\n\n\n\n<p><strong>On the Host:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ip route\nroute -n\n<\/code><\/span><\/pre>\n\n\n<p><strong>Inside a Container:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span> ip route\ndocker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span> route -n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Viewing Network Namespaces<\/strong><\/h2>\n\n\n\n<p>Each Docker container runs in its own <strong>network namespace<\/strong>.<\/p>\n\n\n\n<p><strong>List network namespaces (on host):<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">ls \/<span class=\"hljs-keyword\">var<\/span>\/run\/netns    <span class=\"hljs-comment\"># Sometimes empty unless explicitly created<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Find container\u2019s PID:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker inspect --format '{{.State.Pid}}' <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Explore container\u2019s network namespace (as root):<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">nsenter -t &lt;PID&gt; -n ip a      <span class=\"hljs-comment\"># View interfaces in the container's namespace<\/span>\nnsenter -t &lt;PID&gt; -n bash      <span class=\"hljs-comment\"># Get a shell in the namespace<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Exploring veth Pairs and Docker Bridges<\/strong><\/h2>\n\n\n\n<p><strong>On the Host:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">brctl show                   <span class=\"hljs-comment\"># Shows bridges and connected interfaces (needs 'bridge-utils')<\/span>\nip link                      <span class=\"hljs-comment\"># Shows veth* interfaces<\/span>\nip -d link                   <span class=\"hljs-comment\"># Details (peer relationships for veth)<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Find docker0 bridge:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ip a | grep docker0\nbrctl show docker0\n<\/code><\/span><\/pre>\n\n\n<p><strong>Show bridge IP and attached interfaces:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ip addr show docker0\nbridge link show dev docker0\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Checking Network Connections<\/strong><\/h2>\n\n\n\n<p><strong>On the Host or in Container:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">ss -tulnp                   <span class=\"hljs-comment\"># Lists open ports and listening sockets<\/span>\nnetstat -tulnp              <span class=\"hljs-comment\"># Same, legacy (needs 'net-tools')<\/span>\nlsof -i                     <span class=\"hljs-comment\"># Shows open files and network sockets<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Test connectivity:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">ping <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP<\/span>&gt;<\/span>\ntraceroute <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP<\/span>&gt;<\/span>             # May need to install\ncurl <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">URL<\/span>&gt;<\/span>                  # Test HTTP\/S\nnc -vz <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP<\/span>&gt;<\/span> <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">port<\/span>&gt;<\/span>          # Test TCP port (nc = netcat)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Inside a container:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">exec<\/span> <span class=\"hljs-selector-tag\">-it<\/span> &lt;<span class=\"hljs-selector-tag\">container-name<\/span>&gt; <span class=\"hljs-selector-tag\">ping<\/span> 8<span class=\"hljs-selector-class\">.8<\/span><span class=\"hljs-selector-class\">.8<\/span><span class=\"hljs-selector-class\">.8<\/span>\n<span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">exec<\/span> <span class=\"hljs-selector-tag\">-it<\/span> &lt;<span class=\"hljs-selector-tag\">container-name<\/span>&gt; <span class=\"hljs-selector-tag\">curl<\/span> <span class=\"hljs-selector-tag\">ifconfig<\/span><span class=\"hljs-selector-class\">.me<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6. Docker Networking on the Host<\/strong><\/h2>\n\n\n\n<p><strong>Show Docker networks:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker network ls\ndocker network inspect <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">network<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Show firewall\/NAT rules (how Docker handles IP forwarding):<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo iptables -t nat -L -n -v | grep DOCKER\nsudo iptables -L -n -v | grep DOCKER\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7. Observing Container MAC\/IP Addresses<\/strong><\/h2>\n\n\n\n<p><strong>Get container\u2019s IP\/MAC from Docker:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container<\/span>&gt;<\/span>\ndocker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8. DNS Inside Docker<\/strong><\/h2>\n\n\n\n<p><strong>Check <code>\/etc\/resolv.conf<\/code> in a container:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container<\/span>&gt;<\/span> cat \/etc\/resolv.conf\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Docker usually provides its own embedded DNS server to containers.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>9. Examining Network Traffic (Advanced)<\/strong><\/h2>\n\n\n\n<p><strong>Packet capture on docker0 bridge:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo tcpdump -i docker0\nsudo tcpdump -i any port 80\n<\/code><\/span><\/pre>\n\n\n<p><strong>In a container:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">docker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container<\/span>&gt;<\/span> apt update\ndocker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container<\/span>&gt;<\/span> apt install tcpdump -y\ndocker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container<\/span>&gt;<\/span> tcpdump -i eth0\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>10. Example: Full Lab to Explore Docker Networking Internals<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1: Start a container and note its details<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">docker run -itd --name nettest ubuntu\ndocker inspect nettest | grep -A <span class=\"hljs-number\">5<\/span> <span class=\"hljs-string\">\"Networks\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 2: Find container\u2019s PID and veth pair<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">CONTAINER_ID=$(docker ps -qf <span class=\"hljs-string\">\"name=nettest\"<\/span>)\nPID=$(docker inspect --format <span class=\"hljs-string\">'{{.State.Pid}}'<\/span> $CONTAINER_ID)\nls -l \/proc\/$PID\/ns\/net    <span class=\"hljs-comment\"># Shows network namespace link<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3: Map veth pair<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>On the host: <code>ip link | grep veth<\/code><\/li>\n\n\n\n<li>Use <code>ethtool<\/code> to find which veth peer connects to which container (install with <code>apt install ethtool<\/code>): <code>ethtool -S vethXXXXX # Find statistics, may show peer info<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 4: Check bridge<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">brctl show\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 5: Explore namespace with nsenter<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sudo nsenter -t $PID -n ip a\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>11. Useful Tools to Install on Ubuntu for Networking Labs<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo apt update\nsudo apt install iproute2 net-tools bridge-utils tcpdump ethtool lsof traceroute iputils-ping dnsutils curl netcat\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Summary Table of Commands<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Purpose<\/th><th>Host Command<\/th><th>Container Command (with docker exec)<\/th><\/tr><\/thead><tbody><tr><td>List interfaces<\/td><td>ip a \/ ifconfig -a<\/td><td>ip a \/ ifconfig -a<\/td><\/tr><tr><td>Routing table<\/td><td>ip route \/ route -n<\/td><td>ip route \/ route -n<\/td><\/tr><tr><td>Network namespaces<\/td><td>nsenter -t -n ip a<\/td><td>(direct, already inside namespace)<\/td><\/tr><tr><td>List bridges<\/td><td>brctl show<\/td><td>(usually N\/A)<\/td><\/tr><tr><td>Docker bridge status<\/td><td>ip addr show docker0<\/td><td>(N\/A)<\/td><\/tr><tr><td>veth info<\/td><td>ip link \/ ip -d link \/ ethtool<\/td><td>(N\/A)<\/td><\/tr><tr><td>Open ports<\/td><td>ss -tulnp \/ netstat -tulnp<\/td><td>ss -tulnp \/ netstat -tulnp<\/td><\/tr><tr><td>Test connectivity<\/td><td>ping, curl, nc, traceroute<\/td><td>ping, curl, nc, traceroute<\/td><\/tr><tr><td>DNS check<\/td><td>cat \/etc\/resolv.conf<\/td><td>docker exec cat \/etc\/resolv.conf<\/td><\/tr><tr><td>Packet capture<\/td><td>tcpdump -i docker0 \/ tcpdump -i any port<\/td><td>tcpdump -i eth0<\/td><\/tr><tr><td>Docker inspect<\/td><td>docker inspect, docker network inspect<\/td><td>(N\/A)<\/td><\/tr><tr><td>IP\/MAC from inspect<\/td><td>docker inspect -f &#8230;<\/td><td>(N\/A)<\/td><\/tr><tr><td>Firewall\/NAT rules<\/td><td>iptables -t nat -L<\/td><td>grep DOCKER<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>End-to-End Lab Workflow Example<\/strong><\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Create a bridge network<\/strong> <code>docker network create mynet<\/code><\/li>\n\n\n\n<li><strong>Start two Ubuntu containers<\/strong> <code>docker run -itd --name box1 --net=mynet ubuntu docker run -itd --name box2 --net=mynet ubuntu<\/code><\/li>\n\n\n\n<li><strong>Check networking from host<\/strong> <code>docker network inspect mynet ip a # look for new veth interfaces brctl show<\/code><\/li>\n\n\n\n<li><strong>Check networking from inside containers<\/strong> <code>docker exec -it box1 ip a docker exec -it box2 ip a<\/code><\/li>\n\n\n\n<li><strong>Test connectivity<\/strong> <code>docker exec -it box1 apt update docker exec -it box1 apt install iputils-ping -y docker exec -it box1 ping &lt;IP-of-box2&gt;<\/code><\/li>\n\n\n\n<li><strong>Trace the connection (from host)<\/strong> <code>sudo tcpdump -i docker0<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Extra: How Docker Networking Actually Works (Flow Summary)<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Docker creates a <code>docker0<\/code> bridge on the host.<\/li>\n\n\n\n<li>When you run a container, Docker:\n<ul class=\"wp-block-list\">\n<li>Creates a network namespace for the container.<\/li>\n\n\n\n<li>Creates a veth pair: one end in host namespace, other in container as <code>eth0<\/code>.<\/li>\n\n\n\n<li>Connects host end of veth to <code>docker0<\/code> bridge.<\/li>\n\n\n\n<li>Assigns container an IP from the bridge subnet.<\/li>\n\n\n\n<li>Sets up NAT\/iptables rules for outbound access.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"epyt-gallery\" data-currpage=\"1\" id=\"epyt_gallery_46193\"><iframe loading=\"lazy\"  id=\"_ytid_63853\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/?enablejsapi=1&autoplay=0&cc_load_policy=0&cc_lang_pref=&iv_load_policy=1&loop=0&rel=1&fs=1&playsinline=0&autohide=2&theme=dark&color=red&controls=1&disablekb=0&\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  data-epytgalleryid=\"epyt_gallery_46193\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe><div class=\"epyt-gallery-list\"><div>Sorry, there was a YouTube error.<\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s an in-depth, step-by-step tutorial and lab manual for Docker Networking\u2014starting from basics, covering all core concepts, and providing a hands-on guide to every feature and command. This guide uses&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4862],"tags":[],"class_list":["post-23601","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=23601"}],"version-history":[{"count":5,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23601\/revisions"}],"predecessor-version":[{"id":49914,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23601\/revisions\/49914"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=23601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=23601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=23601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}