# 前言

本文通过 web 应用展示主机如何与 wen 容器之间通信,为后续讲解网络提供基础。

# web 的运行与访问

# 运行

找到一个 webapp 镜像即可。

docker pull training/webapp

下载完成后查看

docker images | grep webapp

我们需要跑一下这个 webapp 里面的 app.py 文件,其实就是 hello world

启动 webapp

docker run -d -P training/webapp python app.py

-d :让容器在后台运行

-P :将容器内部使用的网络端口映射到主机上

查看一下

cyan@w2d:~$ docker ps
CONTAINER ID          PORTS                                   
e7a994ce697c     0.0.0.0:49153->5000/tcp, :::49153->5000/tcp

这里因为界面显示不够,我就只保留了 ID 和端口号的相关信息。

# 访问

上文端口号的解读是:Docker 开放 5000 端口(Python Flask 默认端口)映射到主机端口 49153.

所以我们可以从 49153 这个端口来访问这个界面

netstat -nltp | grep 49153

netstat 命令用于显示网络状态

在命令行:

curl localhost:49153
# 或者在浏览器上访问,ip 是虚拟机 - Ubuntu 的 ip

容器映射到主机的端口是随机的,但是可以用 - P 选项来指定端口

docker run -d -P 5001:500 training/webapp python app.py

如果浏览器访问不上,把镜像删了重新下载试试,反正是可以的

# 其他功能

反正都是命令,快速过一下

# 查看容器 (映射) 端口
docker port ID
# 查看日志
docker logs ID
# 查看容器进程
docker top
# 检查应用底层信息,返回 JSON 文件记录
# 容器配置和状态信息
docker inspect ID
# 停止应用容器
docker stop ID
# 重启容器
docker restart/start ID
# 移除容器,-f 就是强制删除,一般容器删除需要 
docker rm ID

# 容器互联

删除所有不再使用的容器: docker container prune

创建数据库容器:

docker run -d --name db training/postgres

db 容器与 web 容器建立互联关系

docker run -d -P 5001:5000 --name web --link db:db training/webapp python app.py

--link 参数格式为 --link name:alias ,其中 name 是要链接的容器的名称,alias 是这个连接的别名。

容器之间的连接信息的查看有两种方式:

  • 查看环境变量:
# webapp 已经运行起来了,假设其名字为 web
docker exec -it web /bin/bash
# ====>,这里假设 ID 是 1cbc9aeba2a8
root@1cbc9aeba2a8:/opt/webapp# env
DB_NAME=/web/db
DB_PORT_5432_TCP_ADDR=172.17.0.2
DB_PORT=tcp://172.17.0.2:5432
DB_PORT_5432_TCP=tcp://172.17.0.2:5432
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/opt/webapp
DB_PORT_5432_TCP_PORT=5432
SHLVL=1
HOME=/root
DB_PORT_5432_TCP_PROTO=tcp
DB_ENV_PG_VERSION=9.3
_=/usr/bin/env

DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。只有在建立连接之后才会有,没有建立连接是没有这几个变量的

  • hosts 文件

除了环境变量,Docker 还添加 host 信息到父容器的 /etc/hosts 的文件。下面是父容器 web 的 hosts 文件

root@1cbc9aeba2a8:/opt/webapp# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      db d992e3c761e0
172.17.0.3      1cbc9aeba2a8
root@1cbc9aeba2a8:/opt/webapp#

这里有 2 个 hosts:

  • 第一个, 172.17.0.2 db d992e3c761e0 表示 db 容器的 ip, ID 和 Name
  • 第二个, 172.17.0.3 1cbc9aeba2a8 表示 web 容器的 ip, ID

# 参考

netstat 命令:https://www.runoob.com/linux/linux-comm-netstat.html?ivk_sa=1024320u

Java 全栈知识体系:https://pdai.tech/md/devops/docker/docker-03-basic-web-app.html