Docker离线部署Nginx
总体思路:在有网络的环境上制作Nginx的镜像包,导出并上传至无网络的环境上,启动Nginx即可。
在上一篇 《无网环境Docker Rpm离线安装》 里面,已经在联网的机器上安装好了干净的docker环境,接下来就可以安装自己需要的软件镜像了。
docker镜像保存成 tar 归档文件(导出nginx离线镜像包)
- 1,通过docker search : 从Docker Hub查找需要的镜像。
从 Docker Hub 查找所有镜像名包含 nginx,并且收藏数大于 10 的镜像:sudo docker search -f stars=10 nginx
如下:
图中第一行列出的是官方发布的nginx镜像。
列字段说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
- 2,拉取镜像。
通过docker pull : 从镜像仓库中拉取或者更新指定镜像:sudo docker pull nginx
如下:
说明: 如果:后不写版本号,则默认拉取最新的。如图实际拉取的是标签为tag: latest的nginx:latest镜像。
- 3,创建容器并启动nginx
拉取下来镜像后还需要创建容器并启动nginx才能使用。
# 创建nginx容器并指定映射端口
sudo docker run -d --name nginx_docker -p 8080:80 nginx:latest
说明:
-d: 后台运行容器
-p :指定容器暴露的端口,映射宿主机端口号和容器端口号
--name:指定容器名字,后续可以通过名字进行容器管理
如图:
如果想删除docker容器可以执行:sudo docker rm -f nginx_docker
后面的参数可以是镜像ID或名称。
- 4,访问测试nginx
浏览器中输入你的ip地址 + 端口号,如下图所示:(成功状态)
- 5,创建宿主机配置文件(用于后续挂载nginx配置文件)
cd /usr/local/
mkdir nginx
cd nginx/
mkdir -vp data html logs ssl conf/conf.d
ll
如图:
说明:
data:资源数据
html:静态资源,一般前端页面
logs:nginx日志
ssl:SSL证书(https)
conf:nginx配置,一般配置缓存、限流在这个里面
conf.d: nginx配置,代理、转发、负载、集群
- 5.1,编辑html文件夹下的index.html
cd /usr/local/nginx/html/
sudo vi index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>成功访问nginx</title>
</head>
<body>
<h1>这是用docker启动的</h1>
</body>
</html>
- 5.2,编辑conf文件夹下的nginx.conf
cd /usr/local/nginx/conf/
sudo vi nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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" "$request_time" "$upstream_response_time"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
include /etc/nginx/conf.d/*.conf;
}
- 5.3,编辑conf.d文件夹下的host.conf
cd /usr/local/nginx/conf/conf.d/
sudo vi host.conf
# http转发到后端http
server {
listen 8081;
server_name 10.90.5.70;
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 "http";
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
location / {
proxy_redirect off;
proxy_pass http://10.90.5.70:8081/;
}
}
- 6,创建新的容器并挂载宿主机配置文件启动nginx(开一个相同的服务,端口号不同)
创建新的nginx容器并启动后验证。
# 创建nginx容器并指定映射端口
sudo docker run -d -p 8081:80 --name nginx_docker_2 --restart=always --privileged=true -v /usr/local/nginx/html:/usr/share/nginx/html nginx:latest
如图:
说明:
-d: 后台运行容器
-p :指定容器暴露的端口,映射宿主机端口号和容器端口号
--name:指定容器名字,后续可以通过名字进行容器管理
--restart=always:使容器自动启动
--privileged=true:开启特权模式(如遇到权限问题错误,可加此参数)
-v:挂载宿主机目录和 docker容器中的目录,前面是宿主机目录,后面是容器内部目录
- 7,测试(挂载宿主机配置文件)
浏览器中输入你的ip地址 + 端口号,如下图所示:(成功状态)
- 7.1,进入nginx容器查看版本
# 进入nginx容器
sudo docker exec -it nginx_docker_2 bash
# 查看版本
nginx -v
如图:
- 8,停止并删除容器(测试完废弃了就可以删除)
# 停止并删除容器(容器ID或名称都行)
sudo docker rm -f 97c4b81efbc8
sudo docker rm -f nginx_docker_2
- 9,docker镜像保存成 tar 归档文件(导出nginx离线镜像包)
# 进入nginx容器
sudo docker save -o nginx-v1.23.2-dockerimage.tar nginx:latest
如图:
将镜像包.tar上传至无网络的环境上创建并启动
- 1,将镜像包nginx.tar上传至无网络的环境上执行导入。
docker load : 导入使用 docker save 命令导出的镜像。执行:
# 在.tar所在位置执行
sudo docker load -i nginx-v1.23.2-dockerimage.tar
# 检查本地镜像仓库
sudo docker images
如图(成功):
- 2,直接创建并启动nginx
命令:
# 建议提前创建本地映射目录及配置文件,前面讲过这里不再赘述。
sudo docker run -dit --name nginx_docker -p 8080:80 -p 8081:8081 -p 8443:443 --add-host web1.test.com:10.90.3.101 --add-host web2.test.com:10.90.3.102 --restart=always --privileged=true -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/conf/conf.d/:/etc/nginx/conf.d -v /usr/local/nginx/log:/var/log/nginx -v /usr/local/nginx/html:/usr/share/nginx/html -v /usr/local/nginx/ssl:/etc/nginx/cert nginx:latest
# 上面那一行命令太长不方便阅读,可以改成多行形式(每行末尾反转义换行符),效果是一样的。
sudo docker run -dit --name nginx_docker \
-p 8080:80 \
-p 8081:8081 \
-p 8443:443 \
--add-host web1.test.com:10.90.3.101 \
--add-host web2.test.com:10.90.3.102 \
--restart=always \
--privileged=true \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf/conf.d/:/etc/nginx/conf.d \
-v /usr/local/nginx/log:/var/log/nginx \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/ssl:/etc/nginx/cert \
nginx:latest
# 检查容器运行状态
sudo docker ps -a
如图:
查看容器日志:
说明:
-d: 后台运行容器
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-p :指定容器暴露的端口,映射宿主机端口号和容器端口号。指定端口映射,格式为:主机(宿主)端口:容器端口
--volume , -v: 绑定一个卷(本地路径或文件映射)
--name:指定容器名字,后续可以通过名字进行容器管理
--restart=always:使容器自动启动
--privileged=true:开启特权模式(如遇到权限问题错误,可加此参数)
--add-host:使用docker run的--add-host命令选项,将要访问的其他服务器的host和ip加入到/etc/hosts文件。--add-host命令选项表示,在启动容器时,向/etc/hosts文件添加一个host:ip的映射。
- 3,测试
浏览器中输入你的ip地址 + 端口号,如下图所示:(成功状态)
重启docker容器里的nginx服务
如果修改了nginx配置文件,需要重启服务才能生效。
方法一:通过docker命令重启
sudo docker exec nginx_docker sh -c "nginx -t"
sudo docker exec nginx_docker sh -c "nginx -s reload"
如图:
方法二:进入docker容器内执行nginx命令重启
sudo docker exec -it nginx_docker sh
nginx -t
nginx -s reload