Docker學習筆記之向服務器部署應用程序


  部署的應用僅僅是簡單應用程序,使用的是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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM