基于 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的浏览器中,输入这个地址,加上服务的端口即可启用了。