docker系列学习(四):有关镜像和容器的学习

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


docker系列学习(一):整体认识

docker系列学习(二):Docker + Flask 例子

docker系列学习(三):基础命令

docker系列学习(四):有关镜像和容器的学习


在本节中,我们将了解各种其他 docker 命令和参数,这些命令和参数将使你能够很好的掌握如何在某种程度上处理镜像,运行容器。

要了解这一点,最好深入研究一下有史以来最流行的服务器之一 Apache web server,并使用 docker hub 上面的 Dockerized image 来实现。

运行 Apache web 服务器

现在,让我们尝试另一个实验来帮助你了解如何最终设想在 docker 中运行的应用程序。

本节标题表示我们要运行 Apache web 服务器。要做到这一点,你现在应该开始认为必须有一个人必须为 Apache Web 服务器创建一个 docker 镜像。

因此,第一步是执行以下操作:

 docker search httpd

之后你会看到如下信息:

NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                                   The Apache HTTP Server Project                  2180                [OK]                
hypriot/rpi-busybox-httpd               Raspberry Pi compatible Docker Image with a …   45                                      
centos/httpd                                                                            21                                      [OK]
centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or bui…   19                                      
armhf/httpd                             The Apache HTTP Server Project                  8                                       
tplatform/aws-linux-httpd24-php70       aws-linux-httpd24-php70                         2                                       [OK]
salim1983hoop/httpd24                   Dockerfile running apache config                2                                       [OK]
lead4good/httpd-fpm                     httpd server which connects via fcgi proxy h…   1                                       [OK]
tplatform/aws-linux-httpd24-php71-fpm   aws-linux-httpd24-php71-fpm                     1                                       [OK]
tplatform/aws-linux-httpd24-php71       aws-linux-httpd24-php71                         1                                       [OK]
ssarioglu/sample-httpd                  sample-httpd                                    1                                       [OK]
tplatform/aws-linux-2-httpd24-php72     aws-linux-2-httpd24-php72                       1                                       [OK]
epflidevelop/os-wp-httpd                WP httpd                                        1                                       [OK]
manasip/httpd                                                                           0                                       
trollin/httpd                                                                           0                                       
itsziget/httpd24                        Extended HTTPD Docker image based on the off…   0                                       [OK]
manageiq/httpd_configmap_generator      Httpd Configmap Generator                       0                                       [OK]
dockerpinata/httpd                                                                      0                                       
interlutions/httpd                      httpd docker image with debian-based config …   0                                       [OK]
publici/httpd                           httpd:latest                                    0                                       [OK]
mprahl/s2i-angular-httpd24              An S2I image for building and running Angula…   0                                       [OK]
manageiq/httpd                          Container with httpd, built on CentOS for Ma…   0                                       [OK]
amd64/httpd                             The Apache HTTP Server Project                  0                                       
buzzardev/httpd                         Based on the official httpd image               0                                       [OK]
solsson/httpd-openidc                   mod_auth_openidc on official httpd image, ve…   0                                       [OK]

我们将使用 httpd 的 OFFICIAL 镜像,所以让我们学习一个新的命令,即 docker pull。此命令仅将 docker 镜像提取下载到本地存储库,并且不运行它。

我们在终端输入如下命令:

docker pull httpd

耐心点,这将花费一点时间。如果运行 docker images 命令,则应该看到其中列出的 httpd 。

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
httpd                    latest              2a51bb06dc8b        9 days ago          132MB
progrium/busybox         latest              a67699e37dbd        6 weeks ago         4.8MB
busybox                  latest              59788edf1f3e        7 weeks ago         1.15MB

Httpd docker镜像的官方文档你可以点击这里查看 。事实上,养成查看每个镜像的文档页面的习惯是非常好的,因为它将为你提供有关如何运行它以及任何其他配置详细信息的明确说明。

要使用默认的 Apache web 服务器在容器中运行,我们需要做的就是以下内容(请注意,我们使用的是 -d 参数,即在分离模式下运行 container)。我们还通过 --name 参数为容器命名。

docker run -d --name MyWebServer httpd

这将基于 httpd 镜像启动默认的 Apache http server,因为我们已经以分离模式启动了容器,所以我们得到了一个 container ID。你得到的身份证需要与我得到的身份相似 “54c39730ab784a998c3bb4522cf6421a4a0c7d46db54afa75202e76741032216” 。

现在,让我们检查 container 是否正在运行。为此,我们将使用我们熟悉的 docker ps 命令,如下所示:

docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                              NAMES
3e78aa15f54c        httpd                           "httpd-foreground"       29 minutes ago      Up 29 minutes       80/tcp                             MyWebServer

请注意,它处于运行状态。另请注意,NAMES 列现在具有我们为 container 指定的名称,即 MyWebServer。

停止 container

如果你希望在任何时间点停止 container ,你现在可以使用你提供的方便名称而不是 docker stop 命令中的 CONTAINER_ID 值。

现在就试试吧:

  1. 要停止 Container,请提供以下命令:
docker stop MyWebServer
  1. 尝试这样的操作:
docker ps command.
  1. 我建议你同时删除 container,采用以下方式:
docker rm MyWebServer

就是现在,让我们重新开始吧。

docker run -d --name MyWebServer httpd
当你做一个 docker ps 时 PORTS 列是什么?

你会注意到 PORTS 列这一个提阿偶。它的值是 “tcp:80”。这意味着 container 正在暴露端口 80。这看起来很合理,因为 HTTP 的 Apache web server 默认端口是 80。如果你有足够的冒险精神,你可以看看这个项目的 Dockerfile(可以先不管 Dockerfile 是什么东西,直接看就行了)。

直到最后,你会在文件中找到2个条盲目,我在这里复制:

EXPOSE 80
CMD httpd-foreground

你可以看到端口 80 已经暴露,一切看起来跟我们想象的一样。

访问我们的网站

现在,你要进行的下一项的检查是使用 curl 等实用程序甚至是本地计算机上的浏览器来检查该站点。

但 IP 地址是什么?

如果你运行的是 Docker for Mac 或者 Docker for Windows,它应该是 localhost。如果你运行的是 VirtualBox 环境,那么你自己找吧!!

有了这些信息,让我们启动本地浏览器并打开 localhost URL。

但是你应该看不到任何页面,我们期待至少 Apache 主页出现在这里,但是并非如此。这是因为 Apache web server 运行的默认端口是端口 80,但该端口尚未在主机端公开,因此无法访问该网站。

给你证据?

好吧,我告诉过你,端口 80 是由容器暴露的,而不是由主机暴露的。换句话说,端口 80 是 container 公开的私有端口,但似乎没有为面向公众的主机映射端口,因为我们看到了这个问题。

这似乎也有一个 docker 命令。它直观的称为端口。

尝试以下命令:

docker port MyWebServer

输出是符合预期的,即没有为主机的面向公众的端口进行映射。

随机端口映射

首先,停止并删除 container,以便我们可以使用相同的容器名称,即 MyWebServer。

$ docker stop MyWebServer
MyWebServer
$ docker rm MyWebServer
MyWebServer

现在,让我们使用额外的参数,即 -P 启动 httpd 容器。此参数的作用是“将所有公开的端口发布到随机端口”。所以在我们的例子中,端口 80 应该映射到一个随机端口,它将成为公共端口。

执行以下命令:

docker run -d --name MyWebServer -P httpd

接下来,让我们再次使用 port 命令查看发生了什么:

docker port MyWebServer
80/tcp -> 0.0.0.0:32769

我们可以看到端口 80 已经映射到端口 32769。因此,如果我们访问我们的网站:

http://<HostIP>/<HostPort>

你就可以看到机器上有一个显示页面了,It works!

特定端口映射

那么如果我们想将它映射到 32769 以外的端口号怎么办。你可以通过 -p(注意小写)参数来实现。

此参数格式如下:

-p HostPort:ContainerPort
For e.g. -p 80:80 or -p 8080:80

第一个参数是主机端口,我们现在制作 80,第二个端口是 Apache httpd 公开的,即 80。

让我们再看看一切:

$ docker stop MyWebServer
MyWebServer
$ docker rm MyWebServer
MyWebServer
$ docker run -d --name MyWebServer -p 80:80 httpd
02ce77550940cb1f37361b74af8913e46d6a507d06c2579b8a8b49e389b1e75f

现在,让我们再次给出 port 命令:

docker port MyWebServer
80/tcp -> 0.0.0.0:80

现在,你应该可以通过端口 80(默认端口)访问你的网站。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值