基于 Docker 安装 Nginx,启动运行,外网访问,映射配置文件

基于 Docker 安装 Nginx
查找Nginx镜像
语法:docker search nginx
示例:

[root@izbp13xko46hud9vfr5s94z ~]# docker search nginx
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                                  Official build of Nginx.                        8834                [OK]                
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con…   1348                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of…   579                                     [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as p…   380                                     [OK]
kong                                                   Open-source Microservice & API Management la…   194                 [OK]                
webdevops/php-nginx                                    Nginx with PHP-FPM                              106        
^^^^^^^^略更多                      
[root@izbp13xko46hud9vfr5s94z ~]#

获取Nginx镜像

docker pull nginx  #这种方法获取的是最新片的nginx。

示例:

[root@izbp13xko46hud9vfr5s94z ~]# docker pull nginx 
Using default tag: latest
latest: Pulling from library/nginx
f2aa67a397c4: Already exists 
1cd0975d4f45: Pull complete 
72fd2d3be09a: Pull complete 
Digest: sha256:3e2ffcf0edca2a4e9b24ca442d227baea7b7f0e33ad654ef1eb806fbd9bedcf0
Status: Downloaded newer image for nginx:latest
[root@izbp13xko46hud9vfr5s94z ~]#

启动nginx容器实例

[root@izbp13xko46hud9vfr5s94z ~]# docker run -d --name nginx nginx
30c68de4884ef8a46ebe9c9dc4392f6ed3b74071d653dd1ce4c8b0847b0f5686
[root@izbp13xko46hud9vfr5s94z ~]#

说明:--name nginx nginx 第一个nginx是通过--name指定的nginx容器实例的名称,另一个nginx表示nginx仓库的名称。

查看nginx容器实例的进程信息

[root@izbp13xko46hud9vfr5s94z ~]# docker top nginx
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                25255               25233               0                   11:28               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 25363               25255               0                   11:28               ?                   00:00:00            nginx: worker process
[root@izbp13xko46hud9vfr5s94z ~]#

通过ps -ef | grep nginx查看

[root@izbp13xko46hud9vfr5s94z ~]# ps -ef | grep nginx 
root     25255 25233  0 11:28 ?        00:00:00 nginx: master process nginx -g daemon off;
101      25363 25255  0 11:28 ?        00:00:00 nginx: worker process
root     25386 24942  0 11:31 pts/4    00:00:00 grep --color=auto nginx
[root@izbp13xko46hud9vfr5s94z ~]# 

进入nginx容器内

[root@izbp13xko46hud9vfr5s94z static]# docker exec -it nginx bash 
root@c8e3cdeca4ca:/# ls

杀死nginx容器实例

[root@izbp13xko46hud9vfr5s94z ~]# docker kill -s KILL 4a3ae8c39144
4a3ae8c39144
[root@izbp13xko46hud9vfr5s94z ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
356c999b5cd0        mysql               "docker-entrypoint.s…"   6 days ago          Up 6 days           3306/tcp            mysql
0d622f7cd0a4        redis               "docker-entrypoint.s…"   12 days ago         Up 12 days          6379/tcp            some-redis
[root@izbp13xko46hud9vfr5s94z ~]#

停止nginx实例

[root@izbp13xko46hud9vfr5s94z ~]# docker stop nginx 
nginx
[root@izbp13xko46hud9vfr5s94z ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
356c999b5cd0        mysql               "docker-entrypoint.s…"   6 days ago          Up 6 days           3306/tcp            mysql
0d622f7cd0a4        redis               "docker-entrypoint.s…"   12 days ago         Up 12 days          6379/tcp            some-redis
[root@izbp13xko46hud9vfr5s94z ~]#

启动nginx容器实例

[root@izbp13xko46hud9vfr5s94z ~]# docker start nginx 
nginx

重启nginx容器实例

[root@izbp13xko46hud9vfr5s94z ~]# docker restart nginx 
nginx
[root@izbp13xko46hud9vfr5s94z ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4a3ae8c39144        nginx               "nginx -g 'daemon of…"   31 minutes ago      Up 2 seconds        80/tcp              nginx
356c999b5cd0        mysql               "docker-entrypoint.s…"   6 days ago          Up 6 days           3306/tcp            mysql
0d622f7cd0a4        redis               "docker-entrypoint.s…"   12 days ago         Up 12 days          6379/tcp            some-redis
[root@izbp13xko46hud9vfr5s94z ~]#

移除nginx容器实例

[root@izbp13xko46hud9vfr5s94z ~]# docker rm -f -v 4a3ae8c39144
4a3ae8c39144
[root@izbp13xko46hud9vfr5s94z ~]#

案例
暴露外部端口
基于docker run -d --name nginx nginx方法启动nginx后,Docker 容器并没有对外暴露访问的端口,即无法通过当前主机外部浏览器器访问nginx。那么该怎么样呢?

语法:

docker run --name nginx -d -p 80:80 nginx 

-p 80:80:通过-p来指定Docker容器中nginx实例对外开放的端口。本例中,第一个80端口是对外开放的端口,第二个80端口指对外开放的端口映射到容器里的端口号。

示例:

[root@izbp13xko46hud9vfr5s94z ~]# docker run --name nginx -d -p 80:80 nginx 
7ed656da5864e18429aba08cf09a0a43d9f8138a60935b4d3aff2691ae050a62
[root@izbp13xko46hud9vfr5s94z ~]# docker top nginx 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                20517               20503               0                   13:43               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 20557               20517               0                   13:43               ?                   00:00:00            nginx: worker process
[root@izbp13xko46hud9vfr5s94z ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
7ed656da5864        nginx               "nginx -g 'daemon of…"   19 seconds ago      Up 19 seconds       0.0.0.0:80->80/tcp   nginx
[root@izbp13xko46hud9vfr5s94z ~]#

通过当前主机外的浏览器访问nginx,如下图:

指定外部的配置文件
语法:

docker run --name nginx -p 80:80 -v /develop/nginx/nginx.conf:/etc/nginx/nginx.conf -v /develop:/develop -d nginx

说明:
-v: 表示挂载一个本机目录或文件到容器里。
-v /develop/nginx/nginx.conf:/etc/nginx/nginx.conf:将/develop/nginx/nginx.conf配置文件挂载到容器中/etc/nginx/nginx.conf这个配置文件中。
-v /develop:/develop:将/develop这个目录挂载到容器里的/develop这个目录里。

示例:

[root@izbp13xko46hud9vfr5s94z ~]# docker run --name nginx -p 80:80 -v /develop/nginx/nginx.conf:/etc/nginx/nginx.conf -v /develop:/develop -d nginx
c8e3cdeca4cac893c3f5b4aa055393dc69410059425bac9b99e9140ead50da45
[root@izbp13xko46hud9vfr5s94z ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
c8e3cdeca4ca        nginx               "nginx -g 'daemon of…"   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp   nginx
[root@izbp13xko46hud9vfr5s94z ~]#

注意事项:指定外部配置文件,同时需要指定nginx的首页面,否则会抛出404错误,原因就是因为nginx找不到配置文件中默认的index页面。
本例中,使用/develop/apps/static/index.html替代了容器里的nginx默认的index页面,同时,-v /develop:/develop挂载根目录即可访问子目录。

外网访问

Bridge 默认模式,有独立的namespace,会有独立的IP和端口
Host 和主机共同使用一个namespace,不需要分配IP
None  没有网络
–net=bridge— 默认选项,用网桥的方式来连接docker容器。
–net=host— docker跳过配置容器的独立网络栈。
–net=container:NAME_or_ID— 告诉docker让这个新建的容器使用已有容器的网络配置。
–net=none— 告诉docker为新建的容器建立一个网络栈,但不对这个网络栈进行任何配置,所以只能访问本地网络,没有外网。
-p 是指定本机端口到容器端口
-P 是随机本机端口到容器端口

指定网络模式:--net=bridge 默认模式

docker run -d -p 8080:80 --net=bridge index.tenxcloud.com/docker_library/nginx

其中8080是指主机的端口,而80是指容器的端口
我们先看一下端口的状态

netstat -na|grep 8080  #容器内查看端口信息
docker port name  #或者 ——查看端口信息
docker-machine ip default #查看ip
特别注意:本文是在Windows下对docker端口进行映射,但是当你在主机的浏览器中,打开localhost:port无法访问对应的服务。
解决方案

docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows。我们可以通过命令:

docker-machine ip default

找到这个Linux的ip地址,一般情况下这个地址是192.168.99.100,然后在Windows的浏览器中,输入这个地址,加上服务的端口即可启用了。


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342