docker网络
理解docker0
将之前学习的镜像全部删除,查看一下ip,发现基础的网卡有三个,分别如下
[root@izbp1bc82otjd8cslsu9zsz ~]# ip attr
Object "attr" is unknown, try "ip help".
[root@izbp1bc82otjd8cslsu9zsz ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:19:b0:15 brd ff:ff:ff:ff:ff:ff
inet 172.26.24.2/18 brd 172.26.63.255 scope global dynamic eth0 # 阿里云内网地址
valid_lft 314794283sec preferred_lft 314794283sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:cf:90:6f:f8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 # docker0 地址
valid_lft forever preferred_lft forever
这时候我们尝试启动一个tomcat服务器
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -d -P --name tomcat01 tomcat
078664df26cc252f74ff55eb5f855ffe0c0a1025093892330d07e101f0f81874
# 通过
docker inspect 容器名 可以获取容器的详细信息,包括ip
从Linux服务器上ping内部容器,是可以ping的通的
[root@izbp1bc82otjd8cslsu9zsz ~]# 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.134 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.081 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.053 ms
在Linux的网卡中也会多出一个网卡,每启动一个容器就会生成一个网卡
[root@izbp1bc82otjd8cslsu9zsz ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:19:b0:15 brd ff:ff:ff:ff:ff:ff
inet 172.26.24.2/18 brd 172.26.63.255 scope global dynamic eth0
valid_lft 314793055sec preferred_lft 314793055sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:cf:90:6f:f8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
105: vethd69f9f8@if104: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether b2:d0:0e:26:bf:bf brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 我们发现这个容器带来的网卡都是一对一对的
# 桥接模式,使用的技术是evth-pair技术
这时候我们就会想着,两个独立运行的容器,是否能相互ping的通
# 最新版的docker镜像被阉割严重,使用ip addr 命令或者 ping命令需要进入容器安装
apt update && apt install -y iproute2 # 这是ip addr命令
apt -y install iputils-ping # 这是安装ping命令
# 需要注意的是 ping必须ping的是ip地址
[root@izbp1bc82otjd8cslsu9zsz ~]# docker exec -it tomcat01 ping 127.17.0.3
PING 127.17.0.3 (127.17.0.3) 56(84) bytes of data.
64 bytes from 127.17.0.3: icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from 127.17.0.3: icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from 127.17.0.3: icmp_seq=3 ttl=64 time=0.059 ms
画图来理解一下两个不同的容器间是如何交互的
两个不同的容器间是相互隔离的,不能直接交互,需要通过docker0来交互
自定义网络
查看docker网络
[root@izbp1bc82otjd8cslsu9zsz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
616acb3593a0 bridge bridge local
dafcf4fc58c1 host host local
390a55c28643 none null local
# bridge 桥接,docker默认的
# none 不配置网络
# host 与宿主机共享网络
# container 容器网络互通(用的少)
创建docker网络
# 不了解如何创建之前,我们都可以使用help命令
[root@izbp1bc82otjd8cslsu9zsz ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge") # 默认为bridge
--gateway strings IPv4 or IPv6 Gateway for the master subnet # 网关传输到哪
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment # 必须填写网关
接下来我们就自定义一个网络
[root@izbp1bc82otjd8cslsu9zsz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
94fa3626b5c0cca4b4a29ede86fb768f07aeb32666ce9f0899b5ed51dbf7e654
[root@izbp1bc82otjd8cslsu9zsz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
616acb3593a0 bridge bridge local
dafcf4fc58c1 host host local
94fa3626b5c0 mynet bridge local
390a55c28643 none null local
通过这个网络创建两个容器,这时候两个容器是可以直接通过名称ping通的
自定义的网络配置很高,功能很齐全
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -d -P --name tomcat-net01 --net mynet tomcat
6a7dddff6c9c3c2e2ffa1025ca0389434276db466d6f0725f25104007ce899c3
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -d -P --name tomcat-net02 --net mynet tomcat
ba435de77b8957d392a504accd03803e8cac66c5d439ed52b858ee019b071104
[root@izbp1bc82otjd8cslsu9zsz ~]# docker exec -it tomcat-net01 ping tomcat-net02
PING tomcat-net02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.087 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.108 ms
实战演练
说了这么多,docker我们也基本介绍完了,通过现在的所学知识,小黄已经觉得将自己的个人博客部署在阿里云服务器上了,我们来看一下具体操作应该如何
1、将项目打成jar包
只需要执行maven中的package即可
2、编写Dockerfile文件
有了dockerfile文件,我们项目在发送给需求人的时候,就只需要发送jar包和dockerfile文件即可,dockerfile文件可以帮我们构建docker镜像
FROM java:8
MAINTAINER YellowStar <614028802@qq.com>
VOLUME /tmp
ADD YellowStarBlog-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3、构建docker镜像
在构建镜像之前我们需要通过xftp将jar包和dockerfile文件传输到服务器上
# 执行以下命令 千万不要忘记还有一个.哦
docker build -t myblog .
Sending build context to Docker daemon 35.1MB
Step 1/6 : FROM java:8
---> d23bdf5b1b1b
Step 2/6 : MAINTAINER YellowStar <614028802@qq.com>
---> Running in 3a22e98aa4fd
Removing intermediate container 3a22e98aa4fd
---> dfd821cdf795
Step 3/6 : VOLUME /tmp
---> Running in 1e785aa73614
Removing intermediate container 1e785aa73614
---> e69ddea89fbc
Step 4/6 : ADD YellowStarBlog-0.0.1-SNAPSHOT.jar app.jar
---> 036f5347bb08
Step 5/6 : RUN bash -c 'touch /app.jar'
---> Running in 41193ca56ecc
Removing intermediate container 41193ca56ecc
---> 4b1d84751192
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
---> Running in 5363a737ba34
Removing intermediate container 5363a737ba34
---> 9fc5c70cc4d0
Successfully built 9fc5c70cc4d0
4、启动容器
我们在项目中暴露的端口号为8080,这只是容器内部的端口号,映射到宿主机我们设置为8888
注意:需要阿里云服务器打开8888防火墙才可以访问
[root@izbp1bc82otjd8cslsu9zsz idea]# docker run -d -p 8888:8080 --name yellowstarblog myblog
8b613e99d05214fa524d2bafa74e8070723d79cf2db6ccc2338c3df93e18bf32
以上我们的网站就已经部署完成啦!大家可以访问小黄的个人博客 http://121.40.45.37:8888/
过几天小黄的域名备案完成之后,大家可以访问 yellowstar.top 来访问小黄的博客哦
补充
小黄在发布完成之后,发现容器的时间和宿主机的时间不一致,宿主机的时间和北京时间一致,但是容器的时间比这晚8个小时,所以我们还需要进入容器进行以下设置
[root@izbp1bc82otjd8cslsu9zsz /]# docker exec -it 8b613e99d052 /bin/bash
root@8b613e99d052:/# date
Tue Dec 14 09:58:24 UTC 2021
root@8b613e99d052:/# cd /etc/
root@8b613e99d052:/etc# mv localtime localtime_bak
root@8b613e99d052:/etc# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
root@8b613e99d052:/etc# cd /.
root@8b613e99d052:/# date
Tue Dec 14 17:59:59 CST 2021