部署的应用仅仅是简单应用程序,使用的是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. Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?

    Java堆内存分为年轻代和老年代,其中,年轻代分为Eden区和survival区,survival又分为fromSurvival和toSurvival. 首先第一个问题:为什么要有Survival区? ...

  2. 学好Spark/Kafka必须要掌握的Scala技术点(三)高阶函数、方法、柯里化、隐式转换

    5. 高阶函数 Scala中的高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等,可以把函数作为参数传递给方法或函数. 5.1 作为值的函数 定义函数时格式: val 变量名 = (输入参数类型和个 ...

  3. Linux查看、开启、关闭防火墙操作

    一.防火墙区别 CentOS6自带的防火墙是iptables,CentOS7自带的防火墙是firewall. iptables:用于过滤数据包,属于网络层防火墙. firewall:底层还是使用 ip ...

  4. css 02-CSS属性:背景属性

    02-CSS属性:背景属性 #background 的常见背景属性 css2.1 中,常见的背景属性有以下几种:(经常用到,要记住) background-color:#ff99ff; 设置元素的背景 ...

  5. openstack高可用集群17-openstack集成Ceph准备

    Openstack集成Ceph准备 Openstack环境中,数据存储可分为临时性存储与永久性存储. 临时性存储:主要由本地文件系统提供,并主要用于nova虚拟机的本地系统与临时数据盘,以及存储gla ...

  6. 自学python,从小白到大神,需要多久?

    2020年10月 TIOBE 排行榜超过了 Java, 历史上首次 Python 超越了 Java ,再次让许多朋友对 Python 产生了兴趣,今天我们来梳理下学习 Python 几个阶段或者级别, ...

  7. windows Server 2016安装Sqlserver远程连接的坑

    如果要连接远程服务器 首先打开防火墙端口1433  新建入站规则 然后 如果没启用 就启用  然后重启服务就行 如果还是不行 进去属性  修改三处 然后重启服务

  8. EF快速入门--直接修改(简要介绍ObjectContext处理机制)

    原博文 http://www.cnblogs.com/fly_dragon/archive/2011/06/05/2073084.html ObjectContext的处理机制 ObjectConte ...

  9. 痞子衡嵌入式:MCUXpresso IDE下SDK工程导入与workspace管理机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程导入与workspace管理机制. MCUXpresso IDE是恩智浦软件团队倾注很大心血研发 ...

  10. bean中属性名和json不一致解决方案(请求和响应)

    此时@RequestBody.@ResponseBody需要与@JsonProperty结合使用,才能做到请求正常解析,响应按要求格式返回. 注意@JsonProperty注解的位置需要加在gette ...