• 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端口上(注意:这里需要将阿里云服务器的8000端口入方向打开,阿里云服务器的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镜像(需要先在服务器上安装node)

    安装nodejs过程如下

    # 在 /root 下新建nodejs文件夹(这里可以按照自己配置的路径)
    mkdir nodejs
    
    # 官网下载
    wget https://nodejs.org/dist/v12.10.0/node-v12.10.0-linux-x64.tar.xz

    # 如果官网下载报错:wget:unable to resolv host address
    # 可以尝试进行下列操作
    vi /etc/resolv.conf
    # 添加下列代码
    nameserver 8.8.8.8 #google https://nodejs.org

    # 解压 tar xf node-v12.10.0-linux-x64.tar.xz # 输入以下命令(注意,/root/nodejs 换成你自己官网下载node的解压路径,我这里是在 /root/nodejs 解压的) ln -s /root/nodejs/node-v12.10.0-linux-x64/bin/node /usr/local/bin/node ln -s /root/nodejs/node-v12.10.0-linux-x64/bin/npm /usr/local/bin/npm

    # 测试

    node -v

    输出: v12.10.0

    npm -v

    输出: 6.10.3

    代表nodejs安装成功

    下面接着定制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文件(这里注意,script 等前面是两个空格,NODE_ENV前面是四个空格)
    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
    # 可以看到  Hello NodeJS !!!   的话,就代表成功
    # 会返回一个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

    # 如果想后端启动
    docker-compose up -d

    # 如果HTTP超时的话,可以设置超时时间(可能因为服务器比较慢导致)
    COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d
    # 在本机访问 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

    可以看到页面就代表成功

  • 相关阅读:
    ckeditor(在线文本编辑器)使用教程
    一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别
    正则表达式
    关于padding与margin的区别
    伪类link,hover,active,visited,focus的区别
    运动框架
    scroll、offset和client的区别
    如何给Sublime安装插件
    获取行间样式与在js中设置样式
    寻找下一个同级元素节点
  • 原文地址:https://www.cnblogs.com/haishen/p/11577176.html
Copyright © 2020-2023  润新知