<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>dwt&#039;s life - docker</title>
<link>https://dwt.life/tag/docker/</link>
<atom:link href="https://dwt.life/feed/tag/docker/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Sat, 08 Apr 2023 16:28:13 +0800</lastBuildDate>
<pubDate>Sat, 08 Apr 2023 16:28:13 +0800</pubDate>
<item>
<title>Docker JuiceFS</title>
<link>https://dwt.life/archives/324/</link>
<guid>https://dwt.life/archives/324/</guid>
<pubDate>Sat, 08 Apr 2023 16:28:13 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[sudo apt-get -y install fusesudo docker plugin install juicedata/juicefs --alias juicefs]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<pre><code>sudo apt-get -y install fuse
sudo docker plugin install juicedata/juicefs --alias juicefs</code></pre>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/324/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>docker内存限制</title>
<link>https://dwt.life/archives/27/</link>
<guid>https://dwt.life/archives/27/</guid>
<pubDate>Sun, 04 Jul 2021 01:23:27 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[-m 和 --memory-swapdocker run -it --rm -m 100M --memory-swap -1 ubuntu-stress:latest /bin/bash指定限制...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>-m 和 --memory-swap</p><p><code>docker run -it --rm -m 100M --memory-swap -1 ubuntu-stress:latest /bin/bash</code></p><p>指定限制内存大小并且设置 memory-swap 值为 -1，表示容器程序使用内存受限，而 swap 空间使用不受限制（宿主 swap 支持使用多少则容器即可使用多少。如果 --memory-swap 设置小于 --memory则设置不生效，使用默认设置）。</p><p><code>docker run -it --rm -m 100M --memory-swap -1 centos /bin/bash</code></p><p>按照官方文档的理解，如果指定 -m 内存限制时不添加 --memory-swap 选项，则表示容器中程序可以使用 100M 内存和 100M swap 内存。默认情况下，–memory-swap 会被设置成 memory 的 2倍。</p><p><code>–memory-swappiness=0</code></p><p>表示禁用容器 swap 功能(这点不同于宿主机，宿主机 swappiness 设置为 0 也不保证 swap 不会被使用):</p><p><code>docker run -it --rm -m 100M --memory-swappiness=0 ubuntu-stress:latest /bin/bash</code></p><p>–memory-reservation</p><p>选项可以理解为内存的软限制。如果不设置 -m 选项，那么容器使用内存可以理解为是不受限的。按照官方的说法，memory reservation 设置可以确保容器不会长时间占用大量内存。</p><p>–oom-kill-disable</p><p><code>docker run -it --rm -m 100M --memory-swappiness=0 --oom-kill-disable ubuntu-stress:latest /bin/bash</code></p><p>–kernel-memory</p><p>内核内存与用户内存根本不同，因为内核内存无法换出。无法交换使容器可能通过占用过多的内核内存来阻止系统服务。内核内存包括：</p><p>stack pages<br>slab pages<br>sockets memory pressure<br>tcp memory pressure</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/27/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>docker容器的CPU资源限制</title>
<link>https://dwt.life/archives/26/</link>
<guid>https://dwt.life/archives/26/</guid>
<pubDate>Sun, 04 Jul 2021 01:17:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[准备centos7docker平台stress命令（模拟CPU负载）用到docker参数--cpu-period（周期），--cpu-quota（配额）单位是微秒；1秒=1000毫秒，1毫秒=1...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>准备</h1><ul><li>centos7</li><li>docker平台</li><li>stress命令（模拟CPU负载）</li><li>用到docker参数--cpu-period（周期），--cpu-quota（配额）单位是微秒；1秒=1000毫秒，1毫秒=1000微秒，1秒=1000000微秒</li></ul><h1>过程</h1><h2>运行容器</h2><p>（限制容器CPU占用比重为500 000/1 000 000=50%；1秒内最多使用0.5秒的CPU；最多不超过一个内核的50%）</p><pre><code>[root@server ~]# docker run -dit --name centos1 --cpu-period=1000000 --cpu-quota=500000 192.168.200.104:5000/centos/stress:latest bash
59c89af717d4606f4a9ec3843ad7fe4d72a81ab81bc299095eab07627aae3952</code></pre><h2>压力测试(尽量超载)：</h2><p>进入到容器中模拟负载，负载量为400%（1个内核=100%）：</p><pre><code>[root@server ~]# docker exec -it centos1 bash
[root@59c89af717d4 /]# stress -c 4 
stress: info: [29] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd</code></pre><p>同时查看该容器的CPU资源占用：</p><pre><code>[root@server ~]# docker stats centos1
CONTAINER           CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
centos1             50.07%              968 KiB / 3.86 GiB   0.02%               648 B / 648 B       5.895 MB / 0 B      0</code></pre><p>CPU使用率为50.07%，说明限制生效了。</p><h1>测试</h1><p>也可以设置上限为2个内核（200%）</p><pre><code>[root@server ~]# docker run -dit --name centos1 --cpu-period=1000000 --cpu-quota=2000000 192.168.200.104:5000/centos/stress:latest bash 
64428831a83319325d685c762e75306e5a45a75eeaa01979eeede758b5f68e65
root@server ~]# docexec -it centos1 bash
[root@64428831a833 /]# stress -c 4
stress: info: [28] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
[root@server ~]# docker stats centos1
CONTAINER           CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
centos1             201.48%             968 KiB / 3.86 GiB   0.02%               648 B / 648 B       5.886 MB / 0 B      0</code></pre><p>本机有四个内核，设置上限为2000%（20个内核）：</p><pre><code>[root@server ~]# docker run -dit --name centos1 --cpu-period=1000000 --cpu-quota=20000000 192.168.200.104:5000/centos/stress:latest bash
4ac343f7b5e8a87118e10821b0a252013aeb08e9cbfed86cd2a691b699464d19
[root@server ~]# docker exec -it centos1 bash
[root@4ac343f7b5e8 /]# stress -c 10
stress: info: [35] dispatching hogs: 10 cpu, 0 io, 0 vm, 0 hdd
[root@server ~]# docker stats centos1
CONTAINER           CPU %               MEM USAGE / LIMIT      MEM %               NET I/O             BLOCK I/O           PIDS
centos1             417.47%             1.098 MiB / 3.86 GiB   0.03%               648 B / 648 B       5.878 MB / 0 B      0</code></pre><h1>总结</h1><p>容器的CPU配额是通过period和quota之间的大小比重来确定内核的数量，而且是以时间为单位。</p><p>例如：1秒内可以使用0.5秒的CPU，等同于可以使用一个内核的50%；1秒内可以使用2秒的CPU，则是两个内核。</p><p>限制内核数为quota/period=n。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/26/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>Install Kata Containers on CentOS</title>
<link>https://dwt.life/archives/7/</link>
<guid>https://dwt.life/archives/7/</guid>
<pubDate>Tue, 29 Jun 2021 01:57:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[yum install wget -ysudo -E dnf install -y centos-release-advanced-virtualizationsudo -E dnf modul...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<pre><code>yum install wget -y
sudo -E dnf install -y centos-release-advanced-virtualization
sudo -E dnf module disable -y virt:rhel
source /etc/os-release
echo &quot;[kata-containers]
name=Kata Containers
baseurl=http://mirrors.aliyun.com/\$contentdir/\$releasever/virt/\$basearch/kata-containers
enabled=1
gpgcheck=1
skip_if_unavailable=1
&quot; &gt; /etc/yum.repos.d/kata-containers.repo
sudo -E dnf install -y kata-containers</code></pre><pre><code>yum install yum-utils -y
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum -y install docker-ce</code></pre><pre><code>mkdir -p /etc/systemd/system/docker.service.d/
cat &lt;&lt;EOF | sudo tee /etc/systemd/system/docker.service.d/kata-containers.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -D --add-runtime kata-runtime=/usr/bin/kata-runtime --default-runtime=kata-runtime
EOF
sudo mkdir -p /etc/docker</code></pre><p>将以下定义添加到/etc/docker/daemon.json：</p><pre><code>{
  &quot;default-runtime&quot;: &quot;kata-runtime&quot;,
  &quot;runtimes&quot;: {
    &quot;kata-runtime&quot;: {
      &quot;path&quot;: &quot;/usr/bin/kata-runtime&quot;
    }
  }
}</code></pre><p>使用以下命令重新启动Docker systemd服务：</p><p><code>sudo systemctl daemon-reload</code><br><code>sudo systemctl restart docker</code><br><strong>测试</strong><br>运行Kata Containers<br><code>sudo docker run busybox uname -a</code><br>此时命令显示了在容器内运行的内核版本的详细信息，这应与主机的内核版本不同。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/7/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>docker for windows 容器和宿主机 ip互通</title>
<link>https://dwt.life/archives/6/</link>
<guid>https://dwt.life/archives/6/</guid>
<pubDate>Mon, 28 Jun 2021 21:27:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用。一般过程是：1、Docker进程通过监听宿主机的某个端口，将该端口的数据包发送给Docker...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用。一般过程是：</p><p>1、Docker进程通过监听宿主机的某个端口，将该端口的数据包发送给Docker容器</p><p>2、宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口</p><p>但在实际使用中并不是很方便。</p><p>以下在win10环境中队DockerDocker容器通过独立IP暴露给局域网的方法进行记录。</p><p>Docker的默认启动方式中，会产生一块虚拟网卡，然后容器内自行分配单独的网卡和IP。可以在宿主机上通过ipconfig命令看到这个虚拟网卡。</p><p><img src="https://pic.8oh.com.cn/cos/2021/06/28/5c9df25880138_1624886748.png" alt="1624886746375.png" title="1624886746375.png"></p><p>打开一个容器，可以看到容器ip地址为自动分配的。<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/3d88ea8cdd6ed_1624886765.png" alt="1624886764298.png" title="1624886764298.png"><br>此时通过Windows宿主机是无法Ping通容器的<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/3d88ea8cdd6ed_1624886765.png" alt="1624886764298.png" title="1624886764298.png"><br>通过配置路由表实现ip互通<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/d6d8a62b634b7_1624886789.png" alt="1624886787846.png" title="1624886787846.png"><br>暴露给宿主机的为10.0.75.1</p><p>添加路由</p><p><code>route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2</code><br><img src="https://dwt.life/wp-content/uploads/2021/06/2021.png" alt="1624887238623.png" title="1624887238623.png"><br>重新ping容器地址，此时就可以Ping通了<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/9f17418e5c137_1624886839.png" alt="1624886838069.png" title="1624886838069.png"><br>现在则可以直接通过ip访问。</p><p>由于docker默认采用bridge网络，每次容器启动时自动分配ip，我们可以创建自己的网络bridge1，在创建容器时指定ip，如需独立ip访问则另外增加路由。</p><p>如</p><p><code>route -p add 172.18.12.0 MASK 255.255.255.0 10.0.75.2</code></p><p>如果删除路由：</p><p><code>route delete 172.18.12.0</code></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/6/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>Docker容器时间与宿主机同步</title>
<link>https://dwt.life/archives/5/</link>
<guid>https://dwt.life/archives/5/</guid>
<pubDate>Mon, 28 Jun 2021 21:17:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[问题描述：在我们平时使用docker，运行我们的应用的时候，访问应用页面的时间与现在相差8个小时无法结合时间点去判断当时服务的异常同样，当我们在docker上运行某些服务时，需要时间与宿主机同步...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>问题描述：<br>在我们平时使用docker，运行我们的应用的时候，访问应用页面的时间与现在相差8个小时</p><p>无法结合时间点去判断当时服务的异常</p><p>同样，当我们在docker上运行某些服务时，需要时间与宿主机同步，否则会发生异常</p><p>原因:<br>宿主机设置了时区，而Docker容器并没有设置，导致两者相差8小时</p><p>解决办法：<br>为了保证容器和宿主机之间的时间同步：</p><p>可以使用以下几种办法：</p><p>1.Docker run</p><p>使用docker run运行容器时，添加如下参数</p><p><code>-v /etc/localtime:/etc/localtime:ro</code><br>验证:</p><pre><code>[root@uat-app01 ~]# date   #当前宿主机时间
Tue Jul 10 11:18:41 CST 2018
[root@uat-app01 ~]# docker run -it -v /etc/localtime:/etc/localtime:ro centos  #运行docker，添加我们的参数
[root@df22a5da9c77 /]# date    #当前容器时间
Tue Jul 10 11:18:47 CST 2018</code></pre><p>2.DockerFile</p><p>在Docker File中添加如下参数：</p><p>将时区配置添加到环境变量，并使用软连接，并将时区配置文件覆盖</p><pre><code>ENV TimeZone=Asia/Shanghai   
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime &amp;&amp; echo $TimeZone &gt; /etc/timezone   </code></pre><p>实例DockerFile如下：</p><pre><code>FROM centos   # Centos 基础镜像
MAINTAINER louisvv&lt;648555416@qq.com&gt;
ENV TimeZone=Asia/Shanghai    #添加时区环境变量，亚洲，上海
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime &amp;&amp; echo $TimeZone &gt; /etc/timezone   #使用软连接，并且将时区配置覆盖/etc/timezone</code></pre><p>构建镜像</p><p><code>docker build -t centos:time .</code><br>验证：</p><pre><code>[root@uat-app01 ~]# date   #当前宿主机时间
Tue Jul 10 11:08:39 CST 2018
[root@uat-app01 ~]# docker run -it centos:time /bin/bash  #启动刚构建的 centos:time 镜像
[root@f35e963f9e8b /]# date  #容器时间
Tue Jul 10 11:08:44 CST 2018</code></pre><p>正在运行的容器，时间如何同步？</p><p>有些同学看到这里，不禁会问，如果是一个正在运行的docker容器，如何同步时间呢？</p><p>这种方式同样适用于，构造镜像完成后，时间不同步的状况</p><p>在宿主机执行命令如下：<br><code>docker cp -L /usr/share/zoneinfo/Asia/Shanghai  【容器名】:/etc/localtime</code><br>验证：</p><p>当前宿主机时间如下：</p><pre><code>[root@uat-app01 ~]# date
Tue Jul 10 11:27:01 CST 2018</code></pre><p>启动一个docker容器</p><pre><code>[root@uat-app01 ~]# docker run -itd  centos
fe51fba60df5c2425991aab0922c7318d2c3cf2c27b817632765ed24e7486ce6</code></pre><p>进入该容器查看时间，发现与现在相差8个小时，退出exec</p><pre><code>[root@uat-app01 ~]# docker exec -it fe51 /bin/bash
[root@fe51fba60df5 /]# date
Tue Jul 10 03:27:11 UTC 2018
[root@fe51fba60df5 /]# exit
exit</code></pre><p>在宿主机，执行我们提供的命令，将容器名改为对应的即可<br><code>[root@uat-app01 ~]# docker cp -L /usr/share/zoneinfo/Asia/Shanghai  fe51:/etc/localtime</code><br>再次进入容器查看时间，发现时间同步过来了</p><pre><code>[root@uat-app01 ~]# docker exec -it fe51 /bin/bash
[root@fe51fba60df5 /]# date
Tue Jul 10 11:27:17 CST 2018</code></pre><p>参考<a href="http://www.louisvv.com/archives/1716.html"><a href="http://www.louisvv.com/archives/1716.html">http://www.louisvv.com/archives/1716.html</a></a></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/5/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>docker多节点跨网段互通</title>
<link>https://dwt.life/archives/4/</link>
<guid>https://dwt.life/archives/4/</guid>
<pubDate>Mon, 28 Jun 2021 21:12:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[安装Docker在能访问公网且DNS正常的情况下，将下面的代码，直接复制并在docker-host-01,docker-host-02上执行，即可完成Docker安装。#卸载原有docker环境...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>安装Docker</h1><p>在能访问公网且DNS正常的情况下，将下面的代码，直接复制并在docker-host-01,docker-host-02上执行，即可完成Docker安装。</p><pre><code>#卸载原有docker环境及依赖，并安装必要的包 
yum remove docker-latest-logrotate docker-logrotate docker-selinux docker-engine 
yum install -y yum-utils   device-mapper-persistent-data   lvm2 
 
#使用阿里云安装源 
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
rpm --import http://mirrors.aliyun.com/docker-ce/linux/centos/gpg 
yum makecache fast 
yum -y install docker-ce 
 
#安装完成启动Docker 
systemctl start docker 
systemctl enable docker 
systemctl status docker </code></pre><p>下载演示镜像<br>Docker官方在<a href="https://hub.docker.com/"><a href="https://hub.docker.com/">https://hub.docker.com/</a></a>中提供了很多镜像，你可以根据自己的需要选择并下载，也可以自行安装Docker镜像仓库，此处我就直接下载使用docker hub中提供的centos官方镜像进行后续演示;<br><code>[root@docker-host-01 ~]# docker pull centos</code></p><p>镜像在两台Docker主机中都下载，当然如果网速慢的话，可以下载一个，然后使用docker save 打包镜像，将镜像传到第二台机器上，在用docker load导入镜像。方法很多，适合你的才是最好的。</p><p>镜像下载完成，使用docker images命令查看。</p><pre><code>[root@docker-host-01 ~]# docker images 
REPOSITORY         TAG                 IMAGE ID           CREATED             SIZE 
centos             latest             470671670cac        3 days ago         237MB </code></pre><p>通过直接路由方式实现跨主机Docker容器通信<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/61cab1e5092d6_1624885643.png" alt="1624885641091.png" title="1624885641091.png"></p><p>直接路由这种方式操作起来比较简单，对Docker原生网络改变最小，只需要互相指定对方的路由即可完成跨主机Docker容器之间的互通;</p><p>主机配置及IP信息</p><p>基础环境需要准备两台主机，系统可以是CentOS，Ubuntu;需要能支持安装Docker，本实战文档中使用的主机信息如下;</p><p>主机名IP配置容器网段</p><p>主机名 IP  配置  容器网段 <br>docker-host-01  192.168.61.132  2核4G内存，50G硬盘    172.16.200.0/24 <br>docker-host-02  192.168.61.135  2核4G内存，50G硬盘    172.16.201.0/24 <br>调整Docker网络配置</p><p>Docker安装完之后，默认会创建一个docker0的网桥，启动的Docker容器网段是172.17.0.1/16，如果不做调整，两台Docker主机上的容器，就可能出现IP地址冲突，所以我们先将默认docker0网桥的地址按【主机配置及IP信息】中规划的进行调整。</p><p>在docker-host-01中创建/etc/docker/daemon.json文件，内容如下</p><pre><code>[root@docker-host-01 ~]# cat /etc/docker/daemon.json 
{ 
 &quot;bip&quot;: &quot;172.16.200.1/24&quot; 
} </code></pre><p>重启docker服务<br><code>[root@docker-host-01 ~]# systemctl restart docker</code><br>完成重启后，再看docker0的IP，已经调整完成了;</p><pre><code>[root@docker-host-01 ~]# ifconfig docker0 
docker0: flags=4099&lt;UP,BROADCAST,MULTICAST&gt; mtu 1500 
      inet 172.16.200.1 netmask 255.255.255.0 broadcast 172.16.200.255 
      inet6 fe80::42:b3ff:fef9:1cc1 prefixlen 64 scopeid 0x20&lt;link&gt; 
      ether 02:42:b3:f9:1c:c1 txqueuelen 0 (Ethernet) 
      RX packets 2916 bytes 121276 (118.4 KiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 3115 bytes 10870567 (10.3 MiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 </code></pre><p>使用同样的方法，调整docker-host-02主机上的的docker网络。</p><p>创建并进入Docker容器</p><p>在docker-host-01中执行下面命令创建容器并查看IP和网关信息。</p><pre><code>[root@docker-host-01 ~]# docker run --name host-01-docker -it centos /bin/bash 
[root@6cb01044fda8 /]# yum install -y net-tools #安装工具查看ip和网关 
[root@6cb01044fda8 /]# ifconfig eth0 
eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 
      inet 172.16.200.2 netmask 255.255.255.0 broadcast 172.16.200.255 
      ether 02:42:ac:10:c8:02 txqueuelen 0 (Ethernet) 
      RX packets 3168 bytes 10876332 (10.3 MiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 2970 bytes 165058 (161.1 KiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 
[root@6cb01044fda8 /]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         172.16.200.1    0.0.0.0         UG    0      0        0 eth0 
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0 </code></pre><p>如上，创建了一个名为host-01-docker 的容器，容器的ip是172.16.200.2/24，网关是172.16.200.1;同理在docker-host-02中也执行上述命令;</p><pre><code>[root@docker-host-02 ~]# docker run --name host-02-docker -it centos /bin/bash 
[root@f52ed4088844 /]# yum install -y net-tools 
[root@f52ed4088844 /]# ifconfig eth0 
eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 
      inet 172.16.201.2 netmask 255.255.255.0 broadcast 172.16.201.255 
      ether 02:42:ac:10:c9:02 txqueuelen 0 (Ethernet) 
      RX packets 3436 bytes 10890638 (10.3 MiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 3159 bytes 175122 (171.0 KiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 
 
[root@f52ed4088844 /]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         172.16.201.1    0.0.0.0         UG    0      0        0 eth0 
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0 </code></pre><p>host-02-docker容器的ip是172.16.201.2/24，网关是172.16.201.1;此时我们直接在host-01-docker容器里面去ping host-02-docker容器的IP 172.16.201.2 肯定是不通的。<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/566db0e7f0f34_1624885841.png" alt="1624885839827.png" title="1624885839827.png"><br>添加互通路由</p><p>原理非常简单，就是通过互相指定到达对方容器的路由;</p><p>在docker-host-01主机添加到172.16.201.0/24网段的路由，指向docker-host-02的IP:192.168.61.135; <br>在docker-host-02主机添加到172.16.200.0/24网段的路由，指向docker-host-01的IP:192.168.61.132; </p><p>docker-host-01主机上的操作如下</p><pre><code>[root@docker-host-01 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 
[root@docker-host-01 ~]# route add -net 172.16.201.0/24 gw 192.168.61.135 
[root@docker-host-01 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
172.16.201.0    192.168.61.135  255.255.255.0   UG    0      0        0 ens33 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 </code></pre><p>docker-host-02主机上的操作如下</p><pre><code>[root@docker-host-02 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 
[root@docker-host-02 ~]# route add -net 172.16.200.0/24 gw 192.168.61.132 
[root@docker-host-02 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.200.0    192.168.61.132  255.255.255.0   UG    0      0        0 ens33 
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 </code></pre><p>验证在docker-host-01主机上的Docker容器中，ping docker-host-02中的Docker容器IP：172.16.201.2<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/bcdfa3b97a936_1624885877.png" alt="1624885876363.png" title="1624885876363.png"><br>最后，需要注意一点，通过路由打通跨主机Docker容器之间的 网络，必须确保Docker宿主机是在相同的网段;</p><p>通过桥接到Docker宿主机网络实现跨主机Docker容器通信<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/b4ed66f56b47e_1624885901.png" alt="1624885900066.png" title="1624885900066.png"></p><p>将Docker容器网络直接桥接到Docker宿主机网络里面，</p><p>容器通信过程中不在需要NAT的转换，优点是性能提升，容器及Docker宿主机IP统一管理;缺点是，容器及Docker宿主机IP统一管理之后带来的IP地址分配变复杂了;下面就来实战一下这种场景。</p><p>主机配置及IP信息</p><p>基础环境需要准备两台主机，系统可以是CentOS，Ubuntu;需要能支持安装Docker，本实战文档中使用的主机信息如下;</p><p>主机名IP配置容器网段</p><p>docker-host-01192.168.61.1322核4G内存，50G硬盘192.168.61.64/27</p><p>docker-host-02192.168.61.1352核4G内存，50G硬盘192.168.61.96/27</p><p>调整Docker宿主机网桥</p><p>默认情况下docker0，是不与物理接口连接了，Docker宿主机的IP地址也是配置在物理接口上的，现在需要把物理接口添加到docker0网桥中，并把IP地址配置到docker0上;具体操作如下</p><p>在docker-host-01上,创建并编辑docker配置文件,bip表示网桥接口的地址，配置为Docker宿主机 IP，fixed-cidr配置的是分配给docker容器的IP地址，这个地方需要注意，每台宿主机上不能重复，否则会IP地址冲突。</p><pre><code>[root@docker-host-01 ~]# cat /etc/docker/daemon.json 
{ 
 
 &quot;bip&quot;: &quot;192.168.61.132/24&quot;, 
 &quot;fixed-cidr&quot;: &quot;192.168.61.64/27&quot;, 
 &quot;default-gateway&quot;: &quot;192.168.61.1&quot; 
} </code></pre><p>重启docker服务,重启完成后，192.168.61.132已经被配置到docker0上了</p><pre><code>[root@docker-host-01 ~]# systemctl restart docker 
[root@docker-host-01 ~]# ifconfig docker0 
docker0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 
      inet 192.168.61.132 netmask 255.255.255.0 broadcast 192.168.61.255 
      inet6 fe80::42:b3ff:fef9:1cc1 prefixlen 64 scopeid 0x20&lt;link&gt; 
      ether 02:42:b3:f9:1c:c1 txqueuelen 0 (Ethernet) 
      RX packets 6420 bytes 308080 (300.8 KiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 6373 bytes 21761327 (20.7 MiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 </code></pre><p>将物理接口添加到docker0网桥中，同时清空物理网卡上的IP ,注意必须两条命令一起执行，否则会断网。</p><p><code>[root@docker-host-01 ~]# brctl addif docker0 ens33&amp;&amp;ifconfig ens33 0.0.0.0</code></p><p>注意：网桥配置，如果需要永久保存，需要通过配置文件的方式配置</p><p>检查网桥信息</p><pre><code>[root@docker-host-01 ~]# brctl show 
bridge name     bridge id               STP enabled     interfaces 
docker0         8000.0242b3f91cc1       no             ens33 </code></pre><p>创建并进入Docker容器</p><p>在docker-host-01中创建容器并查看容器ip是192.168.61.64</p><pre><code>[root@docker-host-01 ~]# docker run -it centos /bin/bash 
[root@811f01405906 /]# ip a 
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  inet 127.0.0.1/8 scope host lo 
      valid_lft forever preferred_lft forever 
12: eth0@if13: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP group default 
  link/ether 02:42:c0:a8:3d:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0 
  inet 192.168.61.64/24 brd 192.168.61.255 scope global eth0 
      valid_lft forever preferred_lft forever</code></pre><p>在docker-host-02中创建容器并查看容器ip是192.168.61.96</p><pre><code>[root@docker-host-02 ~]# docker run -it centos /bin/bash 
[root@7940a9efcf6a /]# ip a 
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  inet 127.0.0.1/8 scope host lo 
      valid_lft forever preferred_lft forever 
4: eth0@if5: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP group default 
  link/ether 02:42:c0:a8:3d:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0 
  inet 192.168.61.96/24 brd 192.168.61.255 scope global eth0 
      valid_lft forever preferred_lft forever </code></pre><p>验证在docker-node-01宿主机的容器中ping docker-node-02宿主机上的容器IP 192.168.61.96，可以ping通验证没问题。<br><img src="https://pic.8oh.com.cn/cos/2021/06/28/ece12d1dde54f_1624885947.png" alt="1624885946267.png" title="1624885946267.png"></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/4/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
<item>
<title>docker设置容器固定ip</title>
<link>https://dwt.life/archives/3/</link>
<guid>https://dwt.life/archives/3/</guid>
<pubDate>Mon, 28 Jun 2021 21:00:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[docker安装后，默认会创建三种网络类型，bridge、host和none，可通过如下命令查看sudo docker network lsbridge:网络桥接默认情况下启动、创建容器都是用该...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>docker安装后，默认会创建三种网络类型，bridge、host和none，可通过如下命令查看<br><code>sudo docker network ls</code><br>bridge:网络桥接<br>默认情况下启动、创建容器都是用该模式，所以每次docker容器重启时会按照顺序获取对应ip地址，这就导致容器每次重启，ip都发生变化<br>none：无指定网络<br>启动容器时，可以通过–network=none,docker容器不会分配局域网ip<br>host：主机网络<br>docker容器的网络会附属在主机上，两者是互通的。<br>创建固定ip容器<br>1、创建自定义网络类型，并且指定网段<br><code>sudo docker network create --subnet=192.168.0.0/16 staticnet</code><br>通过docker network ls可以查看到网络类型中多了一个staticnet</p><p>2、使用新的网络类型创建并启动容器<br><code>sudo docker run -it --name userserver --net staticnet --ip 192.168.0.2 ubuntu /bin/bash</code><br>通过docker inspect可以查看容器ip为192.168.0.2，关闭容器并重启，发现容器ip并未发生改变</p><p><em>如果需要设置容器请求出去的IP，使用IPtables</em><br><code>iptables -t nat -l POSTROUTING -o eth0 -d 0.0.0.0/0 -s 172.18.0.10 -j SNAT --to-source 103.213.245.111</code></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/3/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/docker/</wfw:commentRss>
</item>
</channel>
</rss>