文档章节

docker学习笔记(四):docker网络模式及桥接配置

芬野de博客
 芬野de博客
发布于 03/17 10:53
字数 1744
阅读 33
收藏 1

1docker网络模式:有如下五种:

 host模式(--net=host)            container模式                  none模式(--net=none)                   bridge模式(--net=bridge)

host模式:  需要使用docker run是指定: --net=host     使用的网络实际上和宿主机是一样,在容器内的IP和宿主机的IP是一样,类似于vmare桥接模式

container模式:使用  --net=container:container_id/container_name,多个容器使用共同的网络,看到的IP是一样的;

none模式:  --net=none    这种模式下,不会配置任何网络;

bridge模式--net=bridge,不指定是默认也是这种模式,这种模式会为每个容器分配一个独立的network 网卡,同一个宿主机是在同一个网段下可以通信的,类似于 VMware 的 NAT模式

2docker网络及从外部访问容器:  创建了容器之后,并在容器部署了httpd web服务,容器会有一个私网地址172.17.0.2,那么也只能容器内部访问网站,如果要是想让别的主机或者外网可以访问这个web 网站,那要怎么做呢;

首先新建一个容器,然后在该容器内安装 httpd 服务,并启动;

docker   run  -itd   fenye                     yum    install   -y    epel-relase   nginx                 service   httpd     start  

然后把该容器导出一个新的镜像(centos-httpd),然后在使用新镜像创建容器,并指定端口映射(把容器的80端口映射为本地的5123端口

把fenye 容器导出成镜像:        -m   " "  后面跟加一些改动信息               -a  " "  后面 加的是改动作者      04d7ac77f4ff  表示容器  ID

docker   commit -m "install nginx" -a "yuanhh" 04d7ac77f4ff fenye_nginx

创建容器并指定端口映射:      docker  run   -itd  -p  8088:80    fenye  bash

[root@localhost_001 ~]# docker run -itd fenye            #启动容器fenye
04d7ac77f4ff58975ba13240d17a1aa5970a48d91557c1f33781a96baa5679d3
[root@localhost_001 ~]# docker exec -it 04d7ac bash       #进入这个容器
[root@04d7ac77f4ff /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
[root@04d7ac77f4ff /]# yum install -y epel-release          #安装nginx 需要安装epel-release 源
[root@04d7ac77f4ff /]# yum install -y nginx                 #安装nginx
[root@04d7ac77f4ff /]# exit
exit
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
04d7ac77f4ff        fenye               "/bin/bash"         16 minutes ago      Up 16 minutes                           sad_hertz
#把上面的容器导出成镜像;
[root@localhost_001 ~]# docker commit -m "install nginx" -a "yuanhh" 04d7ac77f4ff fenye_nginx
sha256:9c7fa78302808c35f9d626efdd83c9611a5cfeb58edf33555f5683171bd89e6f
[root@localhost_001 ~]# docker images          #查看导出的镜像
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
fenye_nginx                    latest              9c7fa7830280        9 seconds ago       374MB
fenye                          latest              74b0dfcaacff        40 seconds ago      374MB
创建容器并指定端口映射;
[root@localhost_001 ~]# docker run -itd -p 8088:80 fenye_nginx bash
fc715c72a385e62ac6e81fb30b1f4241dc43883b34affef075555d73aac177b0
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
fc715c72a385        fenye_nginx         "bash"              7 seconds ago       Up 2 seconds        0.0.0.0:8088->80/tcp   wizardly_newton
04d7ac77f4ff        1e1148e4cc2c        "/bin/bash"         24 minutes ago      Up 24 minutes                              sad_hertz

进入使用 fenye_nginx 镜像创建的容器,然后启动 nginx 服务,然后在另一台机器测试;

首先启动nginx时报权限错误Operation not permitted           在这是因为dbus-daemon没有启动,解决该问题可以如下方式:

启动容器时加上:     --privileged -e "container=docker"            最后的命令改为  /usr/sbin/init 

docker run -itd --privileged -e "container=docker" -p 8080:80 fenye_nginx /usr/sbin/init

[root@localhost_001 ~]#  docker run -itd --privileged -e "container=docker" -p 8080:80 fenye_nginx /usr/sbin/init            #启动
50b1c284aee984ebcc5a06a507883503d48d60beea84a5f0d8719419f84b4b68
[root@localhost_001 ~]# docker exec -it 50b1c2 bash     #进入这个fenye容器;
[root@50b1c284aee9 /]# systemctl start nginx       #启动nginx
[root@50b1c284aee9 /]# ps aux |grep nginx          #查看启动的服务
root       3171  0.0  0.2 125004  2112 ?        Ss   10:23   0:00 nginx: master process /usr/sbin/nginx
nginx      3172  0.0  0.3 125392  3140 ?        S    10:23   0:00 nginx: worker process
root       3174  0.0  0.0   9088   672 pts/1    S+   10:23   0:00 grep --color=auto nginx

注释:一个镜像可以用来启动很多个容器;

在本地访问 curl localhost:8080 端口即可以访问到容器的 nginx的服务; 然后其他机器也可以访问的;  curl   192.168.149.129:8080

[root@localhost_001 ~]# curl localhost:8080
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>Test Page for the Nginx HTTP Server on Fedora</title>

2、docker 网络管理--配置桥接网络    需要 pipwork  的支持;

为了使本地网络中的其他机器和docker容器通信,经常会将docker容器配置成和宿主机在同一个网段,也就是说,我们只需要将docker容器和宿主机的网卡桥接起来,在给docker容器配置IP就可以了;

宿主机操作:复制网卡ifcfg-eth0  到  ifcfg-br0

vim  ifcfg-br0     修改DEVICE=br0   Type=Bridge     把 IPADDR   NETMASK  GATEWAY设置到这里;

vim   ifcfg-eth0     添加  BRIDGE=br0   删除掉 IPADDR  NETMASK   GATEWAY;

[root@localhost_001 network-scripts]# cp ifcfg-eth0 ifcfg-br0
[root@localhost_001 network-scripts]# cat ifcfg-br0 
TYPE=Bridge
BOOTPROTO=none
DEFROUTE=yes
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.149.129
NETMASK=255.255.255.0
GATEWAY=192.168.149.2
[root@localhost_001 network-scripts]# cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
DEVICE=eth0
ONBOOT=yes
#IPADDR=192.168.149.129
#NETMASK=255.255.255.0
#GATEWAY=192.168.149.2
BRIDGE=br0
[root@localhost_001 network-scripts]# systemctl restart network    #重启网卡后
[root@localhost_001 network-scripts]# ifconfig          #查看IP地址
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.149.129  netmask 255.255.255.0  broadcast 192.168.149.255

3、如果要使用桥接网络需要 pipework 支持把两个网卡接到一起; git clone https://github.com/jpetazzo/pipework

[root@localhost_001 ~]# git clone https://github.com/jpetazzo/pipework
正克隆到 'pipework'...
remote: Total 501 (delta 0), reused 0 (delta 0), pack-reused 501
接收对象中: 100% (501/501), 172.97 KiB | 91.00 KiB/s, done.
处理 delta 中: 100% (264/264), done.
[root@localhost_001 ~]# cp pipework/pipework /usr/local/bin/   #加入到绝对路径下

4、开启一个容器设置网络模式为none并进入容器:                 docker run -itd --net=none centos6 bash

[root@localhost_001 ~]# docker run -itd --net=none centos6 bash      #开启一个容器;
93cc393823bddf8b293177ead78bc9015e84670b5c66b7d282cb18268124cd2d
[root@localhost_001 ~]# docker exec -it 93cc393 bash                 #进入这个容器:
[root@93cc393823bd /]# ifconfig                                      #发现没有IP地址;
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
[root@93cc393823bd /]# exit
exit

5、使用 pipework 为容器绑定IP地址;         136为容器的IP                      @后面为容器的网关地址

pipework   br0   93cc393   192.168.149.136/24@192.168.149.2

[root@localhost_001 ~]# pipework br0 93cc393 192.168.149.136/24@192.168.149.2   #绑定网卡
[root@localhost_001 ~]# docker exec -it 93cc393 bash       #进入这个容器
[root@93cc393823bd /]# ifconfig                      #查看IP地址
eth1      Link encap:Ethernet  HWaddr E6:83:67:A5:7B:CB  
          inet addr:192.168.149.136  Bcast:192.168.149.255  Mask:255.255.255.0
[root@93cc393823bd /]# ping www.baidu.com            #外网也可达
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121: icmp_seq=1 ttl=128 time=13.4 ms

用另一台主机ping容器IP 192.168.149.136 也是可以通的;

[root@localhost_002 ~]# ping 192.168.149.136
PING 192.168.149.136 (192.168.149.136) 56(84) bytes of data.
64 bytes from 192.168.149.136: icmp_seq=1 ttl=64 time=0.851 ms
64 bytes from 192.168.149.136: icmp_seq=2 ttl=64 time=0.513 ms
64 bytes from 192.168.149.136: icmp_seq=3 ttl=64 time=0.619 ms
^C
--- 192.168.149.136 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2020ms
rtt min/avg/max/mdev = 0.513/0.661/0.851/0.141 ms

注释:这里所使用的桥接和 docker 里面的桥接模式是不一样的,docker里面的桥接相当于 VMware 的 NAT 模式;

而这个桥接是和宿主机是一个网段的;可以相互通信;

如果在当前主机里还需要做多个桥接的:比如当前宿主机还有多块网卡,然后需要做桥接,可以写成 br1  ,这个可以写多个的;

第一块网卡做公网;

第二块网卡做内网;

© 著作权归作者所有

芬野de博客
粉丝 27
博文 191
码字总数 326083
作品 0
海淀
程序员
私信 提问
非常详细的docker学习笔记

本文转自 http://blog.csdn.net/zjin_hua/article/details/52041757#comments 一、Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享、管理 Docker 容器...

高蛋白小虫
2017/09/01
0
0
小白docker入门之Kubernetes的网络知识

目录 docker的网络通信 kubernetes的网络通信 总结 kubernetes集群搭建完成后,使用docker ps命令,可以看到正在跑的容器,其中一个容器名字叫flannel。这个flannel是一个开源的网络组件,了...

OrangeLoveMilan
2017/12/29
0
0
Docker 学习(四)—— 网络配置

操作系统CentOS7.0下docker 网络配置(root用户下操作) Dokcer 通过使用 Linux 桥接提供容器之间的通信,默认会创建一个名为docker0的虚拟网桥,docker0 桥接接口的目的就是方便 Docker 管理...

freelb
2018/09/02
46
0
初学Docker容器网络不得不看的学习笔记

【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践 宜信技术沙龙 将于5月23日晚8点线上直播,点击报名 一、关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0...

宜信技术学院
05/20
789
0
Docker基础之运行Nginx

一、背景 这次折腾docker,第一是因为它很火;第二是因为它的虚拟化可以节省服务器资源;第三就是听说docker在部署方面会很省事省力,所以学习一下docker。 二、目的 记录一下用docker运行N...

RanboSpider
2018/01/12
151
0

没有更多内容

加载失败,请刷新页面

加载更多

Android OkHttp + Retrofit 取消请求的方法

本文链接 前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求。对于OkHttp来说,具体是调用Call的cancel方法。 ...

shzwork
37分钟前
6
0
并发编程之Callable异步,Future模式

Callable 在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或...

codeobj
今天
6
0
Ubuntu环境下安装PaddlePaddle

开篇 深度学习技术是目前非常热门的技术,笔者在闲暇之余决定学习一下这门技术,入门选择了百度开源的PaddlePaddle框架。 paddlepaddle介绍 飞桨(PaddlePaddle) 是国际领先的端到端开源深度学...

豫华商
今天
6
0
LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
今天
6
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部