Docker网络设置

120 阅读3分钟

linux网络

为了支持在linux中网络协议栈能够支持多个实例,提出了一种网络命名空间的概念,不同的网络命名空间是相对隔离的
​
# 实现两个不同的网络名称空间互联的方式
1、veth设备对
    # 查看设备的网络命名空间
    [root@localhost ~]# ip netns ls
    
    # 创建一个新的网络命名空间
    [root@localhost ~]# ip netns add test
    
    # 创建veth设备对:veth和veth01
    [root@localhost ~]# ip link add veth type veth peer name veth01
    [root@localhost ~]# ip a
    26: veth01@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 6a:25:0f:e4:d1:60 brd ff:ff:ff:ff:ff:ff
    27: veth@veth01: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether d6:10:31:f8:1b:b7 brd ff:ff:ff:ff:ff:ff
    
    # 给设备的网络命名空间绑定设备对
    [root@localhost ~]# ip link set veth01 netns test
    
    # 分别给设备对分配ip
    [root@localhost ~]# ip netns exec test ip addr add 10.0.0.110/24 dev veth01
    [root@localhost ~]# ip addr add 10.0.0.111/24 dev veth
    
    # 分别重启设备对
    [root@localhost ~]# ip netns exec test ip link set dev veth01 down
    [root@localhost ~]# ip netns exec test ip link set dev veth01 up
    [root@localhost ~]# ip link set dev veth down
    [root@localhost ~]# ip link set dev veth up
    
    # 测试设备对的连通性
    [root@localhost ~]# ping 10.0.0.111
    
2、网桥
​
3、iptables
​
4、ipvs

docker网络

docker中的网络就是为了实现容器之间的互联
​
1、host模式
# 也就是将容器中的网络直接与宿主机网络进行绑定
[root@localhost ~]# docker run -d --rm --network host --name mynginx1 nginx2、container模式
# 另外创建一个容器,共享其他指定容器的网络
[root@localhost ~]# docker run -d --network "container:mynginx" nginx  # 共享mynginx容器的网络开始一个nginx3、网桥模式
# 创建网桥
[root@localhost ~]# docker network create test1# 使用创建好的网桥创建容器
[root@localhost ~]# docker run -d --network test1 --name mynginx1 nginx4、None模式
[root@localhost ~]# docker run -it --network none centos5link模式类似于container模式
[root@localhost ~]# docker network connect lulu mynginx1
​
​
docker网桥的使用
--subnet :指定字网
--getway: 指定网关
[root@localhost ~]# docker network create hrhr --subnet 10.0.0.1/24 --gateway 10.0.0.2# 创建网桥也可不指定网段和网关地址
[root@localhost ~]# docker network create hrhr --subnet 10.0.0.1/24 --gateway 10.0.0.2
[root@localhost ~]# docker network create lulu# 查看网桥的详细信息
[root@localhost ~]# docker network inspect lulu# 链接网桥
[root@localhost ~]# docker network connect lulu mynginx1# 断开链接网桥
[root@localhost ~]# docker network disconnect lulu mynginx1# 删除网桥
[root@localhost ~]# docker network rm test# 清理网桥
[root@localhost ~]# docker network prune
​
​
# 处于同一网桥下的机器可以相互访问
[root@localhost ~]# docker run -d -it --name mycentos --network lulu centos
[root@localhost ~]# docker -d --network lulu --name nginx1 nginx
[root@localhost ~]# docker inspect nginx1  # 查看在网桥上分配给nginx1容器的ip地址
[root@localhost ~]# docker exec -it mycentos bash  # 进入mycentos的控制终端
[root@ae1771b1befe /]# curl 172.21.0.4   # 访问本网桥下的nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
..........

小案例:

# 1、创建网桥
[root@localhost ~]# docker network create lulu# 创建一个python环境容器
[root@localhost linux]# docker run -d -it python:3.6 bash
# 进入容器安装django
[root@localhost linux]# docker exec -it objective_villani bash
root@1a00305f6ee4:/# pip3 install django# 保存容器为本地镜像并打上tag
[root@localhost linux]# docker commit objective_villani python:django
[root@localhost linux]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
python       django    d6b24ccb2fce   13 seconds ago   943MB
​
# 运行此容器
[root@localhost linux]# docker run -d -v /root/linux/:/opt/ -w /opt --network lulu python:django python manage.py runserver 0.0.0.0:8000# 创建关联的nginx配置文件并创建运行nginx的容器
upstream django{
        server 172.21.0.2:8000;
        }
server {
        server_name _;
        listen 80;
        location / {
                proxy_pass http://django;
        }
}
[root@localhost ~]# docker run -d -v /root/django.conf:/etc/nginx/conf.d/default.conf --network lulu --name nginxme -p 8000:80 nginx