转自:https://www.cnblogs.com/roverliang/p/8431206.html
Docker 使用入门,创建一个Nginx服务器
运行环境: MAC
Docker 版本: Docker version 17.12.0-ce, build c97c6d6
一、启动Nginx 服务器
启动Nginx 服务器,并进入模拟终端
docker run -p 8080:80 --name nginx_web -it nginx /bin/bash
二、了解Nginx 镜像的配置文件位置
日志文件位置:/var/log/nginx
配置文件位置: /etc/nginx
资源存放的位置: /usr/share/nginx/html
上面的配置路径是我电脑上的虚拟linux中地址,请各位读者,也自己去看下自己的配置位置
三、修改Nginx 的默认首页,测试是否可以运行
重要提示:
对于不想折腾的同学,可以直接从第四步来运行
/usr/share/nginx/html
echo "<h1>Hello Docker</h1>" > index.html
到这里有的朋友,可能会发现,我访问localhost:8080 端口,第一次出现了Nginx 的欢迎界面,而第二次就出现了404 提示。
关于这个问题,本文不展开详序,如果不明白的,可以参考:
Docker 执行 docker run
之后,先在当前操作系统的基础上,虚拟化了一个精简版的linux(仅仅包含系统运行的最精简功能),然后加载我们的Nginx镜像。当Nginx镜像加载到我们的虚拟Linux环境中时,相当于在系统里执行了一个脚本,而这个脚本就是Nginx。
由于默认的Nginx 是不作为守护进程运行的。所以当Docker内监听到80端口的请求后,完成之后,就退出了Nginx的进程。该容器内只有一个进程,并且是非守护的,执行完请求进程就销毁了。那么这个容器也就没有存在的必要了,所以Docker 中这个服务也就停掉了。这也就是我们执行 docker top
看不到当前运行的容器的原因。
作为暂时解决Nginx 只执行一次就退出的问题,我们可以进入交互式终端,执行 nginx &
让nginx 作为守护进程后台运行。
查看我们正在运行的容器
roverliang$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如果什么内容都没有,说明当前没有正在运行的容器。
查看已经运行结束的容器
roverliang$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bff285f60b3 nginx "/bin/bash" 9 minutes ago Exited (0) 6 minutes ago nginx_web
重新启动我们刚刚启动过的容器
docker start nginx_web
进入到我们的容器内部
docker attach nginx_web
echo "<h1>Hello Docker</h1>" > /usr/share/nginx/html/index.html
nginx &
然后 使用快捷键 control + Q 退出当前的容器
之后我们在浏览器再次访问:http://localhost:8080/
折腾了这么久,终于看到我们期望的的内容了。
Hello Docker
四、将前面Nginx Demo 变成一个可以玩的 Demo
先创建我们本机需要映射的文件夹
mkdir -p docker_study/log docker_study/etc docker_study/html
注意:
在自己的家目录创建
复制我们docker中nginx 的配置文件
docker cp 65bc23f952db:/etc/nginx/ /Users/roverliang/docker_study/etc/
关闭掉我们的容器
docker stop nginx_web
删除掉我们的练习的demo,我们重新来构建一个可以用的。
docker rm nginx_web
将Nginx 镜像和我们本机的目录进行映射,方便我们修改文件
docker run \
-p 8080:80 \
--name nginx_web \
-v /Users/roverliang/docker_study/log/:/var/log/nginx \
-v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \
-it \
-d \
nginx \
/bin/bash \
运行到这里,我们可能还是会发现访问http://localhost:8080/ 没有内容。但是不要急,解决问题的过程,就是学习新东西的过程,继续网上查资料,参考如下:
摘抄文中让我豁然开朗的一段:
我之前运行的时候,一般都采用交互式:
-i 保证容器的stdin开启-t 为容器生成一个tty终端,在命令的最后加一个/bin/bash来保证可以交互。但是实际上,nginx并没有运行,导致我以为容器的端口绑定不是持久化的。
接下来我们需要关掉,并删除我们的容器,再按照如下的命令重启一个:
docker run \
-p 8080:80 \
--name nginx_web \
-v /Users/roverliang/docker_study/log/:/var/log/nginx \
-v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \
-d \
nginx
五、修改Nginx 配置,解析一个网站
修改我们刚刚复制过来的nginx 配置
cd /Users/roverliang/docker_study/etc
vim nginx.conf
worker_processes 4; #nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
worker_cpu_affinity 00000001 00000010 00000100 00001000;
worker_rlimit_nofile 99999;
error_log error.log;
events { #模块处理网络事件
use epoll;
worker_connections 99999; #每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。 #ulimit -n 查看
}
http{
server_tokens off;
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream linuxidc{
server 47.90.240.1:8081 weight=3;
server 47.90.240.1:8081 weight=2;
}
server {
listen 80;
server_name 47.90.240.115:80;
access_log logs/ebookingtour.log;
location / {
proxy_pass http://linuxidc;
proxy_redirect off;
proxy_intercept_errors on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100M;
proxy_connect_timeout 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
#proxy_buffer_size 64k;
#proxy_buffers 4 32k;
#proxy_busy_buffers_size 256k;
#proxy_temp_file_write_size 512k;
#proxy_ignore_client_abort on;
#proxy_redirect default;
}
#error_page 500 502 503 504 /50x.html;
#location = /50x.html
# root html;
}
upstream wxswx{
server 192.168.168.104:8080;
server 192.168.168.104:8080;
}
}