{"id":49309,"date":"2025-05-12T13:42:19","date_gmt":"2025-05-12T13:42:19","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49309"},"modified":"2025-07-12T05:38:39","modified_gmt":"2025-07-12T05:38:39","slug":"how-to-assign-a-static-ip-to-a-docker-container-in-bridge-mode","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-assign-a-static-ip-to-a-docker-container-in-bridge-mode\/","title":{"rendered":"How to Assign a Static IP to a Docker Container in Bridge Mode"},"content":{"rendered":"\n<p>In this guide, you&#8217;ll learn how to assign a <strong>static IP address<\/strong> to a Docker container using a <strong>custom bridge network<\/strong>. This IP address will remain <strong>fixed<\/strong> even after your host system <strong>reboots<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Why You Need This<\/h2>\n\n\n\n<p>By default, Docker assigns dynamic IPs to containers via its <code>bridge<\/code> network. If you restart your server or container, the IP may change \u2014 which breaks networking for apps relying on fixed addresses.<\/p>\n\n\n\n<p>This tutorial helps solve that by:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creating a custom bridge network<\/li>\n\n\n\n<li>Assigning a fixed IP<\/li>\n\n\n\n<li>Enabling auto-restart after reboot<\/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\">\ud83e\uddf0 Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker installed on your Linux system (<code>docker -v<\/code> to verify)<\/li>\n\n\n\n<li>Root or sudo access<\/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\">\ud83d\udd27 Step 1: Create a Custom Bridge Network<\/h2>\n\n\n\n<p>The default Docker bridge does <strong>not<\/strong> support static IP assignment. So, first create a custom one:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker network create \\\n  --driver bridge \\\n  --subnet 192.168.100.0\/24 \\\n  --gateway 192.168.100.1 \\\n  my_custom_bridge\n<\/code><\/span><\/pre>\n\n\n<p>\u2705 This creates a new Docker bridge network:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Subnet: <code>192.168.100.0\/24<\/code><\/li>\n\n\n\n<li>Gateway: <code>192.168.100.1<\/code><\/li>\n\n\n\n<li>Name: <code>my_custom_bridge<\/code><\/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\">\ud83d\ude80 Step 2: Run a Container with a Static IP<\/h2>\n\n\n\n<p>Now, start your container with a <strong>fixed IP<\/strong> and <strong>auto-restart policy<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" 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\">run<\/span> <span class=\"hljs-selector-tag\">-dit<\/span> \\\n  <span class=\"hljs-selector-tag\">--name<\/span> <span class=\"hljs-selector-tag\">my_httpd<\/span> \\\n  <span class=\"hljs-selector-tag\">--network<\/span> <span class=\"hljs-selector-tag\">my_custom_bridge<\/span> \\\n  <span class=\"hljs-selector-tag\">--ip<\/span> 192<span class=\"hljs-selector-class\">.168<\/span><span class=\"hljs-selector-class\">.100<\/span><span class=\"hljs-selector-class\">.10<\/span> \\\n  <span class=\"hljs-selector-tag\">--restart<\/span> <span class=\"hljs-selector-tag\">unless-stopped<\/span> \\\n  <span class=\"hljs-selector-tag\">httpd<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>\u2705 This ensures:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>192.168.100.10<\/code> is always assigned<\/li>\n\n\n\n<li>The container restarts after reboot<\/li>\n\n\n\n<li>It uses your custom bridge<\/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\">\ud83d\udd04 Step 3: Test Persistence After Reboot<\/h2>\n\n\n\n<p>Reboot your host system:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo reboot\n<\/code><\/span><\/pre>\n\n\n<p>After the reboot, run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker ps\ndocker inspect my_httpd | grep IPAddress\n<\/code><\/span><\/pre>\n\n\n<p>\u2705 You should see your container up and running with the same IP.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcdd Additional Notes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Avoid IP conflicts<\/strong> by managing assigned IPs manually.<\/li>\n\n\n\n<li>You can replace <code>httpd<\/code> with any image (e.g., <code>nginx<\/code>, <code>mysql<\/code>, <code>your-custom-app<\/code>).<\/li>\n\n\n\n<li>Use <code>docker network inspect my_custom_bridge<\/code> to check connected containers.<\/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\">\ud83e\udde0 Bonus Tip: Docker Compose Version<\/h2>\n\n\n\n<p>Create a <code>docker-compose.yml<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">version: <span class=\"hljs-string\">'3.7'<\/span>\n<span class=\"hljs-attr\">services<\/span>:\n  web:\n    image: httpd\n    <span class=\"hljs-attr\">container_name<\/span>: my_httpd\n    <span class=\"hljs-attr\">restart<\/span>: unless-stopped\n    <span class=\"hljs-attr\">networks<\/span>:\n      mynet:\n        ipv4_address: <span class=\"hljs-number\">192.168<\/span><span class=\"hljs-number\">.100<\/span><span class=\"hljs-number\">.10<\/span>\n\n<span class=\"hljs-attr\">networks<\/span>:\n  mynet:\n    driver: bridge\n    <span class=\"hljs-attr\">ipam<\/span>:\n      config:\n        - subnet: <span class=\"hljs-number\">192.168<\/span><span class=\"hljs-number\">.100<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">24<\/span>\n          <span class=\"hljs-attr\">gateway<\/span>: <span class=\"hljs-number\">192.168<\/span><span class=\"hljs-number\">.100<\/span><span class=\"hljs-number\">.1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<p>Then run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker-compose up -d\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\">\u2705 Conclusion<\/h2>\n\n\n\n<p>You\u2019ve now:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Created a custom Docker network<\/li>\n\n\n\n<li>Assigned a static IP to a container<\/li>\n\n\n\n<li>Ensured it persists across reboots<\/li>\n<\/ul>\n\n\n\n<p>This is especially helpful for microservices, reverse proxies, and apps that require stable internal networking.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this guide, you&#8217;ll learn how to assign a static IP address to a Docker container using a custom bridge network. This IP address will remain fixed even after your&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4862],"tags":[],"class_list":["post-49309","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49309","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=49309"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49309\/revisions"}],"predecessor-version":[{"id":49310,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49309\/revisions\/49310"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}