Day 05 Docker网络详解

Day 05 Docker网络详解

注意:云服务器默认只暴露80端口,所以我们如果要通过外网访问,只能映射到80端口

理解Docker0

清理所有镜像

docker rmi -f $(docker images -aq)

image-20201202205935166

二、三个网络

2.1 简介

docker 中默认有三种网络模式我们可以通过docker network ls看到他们

image-20201203090631655

2.1 创建(删除)网桥

docker network create [网桥名称]

[root@s ~]# docker network create test01
------------------------------------------------------------------------
ce548d0dd9f88ac22d0d943d8f33dde4c2f81c04c4aeea9319cb3e879cc14945

[root@s ~]# docker network ls
------------------------------------------------------------------------
NETWORK ID          NAME                DRIVER              SCOPE
c4197b1203c6        bridge              bridge              local
b24a96f44350        host                host                local
b37725ff8cc6        none                null                local
ce548d0dd9f8        test01              bridge              local

[root@s ~]# docker network rm test01
------------------------------------------------------------------------
test01
[root@s ~]# docker network ls
------------------------------------------------------------------------
NETWORK ID          NAME                DRIVER              SCOPE
c4197b1203c6        bridge              bridge              local
b24a96f44350        host                host                local
b37725ff8cc6        none                null                local

3.docker 测试同一个网桥容器是否互通

3.1 创建网桥
[root@s ~]# docker network create super
------------------------------------------------------------------------
3546c50a8479e3ec04fa008d770fdfabf448614b7b56c3ed417cad533d81fb97
3.2创建多个容器(同一网桥下)
3.2.1redis
[root@s ~]# docker run -d --name redis --network super redis
------------------------------------------------------------------------
6facf44e598df8eee101b288e16b199b1731a39a855406b6b6b99a11532e9ecd
3.2.2mysql:5.7
[root@s ~]# docker run -d --name mysql --network super -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
------------------------------------------------------------------------
41c68da6a684a1c733a31d59aea76af5a9a3e6a15e53834ddf416ff870b77a55
3.2.3nginx
[root@s ~]# docker run -d --name nginx --network super nginx
------------------------------------------------------------------------
77b7198f61eb552be672b318fcbec949a1ab9d300d93b8de9978c0eaa1a1014d
3.2.4centos
[root@s ~]# docker run -dit --name centos01 --network super centos /bin/sh
------------------------------------------------------------------------
7aa33a1ddcbba21e2af259bbf3251667a890be084567e3de565c993fe945b208

image-20201203102451864

通的

问题:docker是如何处理容器网络访问的?

进入容器 查看 ip addr

docker exec -it 容器id
ip addr
# 查看容器内部网络地址 发现容器启动的时候会得到一个 eth0@if551 ip地址,docker分配!

此时的linux是可以ping通容器内部的!容器也是可以ping通外界–二者是互通的

原理

我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker, 就会有一个docker0桥接模式,使用的技术是veth-pair技术!

当我们再次启动一个容器的时候,又会多一对网络

容器带来的网络都是一对对的

veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连 正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的 OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

来测试下两个容器能不能ping通

image-20201202231843375

docker exec -it centos ip addr
------------------------------------------------------------------------
1: lo: <LOOPBACK,UP,LOWER_UP> 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
100: eth0@if101: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
       
docker exec -it b9a558d1c51a ping 172.17.0.2
------------------------------------------------------------------------
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.086 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.055 ms
# 是可以ping通的

由此我们可以得出,centos1和centos2共用一个路由器,也就是docker0

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用 ip。

小结: Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0

image-20201203081410385

Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件) 只要容器删除,对应的网桥一对就没了!

二、-link

$ docker exec -it tomcat02 ping tomca01 # ping不通
ping: tomca01: Name or service not known
# 运行一个tomcat03 --link tomcat02
$ docker run -d -P --name tomcat03 --link tomcat02 tomcat
5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef
# 用tomcat03 ping tomcat02 可以ping通
$ docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms
# 用tomcat02 ping tomcat03 ping不通

三、自定义网络

docker network
connect -- Connect a container to a network
create -- Creates a new network with a name specified by the
disconnect -- Disconnects a container from a network
inspect -- Displays detailed information on a network
ls -- Lists all the networks created by the user
prune -- Remove all unused networks
rm -- Deletes one or more networks

Day 08构建镜像

一、编写指令的文件名称必须时:Dockerfile

vim Dockerfile

二、编写构建镜像的指令

# 依赖镜像
FROM python:3.6.12

# 安装django
RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/

# 添加本地Django文件(Test)到 镜像中的(Test)下
ADD /Test /Test

# 镜像执行 cd命令  并运行
CMD cd /Test && python3 manage.py runserver 0.0.0.0:8000

三、开始构建

docker build -t python:v1 .  # 打开当前目录下的Dockerfield 构建python:v1镜像

image-20201203122250677

四、验证

启动自定义镜像

docker run -d -p8080:8000 python:v1启动并指定端口映射

image-20201203122414814

如果启动后终止,可以去docker logs [容器id|名称]中查看报错信息

内网访问成功!

image-20201203122453307

外网访问django中的settings.py 修改ALLOW_HOST = ["*"]并且端口映射为80

image-20201203142919597

五、nginx代理django

1.构建nginx镜像

# Dockerfile

# 设置基础镜像
FROM centos:7

RUN yum install wget -y

# 换源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

RUN cd /etc/yum.repos.d && wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

RUN mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo

# 创建nginx源的文件
ADD nginx.repo /etc/yum.repos.d/ 

# 刷新yum缓存
RUN yum makecache

# 安装yum工具
RUN yum install yum-utils -y

# 安装Nginx
RUN yum install nginx -y

# 复制配置文件
ADD default.conf /etc/nginx/conf.d/

# 设置启动命令
CMD nginx -g 'daemon off;'
# nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

upstream模块将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。

# default.conf

upstream django {
    server django:8000;  # 此处代理的时 容器名和端口号
}

server {
    listen 80;
    server_name _;
    location / {:
        proxy_pass http://django;  # 与上面对应
        index index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

因为两个文件都是在/home目录下所以我要进入到cd下

cd /home
docker build -t nginx:v1 .  # 小数点代表当前目录

2.构建django镜像

# Dockerfile

依赖镜像
FROM python:3.6

# 安装django
RUN pip3 install django==2.1.7 -i https://pypi.douban.com/simple/

# 创建项目
RUN django-admin startproject test
# 进入到项目下 启动项目
RUN cd test && django-admin startapp app01

# 镜像执行 cd命令  并运行
CMD cd test && python3 manage.py runserver 0.0.0.0:8000
docker build -t python:v1 .  # 小数点代表当前目录

3.启动运行,要在同一个网络下

docker run -d --network oldboy --name django python:v1
------------------------------------------------------------------------
82ae3f1e3d9d4bdc56489205a39cf49912939058707a4ebddae8a7c9a0b8c8b0

docker run -d -p80:80 --network oldboy nginx:v3
------------------------------------------------------------------------
776ce7cd6154ebfbdd4454927013175db1c25fe7e9f97f7a0d0e7b7103dba24e

docker ps
------------------------------------------------------------------------
NTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
776ce7cd6154        nginx:v3            "/bin/sh -c 'nginx -…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   infallible_mestorf
82ae3f1e3d9d        python:v1           "/bin/sh -c 'cd test…"   8 minutes ago       Up 8 minutes                             django

可以测试下

image-20201204111016721

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值