Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明

网络模式 | Dockerfile

  • Docker 原生网络
  • Docker 网络图解
  • Docker 四种网络模式
    • Host 模式
    • Container模式
    • None模式
    • Bridge模式
  • Docker 网络自定义
    • 查看网络列表
    • 自定义网络固定IP
    • 暴露端口
    • 在宿主机环境执行容器内命令
    • systemctl 命令
  • Docker 镜像分层
  • Dockerfile 操作指令
    • 例:docker部署nginx

Docker 原生网络

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第1张图片

lo0:回环网卡、TCP/IP网卡是否生效

virbr0 自身继承了一个虚拟化功能(KVM 架构),原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会自动安装虚拟网卡

docker 0 : 容器的网关,绑定物理网卡,负责做NAT 地址转换、端口映射,本身也是一个容器

ens33: 实体物理网卡

Docker 网络图解

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第2张图片

Docker 四种网络模式

Host 模式

host模式 : -net=host 容器和宿主机共享Network namespace

host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT, host最大的优势就是网络性能比较好,但是dockerhost上已经使用的端口就不能再用了,网络的隔离性不好。

Container模式

container模式:-nat=containner:name or ID 容器和另外一个容器共享network namespace

这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享Ip、端口范围等,同样,两个容器除了网络方面,其他的如文件系统、选程列表还是隔高的. (两个容器的进程可以通过lo0网卡设备通信

None模式

none模式: -net=none 容器有独立的Network namespace ,但并没有对其进行任何网络设置,如分配veth -pair 和网桥连接,配置IP 等

这种网络模式下客器只有lo回环网口,役有其他的网卡, none模式可以在容器创建时通过-netwokr=none 参数指定
这种类型的网络无法联网,但是封闭的网络能很好的保证容器的安全性

4.Bridge模式是docker的默认网络模式,不写-net参数,就是bridge模式。使用docker run-p时, docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables t nat-vn查看。

Bridge模式

Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker0网桥及iptables.的net表配置与宿主机通信

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备, Docker将veth pair设备的一端放在新创建的容器中,并命名为etho (容器的网卡) ,另一端放在主机中,以vethoxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第3张图片

Host: 与宿主机共享网络名称空间/网络协议栈
Container: 多个容器之间共享一个network namespaces.
None : 自闭空间
Bridge:默认模式通过veth对连接容器与dockero网桥,网桥分配给容器IP,同时docker0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯

Docker 网络自定义

查看网络列表

docker network ls 

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第4张图片

自定义网络固定IP

docker network create --subnet=192.168.0.0/16 mynetwork

在这里插入图片描述
Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第5张图片

docker run -itd --name test1 --net mynetwork --ip 192.168.0.100 centos:latest /bin/bash

在这里插入图片描述

暴露端口

docker run -itd -p 3333:80 nginx /bin/bash
docker run -itd -P nginx /bin/bash

在这里插入图片描述

在宿主机环境执行容器内命令

docker exec -it 621200b180ba /bin/bash -c 'nginx'

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第6张图片

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第7张图片

systemctl 命令

进入容器没有systemct1命令解决:添加--privileged=true (指定此容器是否为特权容器) ,使用此参数,则不能用attach示例:
docker run -itd --name centostest --privileged=true centos /sbin/init
/sbin/init 内核启动时主动呼叫的第一个进程

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第8张图片

# 批量删除容器
docker ps -a | awk '{print "docker rm " $1}' | bash
#批量删除"exit"状态的容器

for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done

Docker 镜像分层

Dockerfile 由多条指令构成,随着深入研究 Dockerfile 与镜像的关系,很快大家就会发现,Dockerfile 中的每一条指令都会对应于 Docker 镜像中的一层。

继续以如下 Dockerfile 为例:

FROM centos:centos7		#指定新镜像所基于的镜像,用于创建镜像
ADD run.sh /			#将脚本添加至该镜像中,启动容器后就可以使用了
VOLUME /data			#在容器中创建挂载点(-v)
CMD ["./run.sh"] 		#启动该脚本/命令

通过 docker build 以上 Dockerfile 的时候,会在 ubuntu:14.04 镜像基础上,添加三层独立的镜像,依次对应于三条不同的命令。镜像示意图如下:

可以看出,镜像在生成的过程中是以分层的方式生成的:

1.Dockerfile 中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
镜像层将被缓存和复用(后续的镜像层将基于前面的一层)
2.当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)
3.某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就再成功,相当于地基)
4.容器的修改并不会影响镜像,如果在某一层中添加一个文件,如果在下一层中就会删除它,镜像中依然会包含该文件

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第9张图片

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第10张图片
Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第11张图片

bootfs: docker底层依赖的库、内核==》负责与内核交互
base image (底包) :基础镜像(例如centos,debian)
images (只读) :固化了一个标准运行环境
container:容器层(读写层)
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分:
基础镜像
信息维护者信息
镜像操作指令
容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号开头的注释

Dockerfile 操作指令

指令 含义
FROM镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER名字 FROM指令,每创建一个镜像就需要一条FROM指令
RUN命令 说明新镜像的维护人信息
CMD[ “要运行的程序”, "参数1,"参数2 "] 在所基于的镜像上执行命令,并提交到新的镜像中
EXPOSE端口号 指令启动容器时要运行的命令或者脚本, Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
ENV环境变量变量值 指定新镜像加载到Docker时要开启的端口
ADD源文件/目录目标文件/目录 设置一个环境变量的值,会被后面的RUN使用
COPY源文件/目录目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
VOLUME [ “目录”] 在容器中创建一个挂载点
USER用户名/UID 指定运行容器时的用户
WORKDIR路径 为后续的RUN, CMD, ENTRYPOINT指定工作目录
ONBUILD命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

例:docker部署nginx

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第12张图片

#Dockerfile文件内容
FROM centos:7

MAINTAINER dark

RUN yum -y install pcre-devel openssl-devel zlib-devel gcc gcc-c++ make cmake

RUN useradd -M -s /sbin/nologin nginx

ADD nginx-1.12.2.tar.gz /usr/local/src

WORKDIR /usr/local/src/nginx-1.12.2
RUN ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module

RUN make && make install

RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
RUN ln -s /usr/local/nginx/conf/nginx.conf /etc/


RUN rm -rf /lib/systemd/system/nginx.service

ADD nginx.service /lib/systemd/system/nginx.service
RUN chown nginx.nginx /lib/systemd/system/nginx.service

RUN chmod 754 /lib/systemd/system/nginx.service

EXPOSE 80
EXPOSE 443


RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

CMD ["/usr/local/nginx/sbin/nginx"]
#nginx.service文件内容
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/ki11 -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
docker images  
docker run -d  7519376f540f 
docker inspect     d886baed0ac4     
curl 172.17.0.4:80

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第13张图片

Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第14张图片
Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明_第15张图片

你可能感兴趣的:(docker)