知道了通过网络端口来访问运行在docker容器内的服务,容器中可以运行一些网络应用,要让外部可可以访问这些应用,可以通过 -P 或者 -p 参数来指定端口映射

网络端口映射

首先创建一个python应用的容器,
docker run -d -P training/webapp python app.py
另外,我们可以指定容器绑定的网络地址比如绑定127.0.0.1,
可以使用 -P 绑定端口,使用 docker ps 可以看到容器端口5000绑定到主机端口55000
也可以用 -p 表示来执行容器端口绑定到主机端口
还可以指定容器绑定的网络地址,
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
这样就可以使用 127.0.0.1:5001 来访问容器的5000端口
上面都是绑定的tcp端口,如果要绑定UDP端口,可以在端口后面加上/udp
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

Docker 容器互联

端口映射并不是唯一把docker 连接到另外一个容器的方法,
docker有一个连接系统,可以把多个容器连接在一起,共享连接信息
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息
容器命名
当我们创建了一个容器的时候,docker 会自动对他进行命名,也可以通过 -name 标识来命名容器,
docker run -d -P —name runoob training/webapp python app.py
新建网络
先创建一个新的Docker网络
docker network create -d bridge test-net
参数说明
-d:参数指定docker网络类型,有 bridge,overlay,其中 overlay 网络类型用于 Swarm mode,
可以通过 docker network ls 查看一下
连接容器
运行一个容器并连接到新建的 test-net 网络
docker run -itd —name test1 —network test-net ubuntu /bin/bash
再打开一个新的终端,在运行一个容器,加入到网络中
docker run -itd —name test2 —network test-net ubuntu /bin/bash
通过ping 来证明test1 和test2容器建立了互联关系
如果 test1 ,test2容器中无ping命令,可以再容器内执行以下命令安装ping(可以在一个容器里安装好,然提交容器到镜像,再以新的镜像重新运行两个容器)
apt-get update
apt install iputils-ping
在test1容器输入以下命令
exec 进入容器,ping test2
在test2容器输入以下命令
exec 进入容器,ping test1
这样test1和test2容器就建立互联关系,如果多个让容器之间需要互相连接,可以使用 docker compose

配置DNS

我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容设置全局容器的DNS

  1. {
  2. "dns" : [
  3. "114.114.114.114",
  4. "8.8.8.8"
  5. ]
  6. }

设置后,启动容器的DNS会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启docker 生效
查看容器的DNS是否生效可以使用命令,它会输出容器的DNS信息
docker run -it —rm ubuntu cat etc/resolv.conf
手动指定容器的配置
如果只想在指定的容器设置DNS,可以使用以下命令
docker run -it —rm -h host_ubuntu —dns=114.114.114.114 —dns-search=test.com ubuntu
参数说明:
—rm :容器退出时自动清理容器内部的文件系统
-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