1) 快速配置指南(详细使用下面会讲)

其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效

下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(docker run )时候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行docker run时可以覆盖设置的默认值。

最后这些选项只有在 docker run执行时使用,因为它是针对容器的特性内容:

2) 配置 DNS

怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件:

  • /etc/resolv.conf : 记录了容器的配置信息
  • /etc/hostname : 记录了容器的主机名
  • /etc/hosts : 默认只记录了容器自身的一些地址和名称

这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 /etc/resolv.conf文件立刻得到更新。

如果用户想要手动指定容器的配置,可以利用下面的选项:

  • -h HOSTNAME 或 --hostname = HOSTNAME :设定容器的主机名,它会被写到容器内的/etc/hostname 和 /etc/hosts中。但它在容器外部看不到,既不会在docker ps中显示,也不会在其他的容器的 /etc/hosts看到
  • --links = CONTAINER_NAME:ALIAS 选项会在创建容器的时候,添加一个其他容器的主机名到/etc/hosts文件中,让新的容器的进程可以使用主机名ALIAS就可以连接它
  • --dns = IP_ADDRESS : 添加DNS服务到容器的/etc/resolv.conf中,让容器用这个服务器来解析所有不在/etc/hosts上的主机名
  • --dns-search = DOMAIN : 设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com。注意,如果没有上述最后的两个选项,Docker会默认主机上的/etc/resolv.conf来配置容器

在容器中使用 mount 命令可以看到挂载信息,在之前连接的是host网络的ubuntu6容器上运行:

  1. userdeMBP:~ user$ docker exec -it ubuntu6 /bin/bash
  2. root@linuxkit-025000000001:/# mount
  3. ...
  4. /dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
  5. /dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
  6. /dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)
  7. ...

1.查看其/etc/resolv.conf内容:

  1. root@linuxkit-:/# cat /etc/resolv.conf
  2. # This file is included on the metadata iso
  3. nameserver 192.168.65.1 // 相当于运行docker run时使用--dns=192.168.65.1
  4. domain lan //表示局域网,相当于运行docker run时使用--dns-search=lan

⚠️如果是直接手动对/etc/resolv.conf进行更改,那么再次重启时,里面更改的内容就会恢复原状,希望不回复的方法就是在run时使用-dns和--dns-search参数来设置

此时任意打开一个连接的是自定义的bridge——myNetwork2的ubuntu7容器,查看它的/etc/resolv.conf配置文件,可以看见,和上面的内容是相同的

这是因为创建容器时,默认会与宿主机的/etc/resolv.conf内容保持一致

2.查看其/etc/hosts内容:

  1. root@linuxkit-025000000001:/# cat /etc/hosts
  2. 127.0.0.1 localhost
  3. ::1 localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters

当我们使用--link=container:alias参数连接了其他容器的话,该文件中就会出现连接容器的ip地址,如下面是容器ubuntu7没有连接其他容器前文件的内容:

  1. root@8eef1c93a7d4:/# vi /etc/hosts
  2.  
  3. 127.0.0.1 localhost
  4. ::1 localhost ip6-localhost ip6-loopback
  5. fe00::0 ip6-localnet
  6. ff00::0 ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. 172.20.11.2 8eef1c93a7d4

⚠️设置了alias的好处是:重启容器IP变化时,别名alias正常使用

然后后面打开另一个容器ubuntu8,让其通过--link连接了容器db,然后就能够在/etc/hosts中看见db的信息:

  1. userdeMBP:~ user$ docker run -it --name ubuntu8 --link db:db ubuntu:14.04 /bin/bash
  2. root@1f6456e5fbfd:/# cat /etc/hosts
  3. 127.0.0.1 localhost
  4. ::1 localhost ip6-localhost ip6-loopback
  5. fe00::0 ip6-localnet
  6. ff00::0 ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. 172.17.0.4 db 2fca948912dc
  10. 172.17.0.5 1f6456e5fbfd

就能够使用容器db的名字ping通它了:

  1. root@1f6456e5fbfd:/# ping -c 3 db
  2. PING db (172.17.0.4) 56(84) bytes of data.
  3. 64 bytes from db (172.17.0.4): icmp_seq=1 ttl=64 time=0.081 ms
  4. 64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.092 ms
  5. 64 bytes from db (172.17.0.4): icmp_seq=3 ttl=64 time=0.109 ms
  6.  
  7. --- db ping statistics ---
  8. 3 packets transmitted, 3 received, 0% packet loss, time 2111ms
  9. rtt min/avg/max/mdev = 0.081/0.094/0.109/0.011 ms

3.查看其/etc/hostname内容:

  1. root@linuxkit-025000000001:/# cat /etc/hostname
  2. linuxkit-

可以在run容器时自己设定自己的主机名,使用--hostname参数:

  1. userdeMacBook-Pro:~ user$ docker run -it --hostname=myUbuntu9 --name ubuntu9 ubuntu:14.04 /bin/bash
  2. root@myUbuntu9:/# cat /etc/hostname
  3. myUbuntu9

上面的例子就将主机名设置为了myUbuntu9

4.使用--net参数(其实就是之前使用的--network参数)设置使用的网络是bridge、nonedeng,或者是指明与某个容器使用相同的网络,这里着重讲其如何使用container模式(其他网络模式请看上一章):

重新生成一个ubuntu10容器,使用--net=container:ubuntu8连接之前link db容器的ubuntu8容器:

从上图可见,基本上就相当于打开了别名为ubuntu10的ubuntu8容器,两者的IP地址是完全一样的,连主机名都是一样的。当然,ubuntu10容器也是开启了的:

  1. userdeMBP:~ user$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 3b854b76e02e ubuntu:14.04 "/bin/bash" minutes ago Up minutes ubuntu10
  4. f07c50c1c6ee ubuntu:14.04 "/bin/bash" minutes ago Up minutes ubuntu8

Docker技术入门与实战 第二版-学习笔记-8-网络功能network-2-相应配置的更多相关文章

  1. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  2. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-1-单个host上的容器网络

    Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 1) 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -p或 -P参数 ...

  3. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  4. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-1-cli

    Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境 Docker Machine是一种工具,它允许你在虚拟主机 ...

  5. Docker技术入门与实战 第二版-学习笔记-7-数据管理(volume)

    Docker 数据管理 为什么要进行数据管理呢?因为当我们在使用container时,可能会在里面创建一些数据或文件,但是当我们停掉或删除这个容器时,这些数据或文件也会同样被删除,这是我们并不想看见的 ...

  6. Docker技术入门与实战 第二版-学习笔记-5-容器-命令及限制内存与cpu资源

    1.启动容器 启动容器有两种方式: 基于镜像新建一个容器并启动 将在终止状态(stopped)的容器重新启动 1)新建并启动——docker run 比如在启动ubuntu:14.04容器,并输出“H ...

  7. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  8. Docker技术入门与实战 第二版-学习笔记-6-仓库

    仓库(Repository)是集中存放镜像的地方 一个容易混淆的概念是注册服务器(Registry). 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像. ...

  9. Docker技术入门与实战 第二版-学习笔记-2-镜像构建

    3.利用 commit 理解镜像构成 在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像. 直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜 ...

随机推荐

  1. Java多线程--JDK并发包(2)

    Java多线程--JDK并发包(2) 线程池 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. JDK有一套Executor框架,大概包括Executor.Ex ...

  2. jstl 中无法使用EL语句。异常信息:According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    JSTL 标签库的有两种 taglib 伪指令, 其中 RT 库即是依赖于 JSP 传统的请求时属性值, 而不是依赖于 EL 来实现: 只要将 <%@ taglib uri="http ...

  3. mongodb远程连接访问

    随着云计算,云服务的不断发展演进,数据库的管理及维护方式也在转变,传统基于C/S客户端工具管理的方式,已经无法满足实际需要. TreeSoft数据库管理系统,采用web方式,对mongoDB,MySQ ...

  4. 【JavaFx教程】第五部分:将数据用 XML 格式存储

    第5部分的主题 持久化数据为XML 使用JavaFX的FileChooser 使用JavaFX的菜单 在用户设置中保存最后打开的文件路径. 现在我们的地址应用程序的数据只保存在内存中.每次我们关闭应用 ...

  5. mysql常用语句练习-基于ecshop2.7.3数据库(1)

    SELECT * FROM ecs_goods WHERE goods_id = 1;SELECT goods_id, goods_name FROM ecs_goods WHERE goods_id ...

  6. django-强大的ORM

    一.ORM简介 (对象关系映射:object relationship mapping) MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的 ...

  7. intellij idea 2016.3.5 控制台取消行数限制

    有时候我们要输出大量的信息放到控制台显示,但是多了之后就出现最上面的信息被覆盖删除, 因此就需要设置控制台的显示行数,但在idea7之后的版本中,取消了对控制台行数设置选项, 只能通过更改配置文件进行 ...

  8. [World Final 2016] Branch Assignment

    链接 PDF bzoj 先求出正置边和反置边时b+1到前b个点的最短路dis[0/1][x](x∈[1,b]), 令D[x]=dis[0][x]+dis[1][x] 然后分组后每个x对代价的贡献为D[ ...

  9. 【代码笔记】iOS-NSJSONSerializationDemo

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  10. JavaScript 数组复制的方法

    1.循环 2.Array.from(arr) 3.let arr2 = [...arr]