lo0:回环网卡、TCP/IP网卡是否生效
virbr0 自身继承了一个虚拟化功能(KVM 架构),原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会自动安装虚拟网卡
docker 0 : 容器的网关,绑定物理网卡,负责做NAT 地址转换、端口映射,本身也是一个容器
ens33: 实体物理网卡
host模式 : -net=host 容器和宿主机共享Network namespace
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT, host最大的优势就是网络性能比较好,但是dockerhost上已经使用的端口就不能再用了,网络的隔离性不好。
container模式:-nat=containner:name or ID 容器和另外一个容器共享network namespace
这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享Ip、端口范围等,同样,两个容器除了网络方面,其他的如文件系统、选程列表还是隔高的. (两个容器的进程可以通过lo0网卡设备通信)
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:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker0网桥及iptables.的net表配置与宿主机通信
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备, Docker将veth pair设备的一端放在新创建的容器中,并命名为etho (容器的网卡) ,另一端放在主机中,以vethoxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
Host: 与宿主机共享网络名称空间/网络协议栈
Container: 多个容器之间共享一个network namespaces.
None : 自闭空间
Bridge:默认模式通过veth对连接容器与dockero网桥,网桥分配给容器IP,同时docker0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
docker network ls
docker network create --subnet=192.168.0.0/16 mynetwork
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'
进入容器没有systemct1命令解决:添加--privileged=true (指定此容器是否为特权容器) ,使用此参数,则不能用attach示例:
docker run -itd --name centostest --privileged=true centos /sbin/init
/sbin/init 内核启动时主动呼叫的第一个进程
# 批量删除容器
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
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.容器的修改并不会影响镜像,如果在某一层中添加一个文件,如果在下一层中就会删除它,镜像中依然会包含该文件
bootfs: docker底层依赖的库、内核==》负责与内核交互
base image (底包) :基础镜像(例如centos,debian)
images (只读) :固化了一个标准运行环境
container:容器层(读写层)
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 | 健康检查 |
#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