Docker基础 - 一个web应用实例
通过上文我们已经基本了解了docker的结构(仓库,镜像,容器)以及跑docker应用了;本文将通过介绍一个web应用:向你展示如何进行主机与web容器之间的通信,这是web开发者常用的;第二,贯穿上文中内容, 且为我们后续讲解网络提供基础。
一个web 应用运行和访问
# 运行一个 web 应用
我们只需要找一个webapp的镜像即可,无需自己再写个程序啥的。接下来让我们尝试使用 docker 构建一个 web 应用程序。
这里找了一个training/webapp,它是将在docker容器中运行一个 Python Flask web应用。
[root@pdai ~]# docker pull training/webapp Using default tag: latest latest: Pulling from training/webapp Image docker.io/training/webapp:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/ e190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 10bbbc0fc0ff: Pull complete fca59b508e9f: Pull complete e7ae2541b15b: Pull complete 9dd97ef58ce9: Pull complete a4c1b0cb7af7: Pull complete Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d Status: Downloaded newer image for training/webapp:latest docker.io/training/webapp:latest [root@pdai ~]# docker images | grep webapp training/webapp latest 6fae60ef3446 4 years ago 349MB紧接着,我们启动这个webapp
[root@pdai ~]# docker run -d -P training/webapp python app.py ec3eb9ae218494d5aa5902c1ca4435733567b5e81319f02e5d2509d45cbc25da [root@pdai ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec3eb9ae2184 training/webapp "python app.py" 18 seconds ago Up 17 seconds 0.0.0.0:32768->5000/tcp gifted_agnesi参数说明:
-d:让容器在后台运行。-P:将容器内部使用的网络端口映射到我们使用的主机上。
# 访问webapp
我们注意看上述PORTS部分为0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
- 从主机上看,它应该暴露了端口32768
所以我们来验证下:
[root@pdai ~]# netstat | grep 32768 [root@pdai ~]# netstat -nltp | grep 32768 tcp6 0 0 :::32768 :::* LISTEN 2227/docker-proxy [root@pdai ~]# curl localhost:32768 Hello world!这意味着,你浏览器你可以输入localhost:32768访问这个页面。
- 从容器内部看,它应该有一个端口5000
我们再进容器验证下:
[root@pdai ~]# docker exec -it ec3eb9ae2184 /bin/bash root@ec3eb9ae2184:/opt/webapp# netstat -nltp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 1/python所以我们的理解是对的。
# 设置自定义映射端口
我们发现,通过
-P参数映射到主机上的端口是随机,能否自定义端口呢?
我们可以通过 -p 参数来设置不一样的端口;为了对比,我们再起一个容器实例:
[root@pdai ~]# docker run -d -p 5001:5000 training/webapp python app.py 5da3588d5bc43a9ed3aa61fb87f98220c9719d2879b616404d443aaae6cee77a [root@pdai ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5da3588d5bc4 training/webapp "python app.py" 33 seconds ago Up 31 seconds 0.0.0.0:5001->5000/tcp hopeful_bardeen ec3eb9ae2184 training/webapp "python app.py" 22 minutes ago Up 22 minutes 0.0.0.0:32768->5000/tcp gifted_agnesi [root@pdai ~]# netstat -nltp | grep 5001 tcp6 0 0 :::5001 :::* LISTEN 2591/docker-proxy [root@pdai ~]# curl localhost:5001 Hello world!所以你看到跑了两个内部端口都是5000的web实例,新的容器内部的 5000 端口映射到我们本地主机的 5001 端口上。
# 其它常用功能
# 查看web 应用网络端口
通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的 web 应用容器 ID 为 5da3588d5bc4 名字为 hopeful_bardeen。
我可以这样查看容器端口的映射情况:
[root@pdai ~]# docker port 5da3588d5bc4 5000/tcp -> 0.0.0.0:5001 [root@pdai ~]# docker port hopeful_bardeen 5000/tcp -> 0.0.0.0:5001# 查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。