docker
1、什么是容器,什么是docker?
容器的本质是进程
docker是一款容器软件。
2、docker中的三大概念?
docker镜像
docker容器
镜像仓库
3、docker镜像
docker镜像是启动容器模板。
docker pull
docker push
docker images
docker inspect
docker rmi
docker histroy
docker tag
4、docker容器
是镜像启动的,一个对外提供服务的实例。
docker run
-d
--name :
1、指定容器名称
2、将容器的名称加入docker DNS 可以访问时候直接写容器名
--rm
-e
-h
-i
-t
-p
-P
-v
docker exec
docker ps
-a
-q
docker rm
-f
docker start : 启动一个容器
docker stop :停止一个容器
docker create :创建一个容器
docker run 和 docker create 之间有两个区别
1、docker run创建容器并立即启动,而docker create 只是创建
2、docker run创建的容器时up状态,而docker create创建的容器是create
打包镜像
1、将容器打包成本地镜像
docker commit
2、将容器打包成镜像压缩包
docker export
docker import
3、将镜像打包成镜像压缩包
docker save
docker load
5、镜像仓库
存放镜像的地方。
官方仓库:hub.docker.com
第三方:阿里云、华为云
docker login [URL]
docker login registry.cn-hangzhou.aliyuncs.com
1、Linux网络原理
docker网络严重依赖于linux网络
容器之间相互隔离
为了支持网络协议栈的多实例,linux提供了一个网络名称空间(Network Namespace)。不同的网络名称完全隔离。
容器之间的网络互通问题?
实现两个不同的网络名称空间互联的方式
1、veth设备对
veth设备必须是成对出现。
1、创建名称空间
[root@localhost ~]
2、创建veth设备对
[root@localhost ~]
3、绑定名称空间
[root@localhost ~]
3.1进入名称空间
[root@localhost ~]
4、分配IP
[root@localhost ~]
[root@localhost ~]
5、重启
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
6、测试
[root@localhost ~]
2、网桥
Linux可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址的信息,和自己记录的MAC表结合,来决定报文的转发目标网口。
网桥设备br0绑定了eth0、eth1。对于网络协议的上层来说,只看得到br0。因为桥接是在数据链路层实现的,上层不需要关心桥接的细节,于是协议上层需要发送的报文被送到br0,网桥设备的处理代码判断报文该被转发到eth0还是eth1,或者两者皆转发。反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。而有时eth1也可能会作为报文的源地址或目的地址直接参与报文的发送与接收,从而绕过网桥。
3、iptables
我们知道,Linux络协议非常高效,同时比较复杂如果我们希望在数据的处理过程中对关心的数据进行一些操作该怎么做呢?Linux提供了一套机制来为用户实现自定义的数据包处理过程。
在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux网络棋处理数据包的过程中对数据包进行些操作,例如过滤、修改、丢弃等整个挂接点技术叫作Netfilterlptables
Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中:而lptables是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表通过者的配合来实现整个Linux网络协议战中灵活的数据包处理机制。
总结
2、docker网络模式
就是为了实现容器互联的。
1、host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是dockerhost上已经使用的端口就不能再用了,网络的隔离性不好。
[root@localhost ~]
2、container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个NetworkNamespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
[root@localhost ~]
3、网桥模式
1、创建网桥
[root@localhost ~]
2、使用网桥
[root@localhost ~]
docker run -it --name nuoke --network zhang centos
4、none模式
使用none模式,Docker容器拥有自己的NetworkNamespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
[root@localhost ~]
5、--link
链接一个容器,类似于container模式
连接容器名字:连接过程的别名(通常一样)
[root@localhost ~]
3.docker网桥相关命令(docker network)
1、创建网桥
--subnet :指定网络的CIDR
--gateway :网关
[root@localhost ~]
2、查看网桥
[root@localhost ~]
NETWORK ID NAME DRIVER SCOPE
网桥的ID 网桥的名称 网桥类型 网桥的来源
3、查看网桥的详细信息
docker network inspect [网桥的名称]
4、链接网桥
docker network connect 网桥名 容器名
[root@localhost ~]
5、断开链接
docker network disconnect 网桥名 容器名
[root@localhost ~]
6、删除网桥
docker network rm [网桥名称]
[root@localhost ~]
7、清理网桥
[root@localhost ~]
3、多个容器互联项目(nginx代理django)
1、分析
Nginx ---> Django
1、创建网桥
docker network create zhang
2、部署Django
[root@localhost ~]
2d2d77726f5fadd22472527116300a7ab5bb43c660c7663d7843b2fa0f0afffb
[root@localhost ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
987213ba242e python:latest "bash" 43 seconds ago Up 42 seconds loving_jones
[root@localhost ~]
root@2d2d77726f5f:/
root@2d2d77726f5f:/
[root@localhost ~]
[root@localhost ~]
3、nginx
vim django.conf
server {
server_name _;
listen 80;
location / {
proxy_pass http://django:8000;
}
}
[root@localhost ~]