部署的应用仅仅是简单应用程序,使用的是node管理的web应用,具体我也不是很会,当然也可以配置tomcat服务器。这里主要是学习docker。需要客户机和服务机,其中服务机必须要为Linux操作系统。逻辑大致分为以下:

  1. 在开发者PC中编写程序
  2. 使用git push将源码上传到服务器
  3. 服务器收到客户机的git push命令后,执行git hook
  4. 在git hook中创建docker镜像,并以容器运行

  1. 在客户机创建git项目

git init simpleapp  #初始化git仓库
cd simpleapp/ #切换到仓库目录

  2. 在客户机编写Node.js需要的文件并提交到git

  • app.js文件
var express = require('express');
var app = express();
app.get(['/','/index.html'],function(request,response){
response.send('Hello World.');
}
);
app.listen(80);

  • package.json文件
{
"name": "simpleapp",
"description": "Hello Docker",
"version": "0.0.1",
"dependencies": {
"express": "4.4.x"
}
}

  • 把编写的文件提交到git
git add app.js package.json  #添加到git
git commit -m "add source" #提交到git

  注意:git如果是新安装的需要配置名字和邮箱,具体命令为:git config --global user.name <姓名>,git config --global user.email <邮箱>。

  3. 编写Dockerfile并提交到git

  • Dockerfile文件
FROM ubuntu:latest

RUN mv /etc/apt/sources.list /etc/apt/sources.list_bak
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main multiverse restricted universe\ndeb http://mirrors.aliyun.com/ubuntu/ bionic-backports main multiverse restricted universe\ndeb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main multiverse restricted universe\ndeb http://mirrors.aliyun.com/ubuntu/ bionic-security main multiverse restricted universe\ndeb http://mirrors.aliyun.com/ubuntu/ bionic-updates main multiverse restricted universe\ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic main multiverse restricted universe\ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main multiverse restricted universe\ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main multiverse restricted universe\ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main multiverse restricted universe\ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main multiverse restricted universe" > /etc/apt/sources.list
RUN apt update
RUN apt install -y nodejs npm
ADD app.js /var/www/app.js
ADD package.json /var/www/package.json
WORKDIR /var/www
RUN npm install
CMD nodejs app.js

   

  文件说明:

  FROM:表示是ubuntu:latest镜像作为基础镜像

  RUN:执行更换阿里源的操作,再然后是安装nodejs和npm软件

  ADD:把前面创建的app.js和package.json文件添加到镜像的/var/www目录下

  WORKDIR:切换后面RUN、CMD的执行目录

  RUN:执行npm install将安装package.json文件到Node.js模块

  CMD:设置用于在容器启动时利用nodejs运行app.js

  • 提交到git
git add Dockerfile  #添加到git
git commit -m "add Dockerfile" #git提交

  4. 在客户机创建ssh密钥

  执行命令ssh-keygen可以生成由RSA加密算法的非对称密钥,路径默认,密码为空就可以了。

ssh-keygen  #选用默认方式生成非对称密钥

  可以看到生成的id_rsa私钥和id_rsa.pub公钥文件。

  5. 在服务机上安装git和Dicker并创建git项目

  我这里的服务机是虚拟机,也是Ubuntu系统。执行命令:

sudo apt install git  #在服务机上安装git
sudo apt install docker.io #在服务机上安装docker
git init ~/文档/simpleapp #初始化git仓库
cd ~/文档/simpleapp #切换到仓库目录

  6. 把客户机生成的公钥文件添加到服务机

  在服务机/home/用户目录上创建.ssh目录,并设置权限:

mkdir ~/.ssh  #创建目录
sudo chmod u+rwx ~/.ssh #为当前用户添加读、写和执行权限

  然后把客户机生成的id_rsa.pub文件内容复制到服务机.ssh目录下的authorized_keys文件中,并添加读写权限。(这里的公钥文件内容只适合我这里的非对称密钥)

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCMoyR+tfOqbRNvWW1mofxsOWHukYhBtwfAJNJmwb16pZ4Kj/ErvmvV7mromt3+Oj/GSRIHPjf2SXcS+IHiO1LXCvgwQ7NIpx1W/tDUhL5Eg17A15Hs6x8AvGpJ8K6f5DQ8I0jKg3JOvhAj+sw7OFlN5dte1Dzs0fEyRp6Ji/m6HTM/T1plHkQZ0PCH8yE9JfDF/0ReAbcNhOQeWFgV2f/mhiGdnVV0MvyMyA5Df/kdr+IlrTHkSrz9Ijz88cyz7QYau4NgTxKxM7S9qG8WyjNnpbbrt6ORFxYhSIRgPz+U05PbiV2Iuuwte20rLwFCKFy+WmFqKVgCE9Mf5EEthXV lollipop@lollipop-MS-7850" > ~/.ssh/authorized_keys
sudo chmod u+rw ~/.ssh/authorized_keys #为当前用户添加读写权限

  7. 在服务机上设置git hook的post-receive文件

  在服务机的simpleapp/.git/hooks目录下创建post-receive脚本文件,这个文件在接收到客户机的git push命令后会自动执行。

vim ~/文档/simpleapp/.git/hooks/post-receive  #vim编辑post-receive文件

  在post-receive文件填入以下内容:

#!/bin/bash
APP_NAME=simpleapp
APP_DIR=$HOME/文档/$APP_NAME GIT_WORK_TREE=$APP_DIR git checkout -f cd $APP_DIR
docker build --tag $APP_NAME:latest .
docker stop $APP_NAME
docker rm $APP_NAME
docker run -d --name $APP_NAME -p 80:80 $APP_NAME:latest

  文件说明:

  APP_NAME:当前应用程序的名称,需要和git仓库名相同

  APP_FIR:设置仓库目录的路径

  git checkout -f:把推送的源代码保存到仓库,需要设置GIT_WORK_TREE变量

  cd:转到仓库目录

  docker:进行创建镜像,运行镜像等操作。

  文件创建完成后,为其添加可执行权限:

sudo chmod +x ~/文档/simpleapp/.git/hooks/post-receive

  

  为了在服务机上能不添加sudo就可以执行docker命令,还需要在服务机上执行命令:

sudo usermod -aG docker ${USER}  #添加docker用户组并把当前用户添加近组
sudo docker service restart #重启docker服务
reboot #重启

  注意要重启,我这实验时注销并不起作用,唯有重启才起作用。重启后,执行随意的docker命令,如docker images看看有没有成功可以判断是否可以不加sudo执行docker命令。如下图所示为成功的:

  8. 在客户机尝试推送代码

  首先在客户机上添加远程仓库的地址,执行命令:

git remote add origin qbs409@192.168.1.246:文档/simpleapp #git添加服务机的仓库地址

  命令用法:git remote add origin <服务机用户名>@<服务机IP或域名>:服务机用户目录下的git仓库目录。 

  然后开始推送仓库到服务机,执行命令:

git push -u origin master

  发现服务机拒绝了,看到提示有说设置receive.denyCurrentBranch配置成ignore,参考https://www.cnblogs.com/cosiray/archive/2012/06/01/2530967.html,在服务机的simpleapp目录上编辑修改.git/config文件,在后面添加如下代码:

[receive]
denyCurrentBranch = ignore

  修改完成后,再回到客户机,把仓库推送到服务机上,执行命令:

git push -u origin master

                          ...

  

  可以看到推送成功了,并且看到服务机上执行了CMD nodejs app.js,这时可以尝试浏览器访问服务器看看是否成功运行程序。在客户机上的浏览器输入192.168.1.246:80,我这里的服务机ip地址是192.168.1.246,程序端口上面设置的是80。

  可以看到程序运行成功,这样服务器就可以自动运行每一次提交给它的源码了。

  9. 在服务机上查看docker的信息

  程序能够运行,是因为服务器成功创建了镜像并且成功运行了docker容器,在服务器上执行命令:

docker images  #查看镜像
docker ps #查看运行的容器

  可以看到创建的simpleapp镜像和容器simpleapp。

Docker学习笔记之向服务器部署应用程序的更多相关文章

  1. Docker学习笔记_04 Rancher的部署安装(编排选用K8S)

    原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...

  2. [学习笔记]Linux环境下部署 .Net5 程序

    ​公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序. 目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署.现记录过程便于日后部署至项目甲方的服务器上,因为甲方的 ...

  3. Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)

    上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...

  4. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  5. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  6. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  7. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  8. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  9. Docker 学习笔记一

    Docker 学习笔记一 1.Docker是什么?         Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.让开发者打包他们的应用以及依赖包到一 ...

随机推荐

  1. react中对内容点击复制

    在react中一个标签内,点击这个标签直接复制标签内的内容 如图,我的需求是点击id这个标签实现对id的一键复制,所以请看copyHander函数 先创建一个Range对象,Range 对象表示文档的 ...

  2. django 验证码

    1.django 缓存设置 django的六种缓存(mysql+redis) :https://www.cnblogs.com/xiaonq/p/7978402.html#i6 1.1 安装Djang ...

  3. AWT01-体系概述

    1.概述 AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具. ...

  4. 仵航说 前后端分离,文件上传下载(springBoot+vue+elementUI)仵老大

    1.介绍 ​ 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel ...

  5. Web服务器-并发服务器-长连接(3.4.4)

    @ 目录 1.说明 2.代码 关于作者 1.说明 每次new_socket都被强制关闭,造成短连接 所提不要关闭套接字 但是不关闭的话,浏览器不知道发完没有啊 此时用到header的属性Content ...

  6. 单机编排之Docker Compose

    当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容器出错,这个时候推荐使用docker 单机编排工具docker compose,Docker Compose 是docker容器的一种 ...

  7. JQuery生成二维码,有资源下载

    原文链接:http://www.yxxrui.cn/article/65.shtml 没时间或者懒得看的,可以直接看加粗部分(或试试手感▼). 使用jquery.qrcode来生成二维码,qrcode ...

  8. 关于SM4 加密算法

    国密SM4算法 与DES和AES算法相似,国密SM4算法是一种分组加密算法.SM4分组密码算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成. SM4是一种Feistel结构的分组密码算法,其 ...

  9. jfinal项目报java.lang.ClassNotFoundException: com.jfinal.core.JFinalFilter

    在eclipse中启动jfinal项目时,项目报错如下:首先:右击项目–>Build Path–>Source查看Default output folder如果是目录/WEB-INF/cl ...

  10. Ubuntu系统下电脑驱动的安装(wifi无线网卡)

    今天给自己的笔记本电脑安装了新的Ubuntu 16.04但是安装之后发现wifi无法启用.这里特说明解决过程. 首先,网上的大部分教程是 选择"系统设置",点击"软件和更 ...