Docker挑战日记 Docker构建Nginx教程 #2

之前的概要

上一次的Docker冒险记。
作者已经掌握了在他心爱的机器上安装和掌握Docker的基础知识Docker Run。
然而,作者并不知道Docker的能力还远远不止这些。

上一篇文章:Docker挑战日记 Docker Run实现HelloWorld#1 – Qiita

引入nginx的概述

尝试引入Nginx 1版本,但这次不使用Docker Run,而是尝试以分解的形式进行。

换句话说,就像之前介绍的那样,我们想要拆分成三个命令的docker run命令。

    1. 拉取Docker镜像

 

    1. 创建Docker容器

 

    启动Docker容器

我会按照这个顺序进行尝试。

拉一下!之前先检查一下!

提到“pull”,我首先想到的是“git pull”…这之间有何关联呢?
但是,先放置那些难搞的事情吧!它们应该是一样的!给你的指令要像扣紧腋窝一样,斜向右45度嵌入!

我本以为这样想,但是我不知道应该pull哪个东西呢?
如果不知道这个,就没办法了。

因此,尝试输入“git search nginx”命令进行搜索。
这个命令直接用于搜索有关nginx的信息。

PS E:\workspace> docker search nginx
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                                  Official build of Nginx.                        11305               [OK]
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con   1588                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of   709                                     [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as p   506                                     [OK]
webdevops/php-nginx                                    Nginx with PHP-FPM                              125                                     [OK]
zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server wi   98                                      [OK]
bitnami/nginx                                          Bitnami nginx Docker Image                      65                                      [OK]
linuxserver/nginx                                      An Nginx container, brought to you by LinuxS   59              
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                                      [OK]
tobi312/rpi-nginx                                      NGINX on Raspberry Pi / ARM                     26                                      [OK]
nginx/nginx-ingress                                    NGINX Ingress Controller for Kubernetes         18               
schmunk42/nginx-redirect                               A very simple container to redirect HTTP tra   15                                      [OK]
nginxdemos/hello                                       NGINX webserver that serves a simple page co   14                                      [OK]
blacklabelops/nginx                                    Dockerized Nginx Reverse Proxy Server.          12                                      [OK]
wodby/drupal-nginx                                     Nginx for Drupal container image                12                                      [OK]
centos/nginx-18-centos7                                Platform for running nginx 1.8 or building n   10              
centos/nginx-112-centos7                               Platform for running nginx 1.12 or building    7               
nginx/nginx-prometheus-exporter                        NGINX Prometheus Exporter                       4                
nginxinc/nginx-unprivileged                            Unprivileged NGINX Dockerfiles                  4                
1science/nginx                                         Nginx Docker images that include Consul Temp   4                                       [OK]
mailu/nginx                                            Mailu nginx frontend                            3                                       [OK]
travix/nginx                                           NGinx reverse proxy                             2                                       [OK]
toccoag/openshift-nginx                                Nginx reverse proxy for Nice running on same   1                                       [OK]
wodby/nginx                                            Generic nginx                                   0                                       [OK]
ansibleplaybookbundle/nginx-apb                        An APB to deploy NGINX                          0                                       [OK]
PS E:\workspace>

我知道了与nginx相关的存储库。这次让我们拉取官方的、简单的顶级存储库”nginx”。

快重新拉取nginx!

不要考虑复杂的事情,只需输入指令!

PS E:\workspace> docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
27833a3ba0a5: Already exists
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c

PS E:\workspace>

根据日志显示,latest: Pulling from library/nginx和Status: Downloaded newer image for nginx:latest,可以推断出是从库library/nginx中拉取了最新的镜像。

为了验证,实际上检查一下是否有图像存在。

PS E:\workspace> docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
nginx                      latest              27a188018e18        12 days ago         109MB
hello-world                latest              fce289e99eb9        3 months ago        1.84kB
PS E:\workspace>

展示当前名为`git images`的图像列表的命令,但是确实存在`nginx`这个词!看起来已经下载成功了。

制作吧!

不要思考困難的事情,只需輸入指令!

PS E:\workspace> docker create -p 18080:80 -v E:\workspace\test:/usr/share/nginx/html nginx
474d58616f68dd6076ae921128ad3841267751d481012a598970fa937f9ee768
PS E:\workspace>

虽然我很想结束了!不过,考虑到这次的重要性,我还是需要多学一点。

Docker create命令是什么?

创建 – Docker-docs-ja 17.06.Beta 文档

重新写下先前的结束指令。

docker create -p 18080:80 -v E:\workspace\test:/usr/share/nginx/html nginx

以下是本次使用的选项。

  -p, --publish=[]              コンテナのポートをホスト側に公開
  -v, --volume=[ホスト側ソース:]コンテナ側送信先[:<オプション>]
                                ボリュームを拘束マウント。カンマ区切りで指定
                                `オプション`  [rw|ro], [z|Z], [[r]shared|[r]slave|[r]private], [nocopy]
                                'ホスト側ソース' は絶対パスまたは名前の値

请稍等一下

在解释之前,有两个前提。

其中之一是,nginx是一个Web服务器。也就是说,需要通过某种方式访问容器内的nginx。因此,必须提前确保路径的连通性。

首先,Docker容器基本上不能保存状态。详细情况暂且不提,至少在创建时,Docker基本上能够在任何时间任何地点创建相同的环境。
换句话说,如果删除容器并重新创建,原容器中的信息将被删除且不会保留,这一点需要记住。
因此,如果要保留数据,必须提供保留数据的方法。

创建说明该选项(-p,-v)。

– 端口绑定

– 公開オプション「-p、–publish = []」は、コンテナのポートをホスト側に公開する役割を果たします。具体的には、nginxはWebサーバーであり、通常は80番ポートにアクセスする必要があります。では、ホスト側からどのように接続すれば良いのでしょうか?

作为一种解决方案,可以使用-p命令将主机端口号和客户端端口号进行绑定。

换句话说,如果要写具体的方法论,则可以如下述:

Image from Gyazo

这是一个框架。

通过从本地主机访问localhost:18080,可以实现对nginx的80端口进行访问。

-v 体积绑定

接下来,-v,–volume=[主机源:]容器目的地[:<选项>] 这样写着。

这是一种可以在容器内使用主机源的方法。换句话说,如果无法在容器内保存文件,那就可以查看主机端的文件,这就是一种简单的方法。

Image from Gyazo

其他選項和注意事項

当创建容器时,如果仅依靠容器端的信息无法解决问题,我们提前指定选项来解决。除此之外,还有涉及环境变量的选项,如-E选项等,但在此暂不讨论。

另外,这有点多余。

需要注意的是,Create命令的选项内容仅适用于在这里创建的容器。
考虑到Docker被广泛利用的理念,可以将选项作为个人指定信息(如ID、密码等)或辅助方式的必要性较高的情况下考虑。

如果不是这样,最好是创建一个类似于Dockerfile的文件作为构建所需的图纸,并预先放置在image中。

只是,这次是我的学习,所以没关系!

确认集装箱是否已经制作完成

使用 docker ps -a 命令可以显示当前存在的容器。

PS E:\workspace> docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
474d58616f68        nginx               "nginx -g 'daemon of…"   33 minutes ago      Exited (0) 3 seconds ago                        determined_leakey
26365ee4b6ab        hello-world         "/hello"                 34 hours ago        Exited (0) 34 hours ago                             competent_davinci
PS E:\workspace>

可以看到存在着一个Nginx容器。

开启吧!

现在,一切都准备就绪。让我们开始吧!(省略部分困难的事情)

PS E:\workspace> docker start 47
47
PS E:\workspace>

start命令非常简单。虽然有一些选项,但这次只是想启动,所以不需要选项。我们不会在这里介绍它。

请注意,参数中指定的”47″是容器编号的前两位。顺便提一下,并不限制位数。只要能通过docker ps -a命令唯一识别容器,即使只有一位编号也可以。

实际上,在当前只有两个容器的情况下,其中一个容器的ID以2开头,所以即使输入docker start 4也可以启动它。

我偏离了原本的道路。现在已经不需要再解释了。

进行最后的操作确认。
输入”docker ps”命令并不带任何选项,只会显示当前正在运行的容器。

PS E:\workspace> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
474d58616f68        nginx               "nginx -g 'daemon of…"   41 minutes ago      Up 4 seconds        0.0.0.0:18080->80/tcp   determined_leakey
PS E:\workspace>

在PORTS部分也是0.0.0.0:18080->80/tcp,并明确显示端口已绑定。

我需要确认一下HTTP是否真的能够连接成功。

作为前提,E:\workspace\test是本地绑定的目录,其中存在以下index.html文件。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/><Title>MyPortal</title></head>
<body><h1 id="myportal">MyPortal</h1> <ul> <li><a href="mermaid.html#md/GTDFlow.md">GTDFlow</a></li> <li><a href="mermaid.html#md/unyokanri.md">運用管理</a></li> </ul> </body>
</html>

好吧,让我们尝试从浏览器访问localhost:18080。

Image from Gyazo

连接了!

我尝试了以下方法并取得了成功:
1. 下载了 nginx 的镜像。
2. 根据 nginx 镜像绑定了端口和卷,创建了容器。
3. 启动容器并确认能够连接到 nginx 的 Web 服务器。

这次就到这里吧。如果只是想运行脚本,大多数情况下,使用到这一点的内容就可以进行开发了吧?
然而,可以考虑到经过各种服务器的环境。

因此,下一次我想学习有关如何协作使用多个容器。具体来说,我想尝试将RedMine和MySQL进行协作。

自由且开源的Web服务器。https://nginx.org/en/ ↩
广告
将在 10 秒后关闭
bannerAds