Día 05 Explicación detallada de la red Docker
Nota: El servidor en la nube solo expone el puerto 80 por defecto, por lo que si queremos acceder a través de la red externa, solo podemos mapear al puerto 80
Comprender Docker0
Limpia todos los espejos
docker rmi -f $(docker images -aq)
Dos, tres redes
2.1 Introducción
Hay tres modos de red predeterminados en la ventana acoplable, podemos docker network ls
verlos a través
2.1 Crear (eliminar) puente de red
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.prueba si el mismo contenedor puente es interoperable
3.1 Crear un puente
[root@s ~]# docker network create super
------------------------------------------------------------------------
3546c50a8479e3ec04fa008d770fdfabf448614b7b56c3ed417cad533d81fb97
3.2 Crear varios contenedores (bajo el mismo puente)
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
Mediante
Pregunta: ¿Cómo maneja Docker el acceso a la red de contenedores?
Ingrese al contenedor para ver la dirección IP
docker exec -it 容器id
ip addr
# 查看容器内部网络地址 发现容器启动的时候会得到一个 eth0@if551 ip地址,docker分配!
¡En este momento, Linux puede hacer ping al interior del contenedor! El contenedor también puede hacer ping al mundo exterior; los dos son interoperables
principio
Cada vez que iniciamos un contenedor de la ventana acoplable, la ventana acoplable asignará una ip al contenedor de la ventana acoplable. Siempre que sigamos la ventana acoplable, habrá un modo puente de docker0, ¡la tecnología utilizada es la tecnología de cinco pares!
Cuando volvamos a iniciar un contenedor, habrá una red más
La red que traen los contenedores es uno a uno
veth-pair es un par de interfaces de dispositivos virtuales. Todos aparecen en pares. Un extremo está conectado al protocolo y el otro extremo está conectado entre sí. Debido a esta característica, veth-pair actúa como un puente para conectar OpenStac y Contenedores Docker de varios dispositivos de red virtual. La conexión entre OVS y OVS utiliza tecnología evth-pair
Para probar si se puede hacer ping a los dos contenedores siguientes
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通的
De esto podemos concluir que centos1 y centos2 comparten un enrutador, es decirdocker0
Cuando todos los contenedores no especifican una red, son enrutados por docker0 y docker asignará una IP disponible predeterminada a nuestro contenedor.
Resumen: Docker usa un puente de Linux y el host es un puente de contenedor de Docker docker0
Todas las interfaces de red en Docker son virtuales y la eficiencia de reenvío virtual es alta (archivos de transferencia de intranet). Siempre que se elimine el contenedor, el par de puentes correspondiente desaparecerá.
dos,-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不通
Tres, red personalizada
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
Imagen de construcción del día 08
1. Cuando el nombre del archivo para escribir instrucciones debe ser: Dockerfile
vim Dockerfile
Dos, escribe instrucciones para construir un espejo.
# 依赖镜像
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
Tres, empieza a construir
docker build -t python:v1 . # 打开当前目录下的Dockerfield 构建python:v1镜像
Cuatro, verificación
Iniciar imagen personalizada
docker run -d -p8080:8000 python:v1
Iniciar y especificar la asignación de puertos
Si termina después del inicio, puede ir docker logs [容器id|名称]
a ver el mensaje de error
¡El acceso a la intranet es exitoso!
外网访问django中的settings.py 修改ALLOW_HOST = ["*"]
Y el puerto está mapeado como80
Cinco, proxy nginx django
1. Crea una imagen 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
El módulo nginx
cruzará la limitación de una sola máquina para completar la recepción, procesamiento y reenvío de datos de red.
# 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;
}
}
Debido a que los dos archivos están en el /home
directorio, quiero ingresar al cd
cd /home
docker build -t nginx:v1 . # 小数点代表当前目录
2. Crea una imagen de 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. Empiece a ejecutar, debe estar bajo la misma red
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
Puede ser probado