总字数:7,
阅读时间:27分钟
在上一篇文章中我们对容器、镜像等概念做了详细的介绍,本文介绍一些容器的网络连接,以及我们如何通过Dockerfile来构建镜像使用,同时我们如何在前端项目中使用docker来进行容器部署。
网络我们部署的容器中很多应用都是需要让外部通过网络端口来进行访问的,比如比如mysql的端口,mongodb的端口和redis的端口等等;不仅是外部访问,不同的容器之间可能还需要进行通信,比如我们的web应用容器需要来连接mysql或者mongodb容器,都涉及到了网络通信。
端口映射容器要想让外部访问应用,可以通过-P或者-p参数来指定需要对外暴露的端口:
$dockerrun-d-Pnginxcdf80dbc18a8a36bfb61a84ba29a5f59d25c9fbc3
使用-P会在主机绑定一个随机端口,映射到容器内部的端口;我们查看刚刚创建的容器,可以看到随机端口映射到了容器内部的80端口:
$dockerps-lCONTAINERIDIMAGECREATEDSTATUSPORTScnginxAboutaminuteagoUpAboutaminute0.0.0.0:-80/tcp,:::-80/tcp
使用logs命令我们可以看到nginx的访问日志:
$dockerlogsc10..92.41--[16/Mar/:01:40:32+]"GET/HTTP/1.1""-""Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/.36(KHTML,likeGecko)Chrome/99.0..51Safari/.36""-"
dockerport可以快捷地让我们查看容器端口的绑定情况:
$dockerportc80/tcp-0.0.0.0:
使用-p参数可以指定一个端口进行映射:
$dockerrun-d-p:80nginx
也可以使用ip:hostPort:containerPort格式指定映射一个特定的ip:
$dockerrun-d-p.0.0.1::80nginx
省略hostPort参数本地主机会自动分配一个端口,类似-P参数的作用:
$dockerrun-d-p.0.0.1::80nginx
还可以使用udp来指定映射到udp端口:
$dockerrun-d-p:80/udpnginx
有时候我们想要映射容器的多个端口,可以使用多个-p参数:
$dockerrun-d-p:\-p:\nginx
或者映射某个范围内的端口列表:
$dockerrun-d-p-:-nginxdocker网络模式
我们想要将多个容器进行互联互通,为了避免不同容器之间互相干扰,可以给多个容器建立不同的局域网,让局域网络内的网络彼此联通。
要理解docker的网络模式,我们首先来看下docker有哪些网络;我们安装docker后,它会自动创建三个网络none、host和brdge,我们使用networkls命令查看:
$dockernetworklsNETWORKIDNAMEDRIVERSCOPEc64d7dc22bridgebridgelocala0b1dhosthostlocaldd4nonenulllocal
我们分别来看下这几个网络的用途;首先是none,none顾名思义,就是什么都没有,该网络关闭了容器的网络功能,我们使用--network=none指定使用none网络:
$dockerrun-itd--name=busybox-none--network=nonebusybox49f88dd75aebeab27ceda5adbfbadeae3b0dockerexec49f88dd75ae7ipa1:lo:LOOPBACK,UP,LOWER_UPmtuqdiscnoqueueqlenlink/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforever2:tunl0
NONE:NOARPmtuqdiscnoopqlenlink/ipip0.0.0.0brd0.0.0.03:ip6tnl0NONE:NOARPmtuqdiscnoopqlenlink/tunnel:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00brd00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00我们这里使用了busybox镜像,可能有的童鞋对它不了解,这是一个集成压缩了三百多个常用linux命令和工具的软件,它被称为Linux工具里的瑞士军刀,我们这里主要用它的ip命令查看容器的网络详细情况。
我们看到这个容器除了lo本地环回网卡,没有其他的网卡信息;不仅不能接收信息,也不能对外发送信息,我们用ping命令测试网络情况:
$dockerexec49f88dd75ae7pingxieyufei.