docker网络管理
学习目标:
了解 Docker网络模型及其特点
应用端口映射常见操作
应用 Docker 常见网络模型
Docker 网络很重要,重要的,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络:端口映射和网络模式
为什么先学端口映射呢?
在一台主机上学习网络,学习端口映射最简单,避免过多干扰。
端口映射详解
这一节,我们从简介、种类两个方面来学习。
端口映射简介
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过宿主机的ip+port的方式来访问容器里的内容
端口映射种类
1、随机映射 -P(大写)
2、指定映射 -p 宿主机端口:容器端口
注意:
生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,
不管哪种映射都会影响性能,因为涉及到映射
随机映射实践
这一节,我们从随机映射、指定随机映射这两个方面来学习。
随机映射我们从两个方面来学习:
默认随机映射
指定主机随机映射
默认随机映射
命令格式:
docker run -d -P [镜像名称]
命令效果:
启动一个 nginx 镜像
docker run -d -P nginx
查看效果

注意:
宿主机的32768被映射到容器的80端口
-P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1
在浏览器中访问 http://192.168.8.14:32768/,效果显示:

注意:
浏览器输入的格式是: docker容器宿主机的ip:容器映射的端口
指定主机随机映射
命令格式
docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
命令效果
docker run -d -p 192.168.8.14::80 --name nginx-2 nginx
检查效果

指定映射实践
这一节,我们从指定端口、指定多端口两个方面来学习。
指定端口映射
命令格式:
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
注意:
如果不指定宿主机ip的话,默认使用0.0.0.0,
容器端口必须清楚,而且必须写出来
命令实践:
现状我们在启动容器的时候,给容器指定一个访问的端口 1199
docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx
查看新容器ip
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 0ad3acfbfb76
查看容器端口映射

查看宿主机开启端口

查看浏览器效果:

多端口映射方法
命令格式
docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
开起多端口映射实践
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx
查看容器进程

网络管理基础
这一节,我们主要从网络命令、网络模型两方面来学习。
docker网络命令
查看网络命令帮助
~# docker network help
...
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
docker的网络模式
bridge模式:
简单来说:就是穿马甲,打着宿主机的旗号,做自己的事情。
Docker的默认模式,它会在docker容器启动时候,自动配置好自己的网络信息,同一宿主机的所有容器都在一个网络下,彼此间可以通信。类似于我们vmware虚拟机的nat模式。
利用宿主机的网卡进行通信,因为涉及到网络转换,所以会造成资源消耗,网络效率会低。

host模式:
简单来说,就是鸠占鹊巢,用着宿主机的东西,干自己的事情。容器使用宿主机的ip地址进行通信。
特点:容器和宿主机共享网络

container模式:
新创建的容器间使用使用已创建的容器网络,类似一个局域网。
特点:容器和容器共享网络

none模式:
这种模式最纯粹,不会帮你做任何网络的配置,可以最大限度的定制化。

overlay模式:
容器彼此不再同一网络,而且能互相通行。

bridge实践
这一节,我们从创建网络、使用网络、连接操作三个方面来学习。
其实我们在端口映射的部分就是bridge模式的简单演示了,因为他们使用的是默认bridge网络模式,现在我们来自定义桥接网络。
这一部分我们从三个方面来演示:
创建桥接网络
使用自定义网络创建容器
容器断开、连接网络
创建网络
命令格式:
docker network create --driver [网络类型] [网络名称]
命令演示:
docker network create --driver bridge bridge-test
查看主机网络类型
~# docker network ls
NETWORK ID NAME DRIVER SCOPE
8a18574f0f27 bridge bridge local
172ae1f1f3f5 bridge-test bridge local
...
查看新建网络的网络信息
~# docker network inspect bridge-test
[
{
"Name": "bridge-test",
...
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
...
宿主机又多出来一个网卡设备
~# ifconfig
br-172ae1f1f3f5 Link encap:Ethernet HWaddr 02:42:18:4e:ac:92
inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0
...
在自定义网络中启动容器
命令格式:
docker run --net=[网络名称] -itd --name=[容器名称] [镜像名称]
使用效果:
docker run --net=bridge-test -itd --name=nginx-new-bri nginx
查看该容器的ip信息
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-new-bri
注意部分
使用默认的桥接模型创建的容器是可以直接联网的。
使用自定义的桥接模型创建的容器不可以直接联网,但是可以通过端口映射来实现联网
容器断开网络
命令格式:
docker network disconnect [网络名] [容器名]
命令演示:
docker network disconnect bridge-test nginx-new-bri
效果展示:
docker network inspect bridge-test
容器连接网络
命令格式:
docker network connect [网络名] [容器名]
命令演示:
docker network connect bridge-test nginx-new-bri
效果展示:
docker network inspect bridge-test
host模型实践
这一节,我们从命令详解、host特点两个方面来学习。
命令详解
host模型我们知道,容器使用宿主机的ip地址进行对外提供服务,本身没有ip地址。
命令格式:
docker run --net=host -itd --name [容器名称] 镜像名称
命令示例:
创建容器,使用host模式
docker run --net=host -itd --name nginx-1 nginx
查看宿主机端口

查看网络连接

host特点:
host模型比较适合于,一台宿主机跑一个固定的容器,比较稳定,或者一个宿主机跑多个占用不同端口的应用的场景,他的网络性能是很高的。
hosts模型启动的容器不会有任何地址,他其实是使用了宿主机的所有信息
第 4 章 Docker 进阶
在这一部分我们主要来介绍一些Docker的高级内容:
Dockerfile 和 Docker compose
4.1 Dockerfile
学习目标:
了解 Dockerfile简介及特点
应用 Dockerfile使用命令
说出 Dockerfile常见指令及其特点
4.1.1 Dockerfile简介
这一节,我们从定义、作用、准则、文件内容、基础指令、使用命令这六个方面来学习。
什么是Dockerfile
Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来。
Dockerfile的作用
1、找一个镜像: ubuntu
2、创建一个容器: docker run ubuntu
3、进入容器: docker exec -it 容器 命令
4、操作: 各种应用配置
....
5、构造新镜像: docker commit
Dockerfile 使用准则
1、大: 首字母必须大写D
2、空: 尽量将Dockerfile放在空目录中。
3、单: 每个容器尽量只有一个功能。
4、少: 执行的命令越少越好。
Dockerfile 基础四指令:
基础镜像信息 从哪来?
维护者信息 我是谁?
镜像操作指令 怎么干?
容器启动时执行指令 嗨!!!
Dockerfile使用命令:
构建镜像命令格式:
docker build -t [镜像名]:[版本号] [Dockerfile所在目录]
构建样例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
参数详解:
-t 指定构建后的镜像信息,
/opt/dockerfile/nginx/ 则代表Dockerfile存放位置,如果是当前目录,则用 .(点)表示
4.1.2 Dockerfile快速入门
这一节,我们从环境、文件、构建、效果这四个方面来速的使用Dockerfile来创建一个定制化的镜像:ssh。
准备环境
创建Dockerfile专用目录
mkdir /docker/images/ssh -p
cd /docker/images/ssh
创建秘钥认证
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
准备软件源
cp /etc/apt/sources.list ./
注意:
课堂上因为多方面的原因,我们不执行这一步-20181125
定制文件
创建Dockerfile文件
# 构建一个基于ubuntu的ssh定制镜像
# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 执行命令
# 增加软件源 -- 由于课堂网络原因,我们不执行这一步
ADD sources.list /etc/apt/sources.list
# 安装 ssh 服务
RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
# 启动ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
构建镜像
构建镜像
docker build -t ubuntu-ssh .
效果查看
使用新镜像启动一个容器,查看效果
docker run -d -p 10086:22 ubuntu-ssh
容器检查
docker ps
docker port c03d146b64d4
ssh查看效果
ssh 192.168.8.14 -p 10086
4.1.3 基础指令详解
这一节,我们来学习五个基础指令
基础指令
FROM
格式:
FROM <image>
FROM <image>:<tag>。
解释:
FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
MAINTAINER
格式:
MAINTAINER <name>
解释:
指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
RUN
格式:
RUN <command> (shell模式)
RUN["executable", "param1", "param2"]。 (exec 模式)
解释:
表示当前镜像构建时候运行的命令
注释:
shell模式:类似于 /bin/bash -c command
举例: RUN echo hello
exec 模式:类似于 RUN ["/bin/bash", "-c", "command"]
举例: RUN ["echo", "hello"]
EXPOSE
格式:
EXPOSE <port> [<port>...]
解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容
器时增加-p或者-P参数对容器的端口进行分配。
ENTRYPOINT
格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)
解释:
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
4.1.4 文件编辑指令详解
这一节,我们从指令详解、ADD实践、COPY实践、VOLUME实践这四个方面来学习。
注意:
ADD和COPY相当于数据卷操作,VOLUME相当于数据卷容器操作
目录文件编辑指令
ADD
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
解释:
将指定的 <src> 文件复制到容器文件系统中的 <dest>
src 指的是宿主机,dest 指的是容器
如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
COPY
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
解释:
单纯复制文件场景,Docker推荐使用COPY
VOLUME
格式:
VOLUME ["/data"]
解释:
VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
举例:
VOLUME ["/var/lib/tomcat7/webapps/"]
ADD实践
拷贝普通文件
Dockerfile文件内容
...
# 执行命令
...
# 增加文件
ADD ["sources.list","/etc/apt/sources.list"]
...
拷贝压缩文件
Dockerfile文件内容
...
# 执行命令
...
# 增加文件
ADD ["linshi.tar.gz","/nihao/"]
...
COPY实践
修改Dockerfile文件内容:
...
# 执行命令
...
# 增加文件
COPY index.html /var/www/html/
...
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
VOLUME实践
修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME
VOLUME ["/data/"]
...
4.1.5 环境指令详解
这一节,我们从指令详解、ENV实践、WORKDIR实践这三个方面来学习。
环境设置指令
ENV
格式:
ENV <key> <value>
ENV <key>=<value> ...
解释:
设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
WORKDIR
格式:
WORKDIR /path/to/workdir (shell 模式)
解释:
切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd
可以多次切换(相当于cd命令),
也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
ENV实践
修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV
ENV NIHAO=helloworld
WORKDIR实践
修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR
WORKDIR /nihao/itcast/
RUN ["touch","itcast.txt"]
4.1.6 Dockerfile构建过程
这一节,我们从构建过程、镜像介绍、构建缓存这三个方面来学习。
Dockerfile构建过程:
从基础镜像1运行一个容器A
遇到一条Dockerfile指令,都对容器A做一次修改操作
执行完毕一条命令,提交生成一个新镜像2
再基于新的镜像2运行一个容器B
遇到一条Dockerfile指令,都对容器B做一次修改操作
执行完毕一条命令,提交生成一个新镜像3
...
构建过程镜像介绍
构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。
提供了镜像调试的能力
我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像
拓展:
执行的步骤越多越好呢?还是越少越好?
构建缓存
我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
不适用构建缓存方法常见两种:
全部不同缓存:
docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
部分使用缓存:
ENV REFRESH_DATE 2018-01-12
只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了
样例:
# 构建一个基于ubuntu-base的docker定制镜像
# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 创建构建刷新时间
ENV REFRESH_DATE 2018-11-02
# 执行命令
...
构建历史:
查看构建过程查看
docker history
清理构建缓存:
docker system prune
docker system prune --volumes

浙公网安备 33010602011771号