docker安装
拿到一个全新的阿里云服务器后,使用ssh进入服务器,执行以下步骤
1、apt升级
sudo apt-get update
2、添加相关软件包
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
3、下载软件包的合法性,需要添加软件源的 GPG 秘钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4、source.list 中添加 Docker 软件源
sudo add-apt-repository \ "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable"
5、安装 Docker CE
sudo apt-get update sudo apt-get install docker-ce
6、启动 Docker CE
# 添加docker服务 sudo systemctl enable docker # 启动docker sudo systemctl start docker
7、建立 docker 用户组(附加、可以不用)
# root权限比较高 # 如果是个人服务器,只需要用root的话,这一步可以跳过 sudo groupadd docker sudo usermod -aG docker $USER
8、 Helloworld 测试
docker run hello-world
9、镜像加速
# 加入微软云和七牛云 # 进入daemon.json文件,进行编辑 vi /etc/docker/daemon.json # 将以下内容弄进去 { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com" ] } # 重启docker服务,让它生效 sudo systemctl daemon-reload sudo systemctl restart docker
安装一个简单的 Nginx 服务
以下步骤在docker安装完成之后
1、拉取官方镜像 - 面向docker的只读模板
docker pull nginx
# 安装完成后,查看安装结果
docker images nginx
2、创建一个页面,把它发布出去
mkdir www # 建立一个网页 echo 'Hello docker!!!' >> www/index.html # 查看一下 cat www/index.html # -p代表端口映射 # 把它发布在我们服务器的8000端口上 # 映射到nginx的80端口 # 因为nginx默认的服务是80端口 # /usr/share/nginx/html 这个是nginx的默认目录 docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html nginx # 测试一下,在本机浏览器输入以下网址 http://00.00.00.00(IP地址):8000 # 会显示 “Hello docker!!!” 就代表成功 # 这种情况实际上是用命令行来启动,如果我们想让他后台执行的话(实际上就是后台模式) docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx # 会返回一个UUID # 查看docker进程 docker ps # 如果我们想停止这个服务的话,只需要打前三位 # 例如:其中c99是UUID的前三位 docker stop c99 # 如果想重新启动 docker start c99 #如果在停止的情况下,使用docker ps查询不到,因为它没有被允许,此时可以用以下命令来查询所有 docker ps -a
3、如果想进入docker内部(docker实际上是一台linux服务器),进入伪终端
docker exec -it c99 /bin/bash # 此时已经进来了,可以确认一下刚刚的网页 cd /usr/share/nginx/html cat index.html # 可以看到 Hello docker !!! # 退出 exit
4、删除这个docker镜像
docker rm c99
Dockerfile定制镜像(定制一个nginx镜像)
镜像的定制实际上就是定制每一层所添加的配置、文件。
如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,
用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。
这个脚本就是 Dockerfile
1、配置Dockerfile文件
cd source/docker mkdir nginx cd nginx # 定制镜像的描述文件 vi Dockerfile # 将以下内容弄进 Dockerfile文件 FROM nginx:latest RUN echo '<h1>Hello Dockerfile !!!</h1>' > /usr/share/nginx/html/index.html
2、定制镜像
# 在 /source/docker/nginx 下
# 定制nginx的版本为 mynginx
# . 的意思是,我的镜像定制文件(Dockerfile)在当前目录下
docker build -t nginx:mynginx .
3、试验一下是否成功
docker run -p 8000:80 nginx:mynginx # 在本机访问 http://00.00.00.00(IP地址):8000 # 可以看到内容,就表示成功
定制一个NodeJS镜像
进入 /source/docker 目录
mkdir node cd node # 先初始化一个npm的项目 npm init -y # 加一个包 npm i koa -S # 看一下 cat package.json # 写一个最简单的程序 vi app.js # 将下面代码弄进 app.js 文件 const Koa = require('koa') const app = new Koa() app.use(ctx => { ctx.body = 'Hello NodeJS !!!' }) app.listen(3000, () => { console.log('app started at 3000') }) # 定制Dockerfile vi Dockerfile # 将下面代码弄进 Dockerfile 文件 # 这个实际上是一个经典linux系统的node10版本 # 把宿主机上当前目录添加到app目录下 # WORKDIR 相当于进入app目录 FROM node:10-alpine ADD . /app/ WORKDIR /app RUN npm install EXPOSE 3000 CMD ["node", "app.js"]
试一下定制镜像是否成功
docker build -t mynode .
试一下运行效果
docker run -p 3000:3000 mynode # 这里如果不行,可能是原来的没有关闭掉 # 使用 docker ps 命令查看 # 使用 docker stop 307 命令关闭,其中 307 是uuid 的前三位
在本机访问 http://0.0.0.0(服务器ip):3000 可以看到运行效果
定制PM2镜像
在node使用的时候,很少用node直接去运行,一般会使用PM2这样一个进程守护的程序
通过这样一个程序去运行node
PM2:利用多核资源
node程序
# 将上面的node程序拷贝过来 cd source/docker cp -R node pm2 cd pm2
1、pm2运行的时候,我们一般使用process.yml 文件来描述它的运行过程
vi process.yml # 将下面代码弄进 process.yml文件 apps: script: app.js instances: 2 watch: true env: NODE_ENV: production
2、然后我们编辑Dockerfile文件
vi Dockerfile # 用下面的代码覆盖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 CMD ["pm2-runtime", "start", "process.yml"]
3、试验一下是否成功
docker build -t mypm2 . docker run -p 3000:3000 -d mypm2 # 然后在本机访问 http://0.0.0.0(IP地址):3000 # 可以看到的话,就代表成功
# 会返回一个UUID:假设为 bc8896214hkjnduu......
# 关掉
docker stop bc8
Compose安装
apt install docker-compose # 试验一下是否安装成功 mkdir helloworld vi docker-compose.yml # 将下面代码弄进去 version: '3.1' services: hello-world: image: hello-world # 启动 docker-compose up # 如果能打印出日志,说明没有问题,安装完毕
简介:Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
一句话概括:如果好几个Docker想一起工作,就用 Compose
下面来安装MongoDB以及MongoDB-express(数据库可视化工具,在浏览器上显示)
cd source/docker mkdir mongo cd mongo vi docker-compose.yml #将下面代码弄进去 version: '3.1' services: mongo: image: mongo restart: always ports: - 27017:27017 mongo-express: image: mongo-express restart: always ports: - 8000:8081 # 启动 docker-compose up # 在本机访问 http://0.0.0.0(IP地址):8000 就可以看到页面(需要在阿里云配置开启外部访问8000端口)
使用docker来部署一个前后端分离的项目
这里使用夏老师的 docker_cli 项目 :后端使用的nodejs,前端使用的是taro,使用mongodb数据库
https://github.com/su37josephxia/docker_ci
需要的效果:本地修改代码,可以随时同步的服务器上面去
使用vscode的 Deploy 插件
首先建立一个.vscode文件夹(夏老师的项目里面已经建过了)
里面新建 settings.json 文件
// files: **/* 代表所有的文件 // exclude: 把里面的东西例外出去 // deployOnSave:如果选 true ,每次保存文件都会自动进行同步 // targets 部署到什么地方 // name: 随便写 // dir: 传到服务器的什么目录下 // host:服务器地址 // privateKey: 私钥,登录需要的私钥地址 { "deploy":{ "packages": [{ "files": [ "**/*" ], "exclude": [ "node_modules/**", ".git/**", ".vscode/**", "**/node_modules/**" ], "deployOnSave": false }], "targets": [{ "type": "sftp", "name": "AliyunServer", "dir": "/root/source/docker_cli", "host": "00.00.00.00", "port": 22, "user": "root", "privateKey": "/User/xia/.ssh/id_rsa" }] } }
下载好项目后,在 docker_cli 目录新建一个文件夹: nginx
在nginx中新建一个文件夹:conf.d
在conf.d中新建一个文件:docker.conf
server { listen 80; location / { root /var/www/html index index.html index.htm; } location ~ \.(gif|jpg|png)$ { root /static; index index.html index.htm; } }
右键 docker.conf 文件,选择 Deploy
在服务器查看
cd /source/docker_cli cat nginx/conf.d/docker.conf # 如果里面有内容,则说明上传成功
接着在项目的根目录下,建立一个文件:docker-compose.yml
version: '3.1' services: nginx: restart: always image: nginx ports: - 8091:80 volumes: - ./nginx/conf.d/:/etc/nginx/conf.d - ./frontend/dist:/var/www/html/ - ./static/:/statoc/
然后将此文件 Deploy 一下
然后在服务器中
/source/docker_cli 下
执行命令:docker-compose up
然后在本机访问:http://0.0.0.0(IP地址):8091 (阿里云默认是不打开8091端口的,需要在阿里云设置一下)
可以访问到前端页面
下面配一下后端
在项目的 backend 文件夹下新建一个文件:process.yml
apps: - script: server.js instances: 2 watch: true env: NODE_ENV: production
在 backend文件夹下新增一个文件: .dockerignore
node_modules
在 backend文件夹下新增一个文件: 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"]
修改backend/models文件夹下 conf.js 文件
本来为:
module.exports = { url: "mongodb://localhost:27017", dbName: 'taro' }
改为:
// mongo 是一个域名:在docker内部使用的一个域的域名 module.exports = { url: "mongodb://mongo:27017", dbName: 'taro' }
接下来在nginx上进行反向代理
修改 nginx/conf.d/docker.conf 文件
server { listen 80; location / { root /var/www/html index index.html index.htm; } location ~ \.(gif|jpg|png)$ { root /static; index index.html index.htm; } location /api { proxy_pass http://app-pm2: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; } }
修改 docker-compose.yml 文件
version: '3.1' services: app-pm2: container_name: app-pm2 # 构建容器 build: ./backend ports: - "3000:3000" mongo: image: mongo restart: always ports: - 27017:27017
然后将 backend nginx docker-compose.yml 这三个文件都Deploy一下
在服务器中 /source/docker_cli 下,将服务关掉
docker-compose down
看一下有没有同步过来
cat docker-compose.yml
cat backend/Dockerfile
cat nginx/conf.d/docker.conf
运行一下
docker-compose up
在本机访问 http://0.0.0.0:8091
可以看到页面就代表成功
原文地址:https://www.cnblogs.com/haishen/p/11577176.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序开发实战(24):选择图像
- 反 996 有理:催程序员交代码,写不出好软件
- 一千个不用 Null 的理由!
- WebAssembly 是 Deno 的好搭档
- Chrome开发者工具的11个高级使用技巧
- 怒爬某破Hub站资源,简单4步撸个鉴黄平台!
- 审阅“史上”最烂的代码
- BeanUtils 是用 Spring 的还是 Apache 的好?
- 一看就会的mysql索引优化(真实案例)
- 【015期】JavaSE面试题(十五):网络IO流
- 算法篇:二分查找基础篇
- 算法篇:双指针之接雨水
- 因用了Insert into select语句,美女同事被开除了!
- 【原创】Java并发编程系列33 | 深入理解线程池(上)
- 算法篇:二分法之k个数之和