# 前言
本文通过 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