Day 05 Docker网络详解
注意:云服务器默认只暴露80端口,所以我们如果要通过外网访问,只能映射到80端口
理解Docker0
清理所有镜像
docker rmi -f $(docker images -aq)
二、三个网络
2.1 简介
docker 中默认有三种网络模式我们可以通过docker network ls
看到他们
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
通的
问题: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通
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
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镜像
四、验证
启动自定义镜像
docker run -d -p8080:8000 python:v1
启动并指定端口映射
如果启动后终止,可以去docker logs [容器id|名称]
中查看报错信息
内网访问成功!
外网访问django中的settings.py 修改ALLOW_HOST = ["*"]
并且端口映射为80
五、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
可以测试下