基于 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。