# Docker如何固定IP設定的方法

[Docker如何固定IP設定的方法 - IT閱讀 (itread01.com)](https://www.itread01.com/article/1499743916.html)

經常用Docker模擬專案在生產環境中的部署，往往需要同時開好幾臺Docker容器，而且有時安裝的軟體需要繫結Docker區域網中的其他容器，如 MongoDB 副本集部署的時候，就需要繫結其他容器的內網IP。

但是，Docker 每次重啟後，容器的IP地址會變化，查詢了資料，Docker是支援設定固定IP的。

**Docker 預設網路**

Docker安裝後，預設會建立下面三種網路型別：

<div id="bkmrk-%24-docker-network-ls-">```
<span class="pln">$ docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
</span><span class="lit">9781b1f585ae</span><span class="pln">    bridge       bridge       </span><span class="kwd">local</span>
<span class="lit">1252da701e55</span><span class="pln">    host        host        </span><span class="kwd">local</span>
<span class="lit">237ea3d5cfbf</span><span class="pln">    none        </span><span class="kwd">null</span>        <span class="kwd">local</span>
```

</div>啟動 Docker的時候，用 `--network `引數，可以指定網路型別，如：

<div id="bkmrk-%7E-docker-run--itd---">```
<span class="pun">~</span><span class="pln"> docker run </span><span class="pun">-</span><span class="pln">itd </span><span class="pun">--</span><span class="pln">name test1 </span><span class="pun">--</span><span class="pln">network bridge </span><span class="pun">--</span><span class="pln">ip </span><span class="lit">172.17</span><span class="pun">.</span><span class="lit">0.10</span><span class="pln"> centos</span><span class="pun">:</span><span class="pln">latest </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">bash</span>
```

</div>**bridge：橋接網路**

預設情況下啟動的Docker容器，都是使用 bridge，Docker安裝時建立的橋接網路，每次Docker容器重啟時，會按照順序獲取對應的IP地址，這個就導致重啟下，Docker的IP地址就變了

**none：無指定網路**

使用 `--network=none `，docker 容器就不會分配區域網的IP

**host： 主機網路**

使用 `--network=host`，此時，Docker 容器的網路會附屬在主機上，兩者是互通的。

例如，在容器中執行一個Web服務，監聽8080埠，則主機的8080埠就會自動對映到容器中。

**建立自定義網路：（設定固定IP）**

啟動Docker容器的時候，使用預設的網路是不支援指派固定IP的，如下：

<div id="bkmrk-%7E-docker-run--itd----0">```
<span class="pun">~</span><span class="pln"> docker run </span><span class="pun">-</span><span class="pln">itd </span><span class="pun">--</span><span class="pln">net bridge </span><span class="pun">--</span><span class="pln">ip </span><span class="lit">172.17</span><span class="pun">.</span><span class="lit">0.10</span><span class="pln"> centos</span><span class="pun">:</span><span class="pln">latest </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">bash
</span><span class="lit">6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6</span><span class="pln">
docker</span><span class="pun">:</span> <span class="typ">Error</span><span class="pln"> response </span><span class="kwd">from</span><span class="pln"> daemon</span><span class="pun">:</span> <span class="typ">User</span><span class="pln"> specified IP address </span><span class="kwd">is</span><span class="pln"> supported on user </span><span class="kwd">defined</span><span class="pln"> networks only</span><span class="pun">.</span>
```

</div>因此，需要建立自定義網路，下面是具體的步驟：

**步驟1: 建立自定義網路**

建立自定義網路，並且指定網段：172.18.0.0/16

<div id="bkmrk-%E2%9E%9C-%7E-docker-network-c">```
<span class="pun">➜</span> <span class="pun">~</span><span class="pln"> docker network create </span><span class="pun">--</span><span class="pln">subnet</span><span class="pun">=</span><span class="lit">172.18</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">16</span><span class="pln"> mynetwork
</span><span class="pun">➜</span> <span class="pun">~</span><span class="pln"> docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
</span><span class="lit">9781b1f585ae</span><span class="pln">    bridge       bridge       </span><span class="kwd">local</span>
<span class="lit">1252da701e55</span><span class="pln">    host        host        </span><span class="kwd">local</span>
<span class="lit">4f11ae9c85de</span><span class="pln">    mynetwork      bridge       </span><span class="kwd">local</span>
<span class="lit">237ea3d5cfbf</span><span class="pln">    none        </span><span class="kwd">null</span>        <span class="kwd">local</span>
```

</div>**步驟2: 建立Docker容器**

<u></u>程式碼如下:

➜ ~ docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash

這個時候，建立的Docker容器就會持有 172.18.0.2 這個IP.

<div id="bkmrk-%5Broot%40ec8e31938fe7-%2F">```
<span class="pun">[</span><span class="pln">root@ec8e31938fe7</span> <span class="pun">/]#</span><span class="pln"> ifconfig
eth0   </span><span class="typ">Link</span><span class="pln"> encap</span><span class="pun">:</span><span class="typ">Ethernet</span> <span class="typ">HWaddr</span> <span class="lit">02</span><span class="pun">:</span><span class="lit">42</span><span class="pun">:</span><span class="pln">AC</span><span class="pun">:</span><span class="lit">12</span><span class="pun">:</span><span class="lit">00</span><span class="pun">:</span><span class="lit">02</span><span class="pln">
     inet addr</span><span class="pun">:</span><span class="lit">172.18</span><span class="pun">.</span><span class="lit">0.2</span> <span class="typ">Bcast</span><span class="pun">:</span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span> <span class="typ">Mask</span><span class="pun">:</span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
     inet6 addr</span><span class="pun">:</span><span class="pln"> fe80</span><span class="pun">::</span><span class="lit">42</span><span class="pun">:</span><span class="pln">acff</span><span class="pun">:</span><span class="pln">fe12</span><span class="pun">:</span><span class="lit">2</span><span class="pun">/</span><span class="lit">64</span> <span class="typ">Scope</span><span class="pun">:</span><span class="typ">Link</span><span class="pln">
     UP BROADCAST RUNNING MULTICAST MTU</span><span class="pun">:</span><span class="lit">1500</span> <span class="typ">Metric</span><span class="pun">:</span><span class="lit">1</span><span class="pln">
     RX packets</span><span class="pun">:</span><span class="lit">88</span><span class="pln"> errors</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> dropped</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> overruns</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> frame</span><span class="pun">:</span><span class="lit">0</span><span class="pln">
     TX packets</span><span class="pun">:</span><span class="lit">14</span><span class="pln"> errors</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> dropped</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> overruns</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> carrier</span><span class="pun">:</span><span class="lit">0</span><span class="pln">
     collisions</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> txqueuelen</span><span class="pun">:</span><span class="lit">0</span><span class="pln">
     RX bytes</span><span class="pun">:</span><span class="lit">4056</span> <span class="pun">(</span><span class="lit">3.9</span> <span class="typ">KiB</span><span class="pun">)</span><span class="pln"> TX bytes</span><span class="pun">:</span><span class="lit">1068</span> <span class="pun">(</span><span class="lit">1.0</span> <span class="typ">KiB</span><span class="pun">)</span><span class="pln">

lo    </span><span class="typ">Link</span><span class="pln"> encap</span><span class="pun">:</span><span class="typ">Local</span> <span class="typ">Loopback</span><span class="pln">
     inet addr</span><span class="pun">:</span><span class="lit">127.0</span><span class="pun">.</span><span class="lit">0.1</span> <span class="typ">Mask</span><span class="pun">:</span><span class="lit">255.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
     inet6 addr</span><span class="pun">:</span> <span class="pun">::</span><span class="lit">1</span><span class="pun">/</span><span class="lit">128</span> <span class="typ">Scope</span><span class="pun">:</span><span class="typ">Host</span><span class="pln">
     UP LOOPBACK RUNNING MTU</span><span class="pun">:</span><span class="lit">65536</span> <span class="typ">Metric</span><span class="pun">:</span><span class="lit">1</span><span class="pln">
     RX packets</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> errors</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> dropped</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> overruns</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> frame</span><span class="pun">:</span><span class="lit">0</span><span class="pln">
     TX packets</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> errors</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> dropped</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> overruns</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> carrier</span><span class="pun">:</span><span class="lit">0</span><span class="pln">
     collisions</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> txqueuelen</span><span class="pun">:</span><span class="lit">1</span><span class="pln">
     RX bytes</span><span class="pun">:</span><span class="lit">0</span> <span class="pun">(</span><span class="lit">0.0</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> TX bytes</span><span class="pun">:</span><span class="lit">0</span> <span class="pun">(</span><span class="lit">0.0</span><span class="pln"> b</span><span class="pun">)</span>
```

</div>