本文将分享docker笔记【部署Nginx】的详细内容,并且还将对docker部署nginx应用进行详尽解释,此外,我们还将为大家带来关于167dockerdocker构建nginx容器系列问题doc
本文将分享docker 笔记 【部署 Nginx】的详细内容,并且还将对docker部署nginx应用进行详尽解释,此外,我们还将为大家带来关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、6 项目部署 nginx/pm2/docker、Django-Docker容器化部署:Django-Docker-MySQL-Nginx-Gunicorn云端部署、docker nginx 部署多个项目的相关知识,希望对你有所帮助。
本文目录一览:- docker 笔记 【部署 Nginx】(docker部署nginx应用)
- 167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
- 6 项目部署 nginx/pm2/docker
- Django-Docker容器化部署:Django-Docker-MySQL-Nginx-Gunicorn云端部署
- docker nginx 部署多个项目
docker 笔记 【部署 Nginx】(docker部署nginx应用)
部署 Nginx
docker 安装 Nginx
#1、搜索镜像 search
#2、下载镜像 pull
#3、运行测试
[zjf@iZwz9ancymzviwhi3qyj0gZ ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 8 days ago 133MB
centos latest 300e315adb2f 6 weeks ago 209MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[zjf@iZwz9ancymzviwhi3qyj0gZ ~]$ docker run -d --name=nginx01 -p 3050:80 nginx
5cfb38ac73d8b853b3b386e85e2841314fc4c43a8fe0e81a37ea5f5c91b5532c
[zjf@iZwz9ancymzviwhi3qyj0gZ ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5cfb38ac73d8 nginx "/docker-entrypoint.…" 11 seconds ago Up 6 seconds 0.0.0.0:8100->80/tcp nginx01
894b14fd2519 centos "/bin/bash" 29 minutes ago Up 28 minutes
# 测试访问
[zjf@iZwz9ancymzviwhi3qyj0gZ ~]$ curl localhost:3050
# 进入容器内部查看
[zjf@iZwz9ancymzviwhi3qyj0gZ ~]$ docker exec -it nginx01 /bin/bash
root@bc25865d7f29:/# cd /etc/nginx/
root@bc25865d7f29:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@bc25865d7f29:/etc/nginx# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑
1.nginx服务器根目录问题
docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同
eg:
run一个niginx容器
<span>//80端口被占用,so...</span> $ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <span>1801</span>a32aab54 nginx <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago Up <span>2</span> minutes <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-></span><span>800</span>/tcp berserk_kare
进入容器内部
<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash root<span>@1801a32aab54</span><span>:/</span><span># </span>
查看nginx目录
<span># cd /etc/nginx/</span> conf<span>.d</span>/ koi-utf mime<span>.types</span> nginx<span>.conf</span> uwsgi_params fastcgi_params koi-win modules/ scgi_params win-utf
可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled
继续查看nginx配置
<span># cat /conf.d/default.conf</span><span>server</span> { listen <span>80</span>; server_name localhost; <span>#charset koi8-r;</span><span>#access_log /var/log/nginx/log/host.access.log main;</span> location / { root /usr/share/nginx/html; <span>index</span><span>index</span>.html <span>index</span>.htm; } <span>#error_page 404 /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span> error_page <span>500</span><span>502</span><span>503</span><span>504</span> /<span>50</span>x.html; location = /<span>50</span>x.html { root /usr/share/nginx/html; } <span>#...省略php-fpm配置,好长..</span> }
根目录配置: root /usr/share/nginx/html;
测试
<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" >index.html</span>
php-fpm配置相关
'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
6 项目部署 nginx/pm2/docker
课程⽬目标
-
Nginx
- 静态资源location
- 动态数据请求proxy
- 负载均衡
- 了了解cluster原理理
- 掌握pm2部署NodeJS服务
参考⽂文档
使⽤用pm2+nginx部koa2(https)https://www.zhaofinger.com/de...
课程内容
cluster模块
-
主要解决问题
- 故障恢复
- 多核利利⽤用
- http://www.sohu.com/a/2477325...
- 多进程共享端⼝口
⽂件上传服务器器
-
scp (最原始)
scp docker-compose.yml root@47.98.252.43:/root/source/ #⽂件 scp -r mini-01 root@47.98.252.43:/root/source/ #⽂件夹
- git (实际⼯工作中)
- deploy插件 (debug)
PM2的应⽤
- 内建负载均衡(使⽤用Node cluster 集群模块、⼦子进程,可以参考朴灵的《深⼊入浅出node.js》⼀一书第九章)
- 线程守护,keep alive
- 0秒停机重载,维护升级的时候不不需要停机.
- 现在 Linux (stable) & MacOSx (stable) & Windows (stable).多平台⽀支持
- 停⽌止不不稳定的进程(避免⽆无限循环)
- 控制台检测https://id.keymetrics.io/api/...
- 提供 HTTP API
配置
npm install -g pm2
pm2 start app.js --watch -i 2
// watch 监听⽂文件变化
// -i 启动多少个实例例
pm2 stop all
pm2 list
pm2 start app.js -i max # 根据机器器CPU核数,开启对应数⽬目的进程,那么每次都要执行这个命令不是很麻烦?
配置process.yml
apps:
- script : app.js
instances: 2
watch : true
env :
NODE_ENV: production
-
启动配置
pm2 start process.yml
-
Keymetrics在线监控 https://id.keymetrics.io/api/...
pm2 link 8hxvp4bfrftvwxn uis7ndy58fvuf7l TARO-SAMPLE
-
pm2设置为开机启动
pm2 startup
Nginx 反向代理理 + 前端打包Dist
安装
yum install nginx
-----
apt update
apt install nginx
添加静态路路由
# /etc/nginx/sites\-enable/taro
server {
listen 80;
server\_name taro.josephxia.com;
location / {
root /root/source/taro\-node/dist;
index index.html index.htm;
}
}
# 验证Nginx配置
nginx -t
# 重新启动Nginx
service restart nginx
nginx -s reload
\# /etc/nginx/sites\-enable
\# taro
server {
listen 80;
server_name taro.josephxia.com;
location / {
root /root/source/taro-node/dist;
index index.html index.htm;
}
location ~ \\.(gif|jpg|png)$ {
root /root/source/taro-node/server/static;
}
location /api {
proxy\_pass http://127.0.0.1:3000;
proxy\_redirect off;
proxy\_set\_header Host $host;
proxy\_set\_header X\-Real\-IP $remote\_addr;
proxy\_set\_header X\-Forwarded\-For $proxy\_add\_x\_forwarded\_for;
}
}
# 查看配置⽂文件位置
nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
#重启
service nginx restart
Docker
概念
- 操作系统层⾯面的虚拟化技术
- 隔离的进程独⽴立于宿主和其它的隔离的进程 - 容器器
- GO语⾔言开发
特点
- ⾼高效的利利⽤用系统资源
- 快速的启动时间
- ⼀一致的运⾏行行环境
- 持续交付和部署
- 更更轻松的迁移
对⽐比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使⽤用 | 一般为 MB | 一般为 GB |
性能 | 接近原⽣生 | 弱于 |
系统⽀支持量量 | 单机⽀支持上千个容器器 | ⼀一般⼏几⼗十个 |
三个核⼼心概念
- 镜像
- 容器
- 仓库
Docker基本使⽤用
- 构建⼀一个Nginx服务器器
-
拉取官⽅方镜像
# 拉取官⽅方镜像 docker pull nginx # 查看 docker images nginx # 启动镜像 mkdir www echo ''hello docker!!'' >> www/index.html # 启动 # www⽬目录⾥里里⾯面放⼀一个index.html docker run -p 80:80 -v $PWD/www:/usr/share/nginx/html -d nginx # 查看进程 docker ps docker ps -a // 查看全部 # 伪终端 ff6容器器的uuid # -t 选项让Docker分配⼀一个伪终端(pseudo-tty)并绑定到容器器的标准输⼊入上, # -i 则让容器器的标准输⼊入保持打开 docker exec -it ff6 /bin/bash # 停⽌止 docker stop ff6 # 删除镜像 docker rm ff6
Dockerfile定制镜像
#Dockerfile
FROM nginx:latest
RUN echo ''<h1>Hello, Kaikeba!</h1>'' > /usr/share/nginx/html/index.html
# 定制镜像
docker build -t mynginx .
# 运⾏行行
# -d 守护态运⾏行行
docker run -p 80:80 -d mynginx
定制⼀一个程序NodeJS镜像
npm init -y
npm i koa -s
// package.json
{
"name": "myappp",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1" },
"keywords": \[\],
"author": "",
"license": "ISC",
"description": "myappp",
"dependencies": {
"koa": "^2.7.0"
}
}
// app.js
const Koa \= require(''koa'')
const app \= new Koa()
app.use(ctx \=> {
Math.random() \> 0.8 ? abc() : ''''
ctx.body \= ''Hello Docker''
})
app.listen(3000, () \=> {
console.log(''app started at http://localhost:3000/'')
})
#Dockerfile
#制定node镜像的版本
FROM node:10-alpine
#移动当前⽬目录下⾯面的⽂文件到app⽬目录下
ADD . /app/
#进⼊入到app⽬目录下⾯面,类似cd
WORKDIR /app
#安装依赖
RUN npm install
#对外暴暴露露的端⼝口
EXPOSE 3000
#程序启动脚本
CMD ["node", "app.js"]
# 定制镜像
docker build -t mynode .
# 运⾏行行
docker run -p 3000:3000 -d mynode
Pm2 - 利⽤多核资源
# .dockerignore
node_modules
// process.yml
{
"apps": [{
"name": "app-name",
"script": "app.js",
"instances": 2,
"env": {
"production": true
}
}\]
}
# Dockerfile
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \
npm i
EXPOSE 3000
#pm2在docker中使⽤用命令为pm2-docker
CMD ["pm2-runtime", "start", "process.yml"]
# 定制镜像
docker build -t mypm2 .
# 运⾏行行
docker run -p 3000:3000 -d mypm2
Docker-Compose
#docker-compose.yml
app-pm2:
container_name: app-pm2
#构建容器器
build: .
# volumes:
# - .:/usr/src/app
ports:
- "3000:3000"
// 强制重新构建并启
# --force-recreate 强制重建容器器
# --build 强制编译
docker-compose up -d --force-recreate --build
#docker-compose.yml
version: ''3.1''
services:
nginx:
image: nginx:kaikeba
ports:- 80:80
# 运⾏
docker-compose up
# 后台运行
docker-compose up -d
部署Mongo + MongoExpress
#docker-compose.yml
version: ''3.1''
services:
mongo:
image: mongo
restart: always
ports:- 27017:27017
mongo-express:
image: mongo-express
restart: always
ports:- 8081:8081
代码中添加Mongoose调⽤用
// mongoose.js
const mongoose = require("mongoose");
// 1.连接
mongoose.connect("mongodb://mongo:27017/test", { useNewUrlParser: true });
const conn = mongoose.connection;
conn.on("error", () => console.error("连接数据库失败"));
// app.js
const mongoose = require(''mongoose'');
mongoose.connect(''mongodb://mongo:27017/test'', {useNewUrlParser: true});
const Cat = mongoose.model(''Cat'', { name: String });
Cat.deleteMany({})
const kitty = new Cat({ name: ''Zildjian'' });
kitty.save().then(() => console.log(''meow''));
app.use(async ctx => {
ctx.body = await Cat.find()
})
Github WebHook实现CI持续集成
- 启动NodeJS监听
var http \= require(''http'')
var createHandler \= require(''github-webhook-handler'');
var handler \= createHandler({path: ''/webhooks'', secret: ''myHashSecret''})
// 上⾯面的 secret 保持和 GitHub 后台设置的⼀一致
function run\_cmd(cmd, args, callback) {
var spawn \= require(''child\_process'').spawn;
var child \= spawn(cmd, args);
var resp \= "";
child.stdout.on(''data'', function (buffer) {
resp += buffer.toString();
});
child.stdout.on(''end'', function () {
callback(resp)
});
}
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode \= 404
res.end(''no such location'')
})
}).listen(3000)
handler.on(''error'', function (err) {
console.error(''Error:'', err.message)
})
handler.on(''\*'', function (event) {
console.log(''Received \*'', event.payload.action);
// run\_cmd(''sh'', \[''./deploy-dev.sh''\], function(text){
console.log(text)
})
handler.on(''push'', function (event) {
console.log(''Received a push event for %s to %s'',
event.payload.repository.name,
event.payload.ref);
// 分⽀支判断
if (event.payload.ref \=== ''refs/heads/master'') {
console.log(''deploy master..'')
}
// run\_cmd(''sh'', \[''./deploy-dev.sh''\], function(text){
console.log(text)
})
handler.on(''issues'', function (event) {
console.log(''Received an issue event for % action=%s: #%d %s'',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title)
})
Django-Docker容器化部署:Django-Docker-MySQL-Nginx-Gunicorn云端部署
上一章我们实现了在 Docker 中添加了 MySQL 数据库,但采用的开发服务器虽然使用便捷,但性能差、可靠性低,无法应用在生产环境中。
因此本章将实现 Docker + Django + MySQL + Nginx + Gunicorn 容器项目,完成最终的服务器部署。
直接进入本章的 Docker 入门读者,建议回到教程第一章开始阅读,否则某些内容不好理解。对 Django 项目部署都没有概念的读者,还可以先阅读我的博文:将 Django 项目部署到服务器。
Docker-compose
在部署到服务器之前,先来尝试本地部署。
在上一章的基础上,继续修改 docker-compose.yml
配置:
version: "3"
services:
app:
restart: always
build: .
command: bash -c "python3 manage.py collectstatic --no-input && python3 manage.py migrate && gunicorn --timeout=30 --workers=4 --bind :8000 django_app.wsgi:application"
volumes:
- .:/code
- static-volume:/code/collected_static
expose:
- "8000"
depends_on:
- db
networks:
- web_network
- db_network
db:
image: mysql:5.7
volumes:
- "./mysql:/var/lib/mysql"
ports:
- "3306:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=mypassword
- MYSQL_DATABASE=django_app
networks:
- db_network
nginx:
restart: always
image: nginx:latest
ports:
- "8000:8000"
volumes:
- static-volume:/code/collected_static
- ./config/nginx:/etc/nginx/conf.d
depends_on:
- app
networks:
- web_network
networks:
web_network:
driver: bridge
db_network:
driver: bridge
volumes:
static-volume:
有点复杂。来看看大体思路:
- 定义了 3 个容器,分别是
app
、db
和nginx
。容器之间通过定义的端口进行通讯。 - 定义了 2 个网络,分别是
web_network
和db_network
。只有处在相同网络的容器才能互相通讯。不同网络之间是隔离的,即便采用同样的端口,也无法通讯。 - 定义了 1 个数据卷,
static-volume
。数据卷非常适合多个容器共享使用同一数据,你可以看到app
和nginx
都用到了它。 -
expose
和ports
都可以暴露容器的端口,区别是 expose 仅暴露给其他容器,而 ports 会暴露给其他容器和宿主机。
这么讲可能还是很难理解,让我们继续分解。
网络 network
Docker 允许用户给每个容器定义其工作的网络,只有在相同的网络之中才能进行通讯。你可以看到 nginx
容器处于 web_network
网络,而 db
容器处于 db_network
网络,因此它两是无法通讯的,实际上确实也不需要通讯。而 app
容器同时处于 web_network
和 db_network
网络,相当于是桥梁,连通了3个容器。
定义网络可以隔离容器的网络环境,也方便运维人员一眼看出网络的逻辑关系。
数据卷
之前我们见识过的用于映射宿主机和容器目录的卷了,实际上称为挂载;现在新出现的 static-volume
才叫卷。它的使用方式像这样:static-volume:/code/collected_static
,冒号后面还是容器内的目录,但冒号前的却不是宿主机目录、仅仅是卷的名称而已。从本质上讲,数据卷也是实现了宿主机和容器的目录映射,但是数据卷是由 Docker 进行管理的,你甚至都不需要知道数据卷保存在宿主机的具体位置。
相比挂载,数据卷的优点是由于是 Docker 统一管理的,不存在由于权限不够引发的挂载问题,也不需要在不同服务器指定不同的路径;缺点是它不太适合单配置文件的映射。
和挂载一样,数据卷的生命周期脱离了容器,删除容器之后卷还是存在的。下次构建镜像时,指定卷的名称就可以继续使用了。
既然 Docker 能够管理卷,所以要想删除卷也是非常容易的。指令嘛,我不告诉你,生产环境千万不要手贱。定期备份数据是个好习惯。
数据卷有个很重要的特性:启动时如果卷是空的,则会将容器映射目录的所有内容复制到卷里去。换句话说就是,只要卷初始化完成后,容器原始的 collected_static
目录就不会再使用了,新增的文件也只存在于卷中,容器中是没有的。
实际上 static 静态文件(以及 media 媒体文件)的持久存储,通过挂载或者数据卷都可以实现;具体用哪种,这个就见仁见智了,你自己选择。
篇幅有限,教程没有讲到 media 媒体文件,但它的设置和 static 是完全相同的。
其他配置
首先修改 Nginx 的配置文件,即映射到 nginx
容器的 config/nginx/django_app.conf
:
upstream app {
ip_hash;
server app:8000;
}
server {
listen 8000;
server_name localhost;
location /static/ {
autoindex on;
alias /code/collected_static/;
}
location / {
proxy_pass http://app/;
}
}
此配置下 Nginx 会监听容器的 8000 端口,并将受到的请求发送到 app
容器(静态文件请求除外)。
在 requirements.txt
文件中增加 gunicorn
库:
django==2.2
mysqlclient==1.3.14
gunicorn==19.9.0
最后修改 django_app/settings.py
的域和静态文件存放目录的配置:
...
ALLOWED_HOSTS = [''*'']
...
STATIC_ROOT = os.path.join(BASE_DIR, ''collected_static'')
STATIC_URL = ''/static/''
所有配置就完成了。
教程使用空的 Django 项目,为演示效果,就没有修改 DEBUG=False 了。若你用的自己的项目测试,记得把它为 False。
测试
测试指令就一条:
$ docker-compose up
浏览器访问 127.0.0.1:8000
又看到熟悉的 Django 小火箭了。
和上一章类似,第一次启动容器时可能会出现无法连接 MySQL 的错误,这是由于虽然 db 容器已经启动,但初始化并未完成;重新启动容器之后就可以正常工作了。若多次启动都无法正常工作,那就是别的原因了,好好检查吧。
本地部署成功,下一步服务器部署。
服务器部署
有了本地部署的经验,服务器部署就非常非常简单了。
还是类似的,部署前将 Docker 、 Docker-compose 、 Python3 等工具在服务器上安装好;将项目用 Git 克隆到服务器本地。
接下来把 settings.py
、config/nginx/django_app.conf
、requirements.txt
相关位置都按教程流程改好;将 docker-compose.yml
和 Dockerfile
复制到服务器。
由于 http 请求默认为 80 端口,所以为了接收公网请求,还需要做一点点修改 docker-compose.yml
的工作:
version: "3"
services:
app:
...
command: bash -c "... your_project_name.wsgi:application" # 改为你的项目名称
...
db:
...
nginx:
...
ports:
- "80:8000" # 监听 80 端口
...
networks:
...
volumes:
...
修改 Gunicorn 绑定的项目名称,以及让宿主机监听公网 http 默认的 80 端口。
此外还要修改 config/nginx/django_app.conf
:
upstream your_domain_name {
ip_hash;
server app:8000;
}
server {
...
location / {
proxy_pass http://your_domain_name/;
}
}
这个改动主要是为了照顾各种第三方登录的回调地址(不改这里, GitHub、Weibo 三方登录都会失败)。如果你没有类似的需求,不改也是可以的。比如博主的个人网站是 www.dusaiphoto.com
,所以这里的 your_domain_name
就修改为 www.dusaiphoto.com
。
最后,记得将 settings.py
中的 DEBUG 配置修改好:
# DEBUG=True 注释掉
DEBUG=False
这样就可以了!构建镜像并启动容器:
docker-compose up
在浏览器中就可以正常访问你的网站了。
总结
现在你已经可以部署一个线上的容器化 Django 项目了,恭喜!
若本教程对你有帮助,请到GitHub给个 Star 哟,也欢迎阅读我的Django 搭建博客教程。
老朋友们,下个教程见!
- 有疑问请在杜赛的个人网站留言,我会尽快回复。
- 教程示例代码:django-docker-tutorial
- 或Email私信我:dusaiphoto@foxmail.com
docker nginx 部署多个项目
前提条件
- 1、本地电脑和服务器已安装 docker,下载方法自行谷歌吧
- 2、在 docker hub 上已有账号, 注册传送门: https://hub.docker.com/
- 3、需要对 docker 已有所熟悉 ,并了解Dockerfile里的一些指令
使用Dockerfile 制作镜像
假如本机有一个叫web的项目
在web根目录下新建Dockerfile,写入以下内容
FROM nginx:1.13.6-alpine
LABEL maintainer="lilywang <lilywang.cd@gmail.com>"
ARG TZ="Asia/Shanghai"
ENV TZ ${TZ}
RUN apk upgrade --update \
&& apk add bash tzdata \
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& rm -rf /var/cache/apk/*
COPY dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
此时web里的文件结构为:
.
|____Dockerfile
|____dist // 为项目打包后的文件
| |____index.html
接下来在bash 进入到web目录
cd web
docker build -t lilywang711/web .
请把lilywang711替换成你的 docker hub 的用户名,web 是项目名称
看到打印信息中有如下就说明镜像已经构建成功了
Successfully built 4c050212ce0d
Successfully tagged lilywang711/web:latest
也可以输入docker images
查看当前的镜像列表
接下来输入命令 docker push lilywang711/web
就可将刚才构建好的镜像上传到docker hub里面,方便等会儿我们在服务端拉取镜像
如果是有多个项目需要部署,那就按照以上步骤重复来就行,有多少个项目就构建多少个镜像
服务端部署
ssh 登陆服务器,在当前用户目录下(我是root目录),新建 nginx 文件夹,并在里面新建nginx.conf
在 nginx.conf 中写入以下内容
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 2048;
}
http {
include /etc/nginx/mime.types;
# include /etc/nginx/conf.d/*.conf;
root /usr/share/nginx/html;
index index.html index.htm;
server {
listen 80;
server_name a.yourdomain.cn;
location / {
}
}
server {
listen 80;
server_name b.yourdomain.cn;
location / {
proxy_pass http://your_vps_ip:81;
}
}
server {
listen 80;
server_name localhost;
location / {
}
}
}
接下来
启动docker systemctl start docker
拉取刚才制作并上传好的两个镜像
docker pull lilywang711/web
docker pull lilywang711/web1
输入以下命令启动容器
docker run -itd --name web -p 80:80 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf lilywang711/web
// -i 交互模式运行容器, -t 为容器分配一个伪终端,-d 后台运行容器,可直接连写 -itd
// --name 是给该容器起个叫web的名字,方便辨识
// -p 是绑定端口 本机端口80:容器端口80
// -v 声明volume,意思是将容器中的/etc/nginx/nginx.conf 挂载到 宿主机里的/root/nginx/nginx.conf,以后配置nginx只需要修改/root/nginx/nginx.conf就行了
另外一个lilywang711/web1镜像也同理,修改下端口和名字就好了
docker run -itd --name web1 -p 81:80 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf lilywang711/web1
此时输入 docker ps
就可以看到这两个容器已经跑起来了
docker化项目并在nginx部署就已经完成了
在浏览器输入 http://a.yourdomain.cn 和 http://b.yourdomain.cn 就可以看到效果了,分别对应本地电脑中的web 和 web1 项目
今天关于docker 笔记 【部署 Nginx】和docker部署nginx应用的分享就到这里,希望大家有所收获,若想了解更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、6 项目部署 nginx/pm2/docker、Django-Docker容器化部署:Django-Docker-MySQL-Nginx-Gunicorn云端部署、docker nginx 部署多个项目等相关知识,可以在本站进行查询。
本文标签: