# 容器连接


## 网络端口映射
* `docker run -d -P training/webapp python app.py` -P随机映射
* `docker run -d -p 5000:5000 training/webapp python app.py` -p指定端口
* `docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py` 指定ip
* `docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py` udp端口

## 容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法    
docker 有一个连接系统允许将多个容器连接在一起，共享连接信息  
docker 连接会创建一个父子关系，其中父容器可以看到子容器的信息  

### 容器命名
`docker run -d -P --name test training/webapp python app.py`  --name来命名容器

### 创建一个安装ping命令的测试镜像
```bash
#进入容器
docker exec -it ubuntu-test /bin/bash
#更新并安装
apt-get update
apt install iputils-ping

# exit退出并提交更新
docker commit -m="install ping" -a="zhaojq" 0546f66f7e25 zhaojq/ubuntu:ping
```

### 新建网络
```bash
docker network create -d bridge test-net

#-d：参数指定 Docker 网络类型，有 bridge、overlay
#其中 overlay 网络类型用于 Swarm mode，在本小节中你可以忽略它

#查看 可看到test-net网络
docker network list 

NETWORK ID          NAME                DRIVER              SCOPE
e82ff7953606        bridge              bridge              local
661089d2aecf        host                host                local
c0320454d544        none                null                local
15bfd9d1637c        test-net            bridge              local
```

### 连接容器
```bash
# 运行两个容器
docker run -itd --name test-net1 --network test-net zhaojq/ubuntu:ping /bin/bash
docker run -itd --name test-net2 --network test-net zhaojq/ubuntu:ping /bin/bash

# 进入test-net1
docker exec -it test-net1 /bin/bash

# ping test-net2 可以看到连接成功,反过来进入test-net2 ping test-net2 也可以连接成功
ping test-net2

PING test-net2 (172.19.0.3) 56(84) bytes of data.
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=4 ttl=64 time=0.059 ms
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=5 ttl=64 time=0.046 ms
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=6 ttl=64 time=0.045 ms
64 bytes from test-net2.test-net (172.19.0.3): icmp_seq=7 ttl=64 time=0.053 ms
```

## 配置DNS
我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS, 配置完，需要重启 docker 才能生效
```json
{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}
```

```bash
# 查看dns是否生效
docker run -it --rm ubuntu  cat etc/resolv.conf
```

### 手动指定容器配置
```bash
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu

# -h HOSTNAME 或者 --hostname=HOSTNAME： 设定容器的主机名，它会被写到容器内的 /etc/hostname 和 /etc/hosts。
# --dns=IP_ADDRESS： 添加 DNS 服务器到容器的 /etc/resolv.conf 中，让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
# --dns-search=DOMAIN： 设定容器的搜索域，当设定搜索域为 .example.com 时，在搜索一个名为 host 的主机时，DNS 不仅搜索 host，还会搜索 host.example.com
# 如果在容器启动时没有指定 --dns 和 --dns-search，Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS
```

