Docker挑战日记 Docker构建Nginx教程 #2
之前的概要
上一次的Docker冒险记。
作者已经掌握了在他心爱的机器上安装和掌握Docker的基础知识Docker Run。
然而,作者并不知道Docker的能力还远远不止这些。
上一篇文章:Docker挑战日记 Docker Run实现HelloWorld#1 – Qiita
引入nginx的概述
尝试引入Nginx 1版本,但这次不使用Docker Run,而是尝试以分解的形式进行。
换句话说,就像之前介绍的那样,我们想要拆分成三个命令的docker run命令。
-
- 拉取Docker镜像
-
- 创建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命令将主机端口号和客户端端口号进行绑定。
换句话说,如果要写具体的方法论,则可以如下述:
这是一个框架。
通过从本地主机访问localhost:18080,可以实现对nginx的80端口进行访问。
-v 体积绑定
接下来,-v,–volume=[主机源:]容器目的地[:<选项>] 这样写着。
这是一种可以在容器内使用主机源的方法。换句话说,如果无法在容器内保存文件,那就可以查看主机端的文件,这就是一种简单的方法。
其他選項和注意事項
当创建容器时,如果仅依靠容器端的信息无法解决问题,我们提前指定选项来解决。除此之外,还有涉及环境变量的选项,如-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。
连接了!
我尝试了以下方法并取得了成功:
1. 下载了 nginx 的镜像。
2. 根据 nginx 镜像绑定了端口和卷,创建了容器。
3. 启动容器并确认能够连接到 nginx 的 Web 服务器。
这次就到这里吧。如果只是想运行脚本,大多数情况下,使用到这一点的内容就可以进行开发了吧?
然而,可以考虑到经过各种服务器的环境。
因此,下一次我想学习有关如何协作使用多个容器。具体来说,我想尝试将RedMine和MySQL进行协作。