当前位置:   article > 正文

Docker:运行web应用实例演示_利用容器运行web服务实验

利用容器运行web服务实验

1、Web应用运行和访问实例

1.1 运行一个Web应用

        直接在docker中search一个webapp镜像即可,无需自己写。

docker search webapp

pull一个webapp:   【这个测试webapp国内网络下载速度可能较慢】

docker pull training/webapp

下载完后,接着启动这个webapp:

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

参数说明:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口映射到我们使用的主机上。

1.2 访问App

注意看上图PORTS部分为0.0.0.0:49153->5000/tcp。

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 49153 上。

从主机上看,它应该暴露了端口49153:

验证如下:

  1. netstat | grep 32768
  2. netstat -nltp | grep 32768
  3. curl localhost:32768

从容器内部看,它应该有一个端口5000:

验证如下:

  1. docker exec -it d646216dd513 /bin/bash
  2. netstat -nltp

1.3 设置自定义映射端口

通过 -P参数映射到主机上的端口是随机的。可以通过 -p 参数来设置不一样的端口。

  1. docker run -d -p 5001:5000 training/webapp python app.py
  2. docker ps
  3. netstat -nltp | grep 5001
  4. curl localhost:5001

        从上图中可以看到,容器中跑了两个内部端口都是5000的web实例。新的容器内部的 5000 端口映射到我们本地主机的 5001 端口上。

 

2、常用的功能

2.1 查看web应用网络端口

        通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

docker port d646216dd513

2.2 查看web应用程序日志

        docker logs [ID或者名字] 可以查看容器内部的标准输出。

docker logs -f 4697fd8148a3

参数说明:

  • -f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

2.3 查看web应用程序容器的进程

        可以使用 docker top 来查看容器内部运行的进程。

docker top 4697fd8148a3

2.4 检查web应用程序

        使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

docker inspect 4697fd8148a3
  1. [root@192 keepmoving]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 4697fd8148a3 training/webapp "python app.py" 15 minutes ago Up 15 minutes 0.0.0.0:5001->5000/tcp, :::5001->5000/tcp friendly_jennings
  4. d646216dd513 training/webapp "python app.py" 31 minutes ago Up 31 minutes 0.0.0.0:49153->5000/tcp, :::49153->5000/tcp funny_hodgkin
  5. [root@192 keepmoving]# docker inspect 4697fd8148a3
  6. [
  7. {
  8. "Id": "4697fd8148a35a5eafc5051df0ab220545c6230bc78fcddfb8fe7609ef3527a9",
  9. "Created": "2023-02-24T16:17:48.919718603Z",
  10. "Path": "python",
  11. "Args": [
  12. "app.py"
  13. ],
  14. "State": {
  15. "Status": "running",
  16. "Running": true,
  17. "Paused": false,
  18. "Restarting": false,
  19. "OOMKilled": false,
  20. "Dead": false,
  21. "Pid": 7726,
  22. "ExitCode": 0,
  23. "Error": "",
  24. "StartedAt": "2023-02-24T16:17:49.212901136Z",
  25. "FinishedAt": "0001-01-01T00:00:00Z"
  26. },
  27. "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
  28. "ResolvConfPath": "/var/lib/docker/containers/4697fd8148a35a5eafc5051df0ab220545c6230bc78fcddfb8fe7609ef3527a9/resolv.conf",
  29. "HostnamePath": "/var/lib/docker/containers/4697fd8148a35a5eafc5051df0ab220545c6230bc78fcddfb8fe7609ef3527a9/hostname",
  30. "HostsPath": "/var/lib/docker/containers/4697fd8148a35a5eafc5051df0ab220545c6230bc78fcddfb8fe7609ef3527a9/hosts",
  31. "LogPath": "/var/lib/docker/containers/4697fd8148a35a5eafc5051df0ab220545c6230bc78fcddfb8fe7609ef3527a9/4697fd8148a35a5eafc5051df0ab220545c6230bc78fcddfb8fe7609ef3527a9-json.log",
  32. "Name": "/friendly_jennings",
  33. "RestartCount": 0,
  34. "Driver": "overlay2",
  35. "Platform": "linux",
  36. "MountLabel": "",
  37. "ProcessLabel": "",
  38. "AppArmorProfile": "",
  39. "ExecIDs": null,
  40. "HostConfig": {
  41. "Binds": null,
  42. "ContainerIDFile": "",
  43. "LogConfig": {
  44. "Type": "json-file",
  45. "Config": {}
  46. },
  47. "NetworkMode": "default",
  48. "PortBindings": {
  49. "5000/tcp": [
  50. {
  51. "HostIp": "",
  52. "HostPort": "5001"
  53. }
  54. ]
  55. },
  56. "RestartPolicy": {
  57. "Name": "no",
  58. "MaximumRetryCount": 0
  59. },
  60. "AutoRemove": false,
  61. "VolumeDriver": "",
  62. "VolumesFrom": null,
  63. "CapAdd": null,
  64. "CapDrop": null,
  65. "CgroupnsMode": "host",
  66. "Dns": [],
  67. "DnsOptions": [],
  68. "DnsSearch": [],
  69. "ExtraHosts": null,
  70. "GroupAdd": null,
  71. "IpcMode": "private",
  72. "Cgroup": "",
  73. "Links": null,
  74. "OomScoreAdj": 0,
  75. "PidMode": "",
  76. "Privileged": false,
  77. "PublishAllPorts": false,
  78. "ReadonlyRootfs": false,
  79. "SecurityOpt": null,
  80. "UTSMode": "",
  81. "UsernsMode": "",
  82. "ShmSize": 67108864,
  83. "Runtime": "runc",
  84. "ConsoleSize": [
  85. 0,
  86. 0
  87. ],
  88. "Isolation": "",
  89. "CpuShares": 0,
  90. "Memory": 0,
  91. "NanoCpus": 0,
  92. "CgroupParent": "",
  93. "BlkioWeight": 0,
  94. "BlkioWeightDevice": [],
  95. "BlkioDeviceReadBps": null,
  96. "BlkioDeviceWriteBps": null,
  97. "BlkioDeviceReadIOps": null,
  98. "BlkioDeviceWriteIOps": null,
  99. "CpuPeriod": 0,
  100. "CpuQuota": 0,
  101. "CpuRealtimePeriod": 0,
  102. "CpuRealtimeRuntime": 0,
  103. "CpusetCpus": "",
  104. "CpusetMems": "",
  105. "Devices": [],
  106. "DeviceCgroupRules": null,
  107. "DeviceRequests": null,
  108. "KernelMemory": 0,
  109. "KernelMemoryTCP": 0,
  110. "MemoryReservation": 0,
  111. "MemorySwap": 0,
  112. "MemorySwappiness": null,
  113. "OomKillDisable": false,
  114. "PidsLimit": null,
  115. "Ulimits": null,
  116. "CpuCount": 0,
  117. "CpuPercent": 0,
  118. "IOMaximumIOps": 0,
  119. "IOMaximumBandwidth": 0,
  120. "MaskedPaths": [
  121. "/proc/asound",
  122. "/proc/acpi",
  123. "/proc/kcore",
  124. "/proc/keys",
  125. "/proc/latency_stats",
  126. "/proc/timer_list",
  127. "/proc/timer_stats",
  128. "/proc/sched_debug",
  129. "/proc/scsi",
  130. "/sys/firmware"
  131. ],
  132. "ReadonlyPaths": [
  133. "/proc/bus",
  134. "/proc/fs",
  135. "/proc/irq",
  136. "/proc/sys",
  137. "/proc/sysrq-trigger"
  138. ]
  139. },
  140. "GraphDriver": {
  141. "Data": {
  142. "LowerDir": "/var/lib/docker/overlay2/62abe074323b2620f26c6965087bcbe21e56e54497e913669f8c0bd41aa3f14c-init/diff:/var/lib/docker/overlay2/3f0811533dfca9363e7150c6a7592500b9f93e1e1666a90d329f1af8f13dfb8c/diff:/var/lib/docker/overlay2/437bdf36dee06f6619a5f1bee660c747cc556e851f613e1158afc96165b18615/diff:/var/lib/docker/overlay2/d1b034ca7319ee0928aaafde86b2aeaa13ec77eeb9d671af2c96de2ba244957d/diff:/var/lib/docker/overlay2/1ccbd811e55023283fbce1e2e8b04f55851986779b69f0089026569968700595/diff:/var/lib/docker/overlay2/6e9fe1298d1eb253e7289d372afaee9bc6a637ace6d569102e371c8f9f955cb8/diff:/var/lib/docker/overlay2/34387ef5b499b54fba4d444174e22a40ad885e6adc5054347fa37e10a73f84bc/diff:/var/lib/docker/overlay2/59958dfb13ab73cc947c52534550ee93092b0dea4011d7fe74549d160a069abc/diff:/var/lib/docker/overlay2/951d10b2d3212cbdd7323b25b1c3c5e3380a1f18e09b8e566b2a43a96cd00323/diff:/var/lib/docker/overlay2/cd2891ea16adcb3d6d31056755835bf9cec806eb06d42d4c29ff2e88f680d395/diff:/var/lib/docker/overlay2/ac9857dff6507ea4f5aa187c2b443eb6de09676f52e8857d116b97e463a16c2e/diff:/var/lib/docker/overlay2/fde236b9e764cf4ee565ceba0f1fc99efc16ba60b4a4f7d2723622a40d526557/diff:/var/lib/docker/overlay2/85b19f3ebf6a41781e5982b655803dabffc9c8ac85bd6ee1a4026c46925d364e/diff:/var/lib/docker/overlay2/49762ef50589e5bf5bfcf0fe57b3b8bd16c60e9ce6ff62253408f345bff6f38e/diff",
  143. "MergedDir": "/var/lib/docker/overlay2/62abe074323b2620f26c6965087bcbe21e56e54497e913669f8c0bd41aa3f14c/merged",
  144. "UpperDir": "/var/lib/docker/overlay2/62abe074323b2620f26c6965087bcbe21e56e54497e913669f8c0bd41aa3f14c/diff",
  145. "WorkDir": "/var/lib/docker/overlay2/62abe074323b2620f26c6965087bcbe21e56e54497e913669f8c0bd41aa3f14c/work"
  146. },
  147. "Name": "overlay2"
  148. },
  149. "Mounts": [],
  150. "Config": {
  151. "Hostname": "4697fd8148a3",
  152. "Domainname": "",
  153. "User": "",
  154. "AttachStdin": false,
  155. "AttachStdout": false,
  156. "AttachStderr": false,
  157. "ExposedPorts": {
  158. "5000/tcp": {}
  159. },
  160. "Tty": false,
  161. "OpenStdin": false,
  162. "StdinOnce": false,
  163. "Env": [
  164. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  165. ],
  166. "Cmd": [
  167. "python",
  168. "app.py"
  169. ],
  170. "Image": "training/webapp",
  171. "Volumes": null,
  172. "WorkingDir": "/opt/webapp",
  173. "Entrypoint": null,
  174. "OnBuild": null,
  175. "Labels": {}
  176. },
  177. "NetworkSettings": {
  178. "Bridge": "",
  179. "SandboxID": "836893de8ce73e280874f63b3ee2db5340b788723aa3ff835a6222c641aa7c40",
  180. "HairpinMode": false,
  181. "LinkLocalIPv6Address": "",
  182. "LinkLocalIPv6PrefixLen": 0,
  183. "Ports": {
  184. "5000/tcp": [
  185. {
  186. "HostIp": "0.0.0.0",
  187. "HostPort": "5001"
  188. },
  189. {
  190. "HostIp": "::",
  191. "HostPort": "5001"
  192. }
  193. ]
  194. },
  195. "SandboxKey": "/var/run/docker/netns/836893de8ce7",
  196. "SecondaryIPAddresses": null,
  197. "SecondaryIPv6Addresses": null,
  198. "EndpointID": "05992053611e52bf08f2a7b420a0f63eff9eddeaff81cbd1ee9e52ea31a64ebb",
  199. "Gateway": "172.17.0.1",
  200. "GlobalIPv6Address": "",
  201. "GlobalIPv6PrefixLen": 0,
  202. "IPAddress": "172.17.0.3",
  203. "IPPrefixLen": 16,
  204. "IPv6Gateway": "",
  205. "MacAddress": "02:42:ac:11:00:03",
  206. "Networks": {
  207. "bridge": {
  208. "IPAMConfig": null,
  209. "Links": null,
  210. "Aliases": null,
  211. "NetworkID": "581adbbf78d32412c411c274bb65c339f496b24e9cef5ad69f8d038bcc371c1b",
  212. "EndpointID": "05992053611e52bf08f2a7b420a0f63eff9eddeaff81cbd1ee9e52ea31a64ebb",
  213. "Gateway": "172.17.0.1",
  214. "IPAddress": "172.17.0.3",
  215. "IPPrefixLen": 16,
  216. "IPv6Gateway": "",
  217. "GlobalIPv6Address": "",
  218. "GlobalIPv6PrefixLen": 0,
  219. "MacAddress": "02:42:ac:11:00:03",
  220. "DriverOpts": null
  221. }
  222. }
  223. }
  224. }
  225. ]

2.5 停止web应用容器

docker stop 4697fd8148a3

2.6 重启web应用容器

        可以使用命令 docker start 或者docker restart 来启动。

docker restart 4697fd8148a3

2.7 移除web应用程序

  • 使用 docker rm 命令来删除不需要的容器。
  • 如果是启动着的docker实例,需要加-f,强制(force)删除。
docker rm -f d646216dd513

3、与其它容器(DB容器)互联

        上述是一个web单一容器通过端口映射,可以通过主机端口访问容器;那么如果需要访问数据库,就涉及到容器互联。

3.1 与数据库容器互联

创建一个新的数据库容器:

  1. docker search training/postgres
  2. docker run -d --name test_db training/postgre
  3. docker ps

db容器和web容器建立互联关系:

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

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

        Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。

3.2 容器公开的连接信息

Docker 通过 2 种方式为容器公开连接信息:

  • 环境变量
  • 更新 /etc/hosts 文件

1.环境变量

        使用 env 命令来查看 web 容器的环境变量。

  1. [root@192 keepmoving]# docker exec -it web /bin/bash
  2. root@73a026235a47:/opt/webapp# env
  3. TEST_DB_PORT=tcp://172.17.0.2:5432
  4. HOSTNAME=73a026235a47
  5. TERM=xterm
  6. LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
  7. TEST_DB_PORT_5432_TCP_PORT=5432
  8. TEST_DB_PORT_5432_TCP_ADDR=172.17.0.2
  9. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  10. PWD=/opt/webapp
  11. TEST_DB_NAME=/web/test_db
  12. SHLVL=1
  13. HOME=/root
  14. LESSOPEN=| /usr/bin/lesspipe %s
  15. TEST_DB_PORT_5432_TCP=tcp://172.17.0.2:5432
  16. TEST_DB_PORT_5432_TCP_PROTO=tcp
  17. LESSCLOSE=/usr/bin/lesspipe %s %s
  18. TEST_DB_ENV_PG_VERSION=9.3
  19. _=/usr/bin/env

        其中 TEST_DB_ 开头的环境变量是供 web 容器连接 test_db 容器使用,前缀采用大写的连接别名。

2. host文件

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

  1. root@73a026235a47:/opt/webapp# cat /etc/hosts
  2. 127.0.0.1 localhost
  3. ::1 localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. 172.17.0.2 test_db 56657ecbb676
  9. 172.17.0.3 73a026235a47

这里有 2 个 hosts:

  • 172.17.0.2 test_db 56657ecbb676  表示 test_db 容器的 ip, ID和Name
  • 172.17.0.3 73a026235a47  表示 web 容器的 ip, ID

可以在 web 容器中使用 ping 命令来测试跟test_db容器的连通性:

用 ping 来测试test_db容器,它会解析成 172.17.0.2。

同样可以ping容器的ip和ID也是可以的。

用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。

参考博文:

Docker基础 - 一个web应用实例 | Java 全栈知识体系

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号