GVKun编程网logo

docker 笔记 【部署 Nginx】(docker部署nginx应用)

9

本文将分享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应用)

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

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

docker构建nginx容器系列问题


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>-&gt;</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" &gt;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

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服务器器
  1. 拉取官⽅方镜像

    # 拉取官⽅方镜像
    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云端部署

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 个容器,分别是 appdbnginx 。容器之间通过定义的端口进行通讯。
  • 定义了 2 个网络,分别是 web_networkdb_network 。只有处在相同网络的容器才能互相通讯。不同网络之间是隔离的,即便采用同样的端口,也无法通讯。
  • 定义了 1 个数据卷static-volume 。数据卷非常适合多个容器共享使用同一数据,你可以看到 appnginx 都用到了它。
  • exposeports 都可以暴露容器的端口,区别是 expose 仅暴露给其他容器,而 ports 会暴露给其他容器和宿主机。

这么讲可能还是很难理解,让我们继续分解。

网络 network

Docker 允许用户给每个容器定义其工作的网络,只有在相同的网络之中才能进行通讯。你可以看到 nginx 容器处于 web_network 网络,而 db 容器处于 db_network 网络,因此它两是无法通讯的,实际上确实也不需要通讯。而 app 容器同时处于 web_networkdb_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.pyconfig/nginx/django_app.confrequirements.txt 相关位置都按教程流程改好;将 docker-compose.ymlDockerfile 复制到服务器。

由于 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 部署多个项目

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 项目

clipboard.png

clipboard.png

今天关于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 部署多个项目等相关知识,可以在本站进行查询。

本文标签: