上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序。本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的Web程序,在浏览器中输出hello world。

本文内容的测试环境是Windows7下的Docker,用例基于官方文档用例。

 

一:从运行一个简单的Python Web程序说起

  启动Docker客户端并登陆。在客户端中输入以下内容:

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

  第一次输入上面命令时,Docker会先从云端镜像库中下载training/webapp镜像(笔者机器已经下载过了,图1略过了此过程),成功运行后如图1所示。

图1.运行截图

  下面我们来详细看看这条命令的具体内容,这一部分我们可以在官方文档中找到详细的英文解释,这里笔者将其翻译过来并加了些自己的理解。

  前面我们已经说过,Docker虚拟机系统实际也是基于Linux内核,所以这条语句实际上就是Linux的命令,我们可以输入以下内容查看docker命令的详解:

  $ sudo docker

  输出结果如下:

图2.docker命令的子命令列表

  再回到第一条中,我们使用的子命令是run。

  在子命令列表中我们看到run子命令解释是:run  Run a command in a new container,也就是在一个新的容器中运行一条命令。

  我们的run命令后面跟的可选项有-d和-P。

  查阅官方文档我们可以知道,-d表示Docker会把当前命令的容器放到后台执行并监控起来。-P则表示让Docker映射任何容器内部需要的端口到虚拟机上。这里需要对Docker一些概念有所了解,我们这里暂且简单地理解为Docker虚拟机下的每个Docker容器都是一台子虚拟机,每个子虚拟机都有一块虚拟网卡,当外部要访问容器时都必须通过Docker虚拟机,而-P就做了相关的端口映射。

  命令执行后返回的一长串字符串(也就是fc4028b21d84f5c075821ca2425d74d45dea87cd28c4eb92620ae39ddec22f46)则是Docker的容器ID,这是一个唯一的值,我们可以以它为标识对容器做相应的操作。

  当我们需要查看和管理当前后台运行的所有容器时,我们可以输入以下命令。

  $ sudo docker ps

图3.容器详细信息

  这里我们可以看到容器的详细信息,包括容器ID(精简的ID),镜像,命令,创建时间,状态,端口,以及容器名字。

  接下来的training/webapp就是我们运行的容器的源了,Docker中称之为镜像,这个镜像是Docker官方之前就创建好的,里面包含了一个简单Python Flask web应用。

  最后,我们在容器中执行了python app.py,python app.py启动了我们的web应用。

 

二:访问页面——从LinuxWindows的区别到对Docker层次的简单理解

  从上面我们查看运行容器的详细信息时(图3)我们看到了,在PORTS这一栏中,有这样的信息:

  0.0.0.0:49153->5000/tcp

  上文中提到Docker虚拟机对容器做了端口映射,这里我们可以更直观的看到了,Docker虚拟机中的49153端口映射到了容器的5000端口(这里我们运行的是web程序,所以是tcp协议,其他容器有需要可以指定成udp协议)。

  在官方文档中,这时我们访问localhost:49153,应该就能出现Hello world了,但是笔者在这个步骤根本访问不到这个页面。

图4.此时访问,浏览器一直处于等待状态

  因此这里我们需要重新看看这个虚拟网络的结构,要看整个网络的结构,我们应该先了解Docker的层次结构。在Linux中,Docker的逻辑结构是这样的:

硬件 < Linux系统(Docker Kernel) < Docker容器

  而我们在前文中提过,在Windows中要运行Docker,实际上是在虚拟机下运行的,所以在Windows中Docker的逻辑结构应该是:

硬件 < Windows系统 < Docker虚拟机(Docker Kernel) < Docker容器。

  因此官方文档中用例应该是基于Linux下的,Linux此时访问localhost:49153是没有问题的,因为Docker Kernel此时把49153端口映射给了容器的5000端口,而Windows则不行,因为我们只是把Docker虚拟机的49153端口映射给了容器,我们在浏览器中输入localhost:49153明显是访问的Windows层级别。

  理解到这里问题就已经解决了,我们只需进入VirtualBox中,将Docker虚拟机的网络做个桥接,或者端口映射就行了。

  进入VirtualBox主界面,选中Docker虚拟机(boot2docker-vm),单击设置按钮,在设置中选择网络,这里我们发现Docker虚拟机默认选择了“网络地址转换(NAT)”。

图5.Docker虚拟机的网络连接方式默认是NAT

  而且端口转发中还默认有两个端口映射。

图6.Docker虚拟机和宿主机默认的端口映射

  不难猜测这里可能是Docker客户端和Docker虚拟机进行通信的端口,因此我们不能将Docker虚拟机的网络连接方式改成桥接了,否则Docker客户端无法和Docker虚拟机进行通信。

  因此我们这里选择添加一个端口映射,将Windows系统的80端口映射到Docker虚拟机的的49153端口上去。端口映射的名称随便取,协议一定要是TCP(HTTP基于TCP)

图7.添加映射端口

  此时我们可以在Windows下的浏览器直接访问localhost了(一般来说浏览器默认访问80端口,80端口可以省略),因为我们直接映射了80端口到Docker虚拟机的49153端口上,而Docker虚拟机的49153端口又映射到了我们刚刚创建的Docker容器的5000端口上,我们的web程序正是运行在该容器的5000端口上。

图8.Hello world!

总结:

本文实际上只运行了一个简单的web程序,用例也是基于官方文档,而且如果读者是在Linux运行的话输入完第一条命令应该直接在浏览器中访问了。因此本文主要是对Docker的run命令做了简单的解释,并且通过Docker在Linux和Windows下的区别来简单理解Docker逻辑层次结构。

  希望对初学者有一些帮助,笔者自己也是Docker的初学者,文章错处,万请见谅指正。

转载于:https://www.cnblogs.com/bjfuouyang/p/3798421.html

从Docker在Linux和Windows下的区别简单理解Docker的层次结构相关推荐

  1. linux 创建线程函数吗,[笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include #define CreateThreadEx(tid,threadFun,args) ...

  2. linux与windows下开发,Linux 与 Windows下开发感受

    Linux 和 Windows环境下开发各有优点.以下Linux 下使用感受是在Ubuntu11.04,别的发行版还没试过. 至于各自的缺点,都可以通过各种方法,得到或多或少地解决.至于要花费多大的精 ...

  3. Linux和Windows下部署BeetleX服务网关

    有朋友希望写一篇BeetleX服务网关部署到Linux和windows下并以服务的方式运行的介绍文章.接下详细介绍如何做并简单介绍一下网的使用.首先需要在官网(beetlex-io.com)下载对应版 ...

  4. linux和windows下忘记mysql密码的几种找回方法

    linux和windows下忘记mysql密码的几种找回方法 关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦. 方法一(先进入root权限): # /e ...

  5. Linux和Windows下计算文件的Hash值

    Linux和Windows下计算文件的Hash值 MD和SHA简介 MD SHA MD5 SHA1标识文件唯一性 Linux Windows 不需要下载工具,也不需要写代码. MD和SHA简介 MD ...

  6. VLC-3.0.0(Nightly版)在Linux和Windows下的编译步骤详解

    VLC 3.0.0 Compile vlc的编译一直是个大坑,做过音视频开发的不少人想必都踩过,开篇引用官方wiki一句话: Compiling VLC is not an easy task. 本文 ...

  7. linux编译c如何延时,linux和windows下,C/C++开发的延时函数,sleep函数

    简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 在VC中使用带上头文件 #include 在gcc编译器中,使用 ...

  8. git学习笔记——Linux和Windows下git的基本操作

    git学习笔记--Linux和Windows下git的基本操作 github主页:https://github.com/Taot-chen 一.Linux环境 1.安装git sudo apt-get ...

  9. windows4t硬盘Linux分区工具,linux挂载windows下的硬盘分区

    linux挂载windows下的硬盘分区 (2009-10-18 12:37:56) 标签: 电脑 windows linux 硬盘分区 sda it 在linux下挂载windows分区 想随时随地 ...

最新文章

  1. leetcode-93-复原ip地址
  2. c语言字符串 数字转换函数大全
  3. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
  4. 事务复制提示初始快照不可用_「MySQL」数据库事务深入分析
  5. 占据语音入口?苹果或将在2020年WWDC上推出SiriOS
  6. ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法
  7. 2016打算做运维的人员必知必晓的知识
  8. 从零开始刷Leetcode——数组(122.167.169)
  9. Shell命令-系统信息及显示之stat、du
  10. arXiv 上传文章过程
  11. RCP之病人信息系统开发总结(4):MVC模式之View层—透视图
  12. 【软件安装】TeXLive 2022安装(Latex下载,安装,测试,升级)教程
  13. Python:给信号添加白噪声
  14. 赴美工作常识(Part 5 - 绿卡优先级)
  15. 很好的励志文章(特别针对刚刚进入职场的毕业生而写)
  16. KEIL、uVision、RealView、MDK、KEIL C51区别
  17. android 仿微信录音,Android 模仿微信长按录音功能
  18. 【JAVA Core】精品面试题100道
  19. 我把csdn版权标志隐藏了.
  20. Windows Sockets 函数api (微软官方文档)

热门文章

  1. HTML5学习笔记之音视频标签
  2. android graphic(15)—fence
  3. android adb端口被占用问题
  4. 学习笔记 十一 : iscsi
  5. MySql的事务操作与演示样例
  6. 精品软件 推荐 卡巴斯基安全软件 本人使用过的效果最好的杀毒软件之一哟...
  7. 强人工智能基本问题:神经网络分层还是不分层
  8. Hadoop基础-配置历史服务器
  9. 又有好奇心,又能自主学习,这个机器人棒棒哒!
  10. percona-toolkit源码编译安装