nginx安装

下载镜像并测试

1.docker pull nginx
2.docker images nginx 查看我们拉取到本地的nginx镜像IMAGE ID
3.首先测试下nginx镜像是否可用,使用docker run -d --name mynginx -p 80:80 imgae ID创建并启动nginx容器

将nginx容器内部配置文件挂载到主机

将nginx容器内部配置文件挂载到主机,之后就可以在主机对应目录修改即可。适合频繁修改,复杂使用的情况

1.在主机/mnt目录下执行 mkdir -p ./nginx/{conf,html,logs}创建挂载目录
2.将容器内的nginx.conf与default.conf文件分别拷贝到主机/mnt/nginx和/mnt/nginx/conf下,分别执行

docker cp ef:/etc/nginx/nginx.conf ./
docker cp ef:/etc/nginx/conf.d/default.conf ./conf/

cp 命令代表复制
ef是我们nginx容器的ID,/etc/nginx/nginx.conf 是容器内部nginx.conf 路径
3.执行docker stop 容器ID 命令停止刚刚创建的nginx容器,b3是容器Id,然后执行docker rm 容器ID 移除容器。
4.执行下方命令重建容器

docker run -d --name mynginx -p 80:80 -p 443:443 -v /mnt/nginx/nginx.conf:/etc/nginx/nginx.conf -v /mnt/nginx/logs:/var/log/nginx -v /mnt/nginx/html:/usr/share/nginx/html -v /mnt/nginx/conf:/etc/nginx/conf.d -v /mnt/nginx/ssl:/ssl --privileged=true 容器ID

-v 挂载目录,格式 -v: 表示将主机目录与容器目录之间进行共享,
--privileged=true 容器内部对挂载的目录拥有读写等特权

5.这时我们在容器的挂载 /mnt/nginx/html目录下创建index.html,内容随便写上hello docker nginx,再次访问主机IP

到这里就大功告成了!

需要注意的:我们在挂载目录的操作,都实际会映射到容器内部,写配置文件的时候一定要注意路径问题!!(我在配置SSL的时候浪费了很长的时间不清楚最后是什么原因,在配置SSL文件路径的时候一定要写对应的docker容器内部地址,否则会找不到。)

贴一个nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
 	include       mime.types;
    	default_type  application/octet-stream;
	sendfile on;
	gzip on;
	client_max_body_size 10m;
	map $http_upgrade $connection_upgrade {
		default upgrade;
		'' close;
	}

	upstream tomcat1 {
		server 172.17.0.1:8080;
	}
    server {
        #SSL 访问端口号为 443
        listen 443 ssl; 
        #填写绑定证书的域名
        server_name www.xxx.com; 
        #证书文件名称
        ssl_certificate /ssl/xxx.crt; 
        #私钥文件名称
        ssl_certificate_key /ssl/xxx.key; 
	#ssl_session_cache   shared:SSL:5m;
        ssl_session_timeout 5m;
	#keepalive_timeout   70;
        #请按照以下协议配置
        ssl_protocols TLSv1.2 TLSv1.3; 
        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;

	location /html{
	#alias配置静态vue项目的时候用,之前用了root一直没法访问浪费我1天时间才找到问题所在
	#root和alias的区别(根据实际需求选择用哪个)
	#root会在目录后加上location后的路径,在本示例就是/usr/share/nginx/html/dist/html才能正确访问到
	#alias就是绝对地址,在本示例把前端放 /usr/share/nginx/html/dist 下就可以
	#注意:此处一定要写挂载目录对应的docker容器内的路径,而不是物理机的路径
	#例如:物理机/mnt/nginx/html 挂载到docker容器内的usr/share/nginx/html
	#你把vue项目放到/mnt/nginx/html下的时候,一定不能直接写这个目录,而要写对应容易的目录usr/share/nginx/html
	alias /usr/share/nginx/html/dist;
    		index index.html;
	}

	
	location / {
		proxy_ssl_server_name on;
		#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
		#root html; 
		proxy_set_header           X-Forwarded-Proto https;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_pass   http://tomcat1;
		#index  index.html index.htm;
	 }

   }

	server{
	listen 80;
	server_name www.xxx.com;
	location / {
		proxy_read_timeout 360s; 
		proxy_pass http://tomcat1;
		proxy_set_header Host $host:$server_port;
		proxy_http_version 1.1;
		#websocket用
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
	}
   }

}