一、docker中的网络介绍
在docker默认情况下,容器可以建立到外部网络的链接,但是外部的网络却无法链接到容器。docker允许通过外部访问容器或容器互联的方式来提供网络服务,容器中可以运行一些网络应用,可以通过-P -p参数来指定端口的映射。宿主机启用路由转发功能,
1.通过docker commit或者dockerfile来生成一个web应用的镜像,在这里我就通过dockerfile来构建镜像的模块。
1)建立一个sshd_dockerfile的工作目录
[root@docker-yankerp ~]# mkdir sshd_dockerfile
[root@docker-yankerp ~]# cd sshd_dockerfile/
[root@docker-yankerp sshd_dockerfile]# touch Dockerfile yk.sh
编辑yk.sh文件。编辑内容如下:
[root@docker-yankerp sshd_dockerfile]# vim yk.sh
[root@docker-yankerp sshd_dockerfile]# cat yk.sh
#!/bin/bash
/usr/sbin/sshd
/usr/sbin/httpd -DFOREGROUND
2)在主机上生成ssh密钥对,并且创建一个authorized——keys文件(在过程中回车即可。)
[root@docker-yankerp sshd_dockerfile]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory ‘/root/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
2d:a9:44:f0:6a:66:2e:81:08:c5:80:47:15:69:7a:25 root@docker-yankerp
The key’s randomart image is:
+–[ RSA 2048]—-+
|o+o.+o |
|..o Eo. |
|.. o oo |
|o.. .o o |
|o ..= . S . |
| * . . . |
| . . . |
| . |
| |
+—————–+
[root@docker-yankerp sshd_dockerfile]#cat ~/.ssh/id_rsa.pub > /root/sshd_dockerfile/authorized_keys
3)编写dockerfile
[root@docker-yankerp sshd_dockerfile]# cat Dockerfile
FROM cf2c3ece5e41
MAINTAINER from csdn@yankai.com
RUN yum -y install openssh-server sudo httpd
RUN useradd admin
RUN echo “admin:admin” | chpasswd
RUN echo “admin ALL=(ALL) ALL” >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN mkdir -p /var/run/sshd
RUN mkdir -p /home/admin/.ssh
RUN sed -ri ‘s/session reqired pam_loginuid.so/#session requied pam_loginuid.so/g’ /etc/pam.d/sshd
ADD authorized_keys /home/admin/.ssh/authorized_keys
RUN sed -ri ‘s/#ServerName www.example.com:80/ServerName www.yankai.com/g’ /etc/httpd/conf/httpd.conf
ADD yk.sh /yk.sh
RUN chmod 775 /yk.sh
EXPOSE 22 80 443
CMD [“/bin/bash”,”/yk.sh”]
在sshd_dockerfile目录下,使用docker build命令来创建镜像。注意:在最后面还有一个小点 . 代表的当前目录
[root@docker-yankerp sshd_dockerfile]# docker build -t=”centos:http” .
运行的过程
运行结束
执行dockerimages查看新的镜像
当使用-P(大写)标记时,docker会随机映射一个随机的端口到内部开放网络端口
[root@docker-yankerp sshd_dockerfile]#docker run -d -P centos:http
使用docker ps可以看到本机的32770映射到了容器的22端口,本机的32769映射到了容器的80端口。
此时访问本机的32769端口即可访问容器的web应用
-p (小写)可以指定要映射的端口,很容易理解,比如-p 我要把1314端口映射到80端口,把520端口映射到22端口,-p是可以指定的
这时候我们访问web应用这次是1314端口
二、docker0网桥
docker服务默认会创建一个docker0网桥(其上有一个docker0的内部接口)它在内核层通过了其他物理或虚拟网卡,这就将所有的容器和本地的主机都放到了同一个物理网络
目前docker网桥是linux网桥,可以使用brctl show命令来查看网桥端口连接信息。
[root@docker-yankerp ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02427446ceff no veth74dc6b6
virbr0 8000.52540049dce2 yes virbr0-nic
在每一次创建新容器的时候,docker会从可用的地址段来选择一个空闲的ip地址分配给容器的eth0端口,使用本地主机上的docker0接口做为默认网关
三、docker网络配置!!!
1 host模式
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
2 container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
3 none模式
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
4 bridge模式的拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。
1.查看当前docker0的地址
[root@docker-yankerp ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:74ff:fe46:ceff prefixlen 64 scopeid 0x20<link>
ether 02:42:74:46:ce:ff txqueuelen 0 (Ethernet)
RX packets 11180 bytes 499338 (487.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24075 bytes 66716757 (63.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在容器运行时候,每个容器都会分配一个特定的虚拟机口并桥接到docker0.每个容器都会配置docker0 ip 相同的网段的专用ip地址的。docker0的
ip地址被用于所有容器的默认网关。我们接下来运行一个容器并查看
通过brctl查看
以上docker0扮演着bcb777容器的接口vethxx interface桥接的角色
2)自定义网桥
(1)停止docker (2)创建自定义网桥 (3)给网桥分配ip地址
如果服务正在运行,我们停止服务,删除旧的网桥
(2)然后创建一个网桥bridge0,给网桥分配特定的ip地址
(3)修改/etc/sysconfig/docker文件如图所示。 那个点点不是,手抖弄上了
启动docker,新建一个容器可以看到它已经桥接到了bridge0上
进入容器查询它的ip地址