docker

217 阅读9分钟
docker 01-02
	/*
docker    : 极大的简化了部署的过程
docker 是什么,
1, Build Ship and Run Any App, Anywhere 一次封装 到处执行 
2 基于Linux 的高效, 敏捷,轻量级的容器(轻量化虚拟)方案


虚拟技术
1 完全虚拟化  VMware WorkStation  VirtualBox
2 硬件的辅助虚拟化  InterVT  AMD-V 
3 超虚拟化 Xen
4  操作心态级 Docker LXC 容器


部署一个典型的前后端分离的系统
1 前端工程化  Taro
2 后端  Node.js
3 数据库  MongoDB
4 Nignx  静态服务  前端的静态页面启动起来
和反向代理, node.js 提供的服务整合

docker 的特点
1 高效的利用系统资源, 操作系统的虚拟化, 占用资源小
2 快速的启动时间, 获取资源快, 轻量化的虚拟化技术
3 一致的运行环境 (所用的应用都运行在独立的linux 环境, 所以一致性)
4 持续交付和部署
5 更轻松的迁移 (一键下载, 所以迁移更快, 存储在github )

3 对比传统的虚拟机器 总结
特性        容器      虚拟机
启动        秒级     分钟级
硬盘使用     一般MB    一般GB
性能        接近原生    弱于
 系统支持量 (部署的应用数量)   单机支持上千个容器(一个服务对应一个容器)    一般几十个 (多个服务使用一个虚拟级)



阿里云ECS 安装ECS
apt-get update  升级更新

*/
// 1 更新 apt 包索引。
// apt-get update
// 2 安装 apt 依赖包,用于通过HTTPS来获取仓库:
 /* 
 apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
 */
//  3  添加 Docker 的官方 GPG 密钥:
// curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg |  apt-key add -
//  4  source.list 中添加 Docker 软件源
/* 
add-apt-repository \ "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable"

*/
//  5 安装 Docker CE
/* 
apt-get update 
apt-get install docker-ce
*/
// 6 启动 Docker CE
/* 
systemctl enable docker 
systemctl start docker
*/
// 7 建立 docker 用户组(附加)
/* 
 groupadd docker 
  usermod -aG docker $USER
*/
// 8 Helloworld测试 
// docker run hello-world
// 出现helo 则docker 安装完成

// 9 镜像加速, vi /etc/docker/daemon.json  增加对应的配置
/*
{ "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com" ] }
*/

// 10  重新启动
/* 
 systemctl daemon-reload 
  systemctl restart docker
*/


//  11  docker pull nginx  使用docker 下载 ngin x


docker 03 nginx 的服务使用
	/* 
1 拉取nginx 官方镜像 - 面向docker 的只读模版
docker pull nignx

2 查看
docker images nginx  

3 创建页面
mkdir www
建立一个网页 , 创建一个文件index.html , 并塞进内容
echo 'hello docker |||||' >> www/index.html

内容
4 cat www/index.html

5 虚拟机的80端口映射到8000端口 , nginx 默认的配置路径的内容 发布出去  ,命令执行的位置必须在根路径,否则会4037
docker run -p8000:80 -v $PWD/www:/usr/share/nginx/html nginx
加上-d 以后端的方式运行, 后端的方式运行,命令执行的位置必须在根路径,否则会403
6 docker run -p8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx
命令输入完后, 显示为container 的id 


7 docker  ps  
显示docker 运行的id,  运行的命令, 运行的时间

8 docker stop  id的前三位
docker stop 2fd 将无法访问了

9 docker ps -a 查询所有已经启动过的docker 

10  docker exec -it 3b0 /bin/bash  进入已经启动的容器
3b0 是docker 容器的id
ls 可以查看容器中一些文件,  bin dev home  等文件夹
cd /usr/share/nginx/html   进入文件夹
ls  显示了文件 有 index.html
cat index.html  可以查看html 文件的内容

11 docker start 3b0  启动容器3b0  3b0 为容器的id

12 docker rm sb0  删除
*/

docker 04 docker 的总结
	/* 
docker 的运行过程
1 镜像:  (Image)  面向Docker 的只读模版
2 容器(container) 镜像的运行实例, 将镜像进行实例化
3 仓库(Registry) 存储镜像的服务器 (nginx mongodb centos) 

docker pull nginx  从仓库拉去 nginx 的镜像(面向Docker 的只读模版), 没有实例化

linux 系统中安装docker 包含三部分, images, containers ,  docker deamon 

安装了docker 的一台linux系统
输入 docker pull nginx    命令, 将从仓库拉取 nginx 镜像到images , 未实例化
输入docker run  将 nginx 实例化, 运行在container 中执行操作, 运行

*/

docker 05   nginx 镜像的定制
	docker 05    docker file 定制镜像

镜像的定制实际上就是定义每一层所添加的配置和文件, 如果我们可以把每一层修改,安装
,构建,操作的命令都写入一个脚本, 用这个脚本来构建,定制镜像,那么之前提及的无法重复
的问题, 镜像构建透明性问题, 体积的问题都会得到解决,这个脚本就是Dockerfile

在nginx镜像上再进行一层定制, 再发布
(1) 登录自己的服务器  http://39.108.149.0:8000/
(2) 根页面,创建对应的目录  cd source/docker 
(3) 再新建目录 nignx
(4)  在nignx 目录下创建文件Dockerfile , vi Dockerfile 创建文件并修改
Dockerfile 文件内容
FROM nginx:latest
RUN echo '<h1>hello , dengyunfa</h1>' >  /usr/share/nginx/html/index.html
esc 推出, :wq 推出并保存
FROM nginx:latest  使用最新的nginx 版本镜像开始
RUN 执行内容, 在定制镜像时, 将内容<h1>hello , dengyunfa</h1>  右括号: 输出到  路径为
docker 主机内部的的地址, 产生一个新的文件,

(5)docker build -t nginx:kuaile .
开始定制镜像, 定制nginx 镜像,kuaile 为自己定义的版本  .表示定义镜像内容的配置文件
 Dockerfile 就在当前目录
 Successfully built 3a8b457826c6
Successfully tagged nginx:kuaile  
输出显示 定义版本kuaile 定制完成

(6)docker run -p 8000:80 nginx:kuaile
将启动对应的镜像内容, 输入ip:8000 端口,查看发布的内容

docker 06 node.js 服务镜像的定制
	/* 
node 的镜像的定制, 将一个node.js 的应用程序定义为一个镜像
自己的node.js 应用服务
1 cd source/docker
2 mkdir node
3 apt install npm // 安装npm 
4 npm init -y  // 初始化一个node 项目
5 cd node npm init -y
6 npm i koa -S  安装koa
7 cat package.json 确认koa 是否安装ok
8 vi app.js 在node 的目录下
/*
app.js 文件的内容开始
const Koa  = require('koa');
const app = new Koa();  启动服务
app.use(ctx => {  返回的内容, 所有的返回
        ctx.body = 'hello Nodw.js!!!!!';
});
app.listen(3000, () => { 启动的端口
        console.log('app started at 3000');  回调函数
});
app.js 文件的内容开始

8 vi Dockerfile  也在node 的目录下

Dockerfile 开始
FROM node:10-alpine
ADD . /app/
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]
Dockerfile  结束
从node 10 版本, alpine 经典的linux 版本下的node 10版本
ADD . /app/  将app.js , package.json 文件移动到/app/ 目录下
WORKDIR /app 移动到app, 更改目录
RUN npm install 执行node 下的npm install 安装对应的依赖
EXPOSE 3000 暴露node 默认端口3000
CMD 指令, docker run 时执行的对应指令为 node app.js 启动node

9 定制对应的镜像   docker build -t mynode . 
在node 目录下 执行  . 设置Dockerfile 的配置文件, 设置镜像版本为mynode

10 开始运行
    docker run -p 3000:3000 mynode  启动服务
*/

docker 07 定制pm2 镜像
	
/* 定制pm2 镜像
 pm2  是一个node d的一个进程守护程序来运行node


 pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能
1、 pm2需要全局安装
npm install -g pm2
2、进入项目根目录
2.1 启动进程/应用 pm2 start bin/www 或 pm2 start app.js

2.2 重命名进程/应用 pm2 start app.js --name wb123

2.3 添加进程/应用 watch pm2 start bin/www --watch

2.4 结束进程/应用 pm2 stop www

2.5 结束所有进程/应用 pm2 stop all

2.6 删除进程/应用 pm2 delete www

2.7 删除所有进程/应用 pm2 delete all

2.8 列出所有进程/应用 pm2 list

2.9 查看某个进程/应用具体情况 pm2 describe www

2.10 查看进程/应用的资源消耗情况 pm2 monit

2.11 查看pm2的日志 pm2 logs

2.12 若要查看某个进程/应用的日志,使用 pm2 logs www

2.13 重新启动进程/应用 pm2 restart www

2.14 重新启动所有进程/应用 pm2 restart all


(1) pm2 多核资源运行node 
(2) 在source/docker 下
(3) cp -R node pm2  将node 下的程序都拷贝给pm2 文件夹
(4) 进入pm2 文件夹
(5) process.yml 描述pm2 运行条件和过程
vi process.yml 

process.yml  开始
apps: 
  - script : app.js 
    instances: 2 
    watch : true 
    env : 
      NODE_ENV: production

process.yml  结束文件
script 执行的文件内容
instances: 启动的进程的个数
watch 对代码的监听
env node 的环境

(6)
# 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"]


注释内容
FROM 使用linux 中pm2 的镜像
WORKDIR 进入目录
ADD 将当前目录下的所有文件都复制到 /usr/src/app
RUN 首先设置npm 镜像地址和安装依赖, 使用&& 
可以执行两个run , 但镜像体会增大, 使用连续指令  \ 代表回车
CMD  在docker run 时,执行命令

(7)进行镜像定制
# 定制镜像 docker build -t mypm2 .

(8) 启动服务
# 运行 docker run -p 3000:3000 -d mypm2

*/

docker 08 - docker-compose 的安装
	/* 
docker-compose 的安装
(1) apt instll docker-compose 的安装
(2)    mkdir helloworld
(3) vi docker-compose.yml
设置文件内容
docker-compose.yml
version: '3.1'
services:
 hello-world:
  image: hello-world

文件的内容 ,注意缩进,会报错
最后  docker-compose up 执行命令  
*/

docker09  docker-compose 启动mongo mongdb
	
/* 
docker-compose
compose项目是Docker 官方的开源项目, 负责实现对Docker 容器集群的快速编排
多个docker 项目一起工作,使用docker
(1) cd source/docker
(2) mkdir mongo
(3) 使用docker-compose  搭建一个环境,可以同时使用mongo 和mongodb
(4)在 mongo目录下,    vi docker-compose.yml , 进行配置
(5)
version: '3.1' 
services: 
  mongo: 
    image: mongo 
    restart: always 
    ports:
      - 27017:27017 
  mongo-express: 
    image: mongo-express 
    restart: always 
    ports: 
      - 8000:8081
docker-compose.yml 结束
version : 设置docker-compose 的版本
services  设置doccur-compse 一起启动的镜像
mongo  : 定义镜像
image : 定义镜像名称, restart 是否出现错误时重启
ports : 镜像启动时的端口
27017 : mongo 的端口
8001 : mongo-express mongo-express 的可以使用的端口

(6)docker-compose up 启动命令
(7) http://39.108.149.0:8000 查看启动的服务

*/

docker 10 node.js 实战
	
/*
docker 10 node.js 实战
(0) 项目地址  https://github.com/su37josephxia/docker_ci

(1) vs code 的插件使用 deploy 的使用
实现本地代码和 服务器代码的同步

(2).vscode目录, 目录下增加文件
中 setting.json 文件的配置
*/
{
    "deploy": {  // 部署的参数配置
        "packages": [{
            "files": [
                "**/*",  // 所有的文件
              ],

              "exclude": [
                  "node_modules/**",  // 忽略 node_modules 文件
                  ".git/**",  // 忽略.git 文件
                  ".vscode/**",  // 忽略.vscode 文件
                  "**/node_modules/**",  // 忽略 node_modules 文件
              ],
              "deployOnSave": false  // 设置为false 时, 不会保存后就更新到服务器
          }],
          "targets": [{
              "type": "sftp",  // 加密的ftp协议模式
              "name": "AliyunServer",  // 阿里云服务器
              "dir": "/root/source/docker_ci",  // 目录
              "host": "39.108.149.0",  //  服务器的主机名 安利云
              "port": 22,  // 端口
              "user": "dengyunfa",  // 用户名称
              "privateKey": "/Users/dengyunfa/.ssh/id_rsa"  // 密钥的地址
          }],
    },
}
/*
(3) 根路径 增加 nginx 目录, 增加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; 
  } 
}

(3) docker.conf  对当前文件,使用右键 deplyoy current fil/folid
上传当前文件,成功后会, 出现finished 
O(4) 进入服务器, cd source/docker/docker_ci/nginx 
可以查看文件

(4)根目录上 docker-compose.yml 文件
version: '3.1' 
services: 
  nginx: 
    restart: always  // 会重启
    image: nginx 
    ports: 
      - 8091:80 
    volumes: 
      - ./nginx/conf.d/:/etc/nginx/conf.d   // nginx文件的配置
      - ./frontend/dist:/var/www/html/ 
      - ./static/:/static/
*/
// ./nginx/conf.d  nginx 的进行映射
// /frontend/dist 前端页面的映射
// 静态文件的映射

// (5) 将所有的文件都上传, 进入 cd source/docker_ci 
// 运行docker-compose up 启动服务 


docker 11
	
// docker 11 node.js 实战
// 
// 配置
//(1) 在backend 中增加文件process.yml 文件 , pm2 文件的基本配置
apps:
  - script : server.js  // 执行server.js 文件
    instances: 2  // 两个实例
    watch  : true  // 监控文件
    env    :
      NODE_ENV: production  // 启动环境


// (2)   backend 目录下 .dockerignore 文件增加
// 忽略的文件    , 忽略node_module 的文件
// node_modules


// (3) 在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
# RUN npm i
EXPOSE 3000   
#pm2在docker中使用命令为pm2-docker
# CMD ["pm2-runtime", "start", "--json", "process.json"]
CMD ["pm2-runtime", "start",  "process.yml"]
*/
// 3000 duankou 
// ADD:  会忽略node_modules 的文件

// (4)数据库的配置
// backend/models/conf.js
/* 
module.exports = {
    url: "mongodb://mongo:27017",
    dbName: 'taro',
}

 url: "mongodb://localhost:27017",
 原来连接的是localhost 本地的数据库
 现在在docker 内部使用mongo 的域名

*/

// (5)反向代理配置 , nginx/conf.d/docker.conf 中增加
/*
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; 
  } 
} 
*/

// (5)服务的增加  docker-compose.yml
/*
app-pm2:  // 这里代表app-pm2 的服务, 对应nginx 中的服务
    container_name: app-pm2 
    #构建容器 
    build: ./backend 
    ports: 
      - "3000:3000" 
  mongo:   // 这里代表mongo 服务
    image: mongo 
    restart: always 
    ports: 
      - 27017:27017   
      */

// (5) docker-compose down docker-compose 关闭
// docker (12)