部署的應用僅僅是簡單應用程序,使用的是node管理的web應用,具體我也不是很會,當然也可以配置tomcat服務器。這里主要是學習docker。需要客戶機和服務機,其中服務機必須要為Linux操作系統。邏輯大致分為以下:
- 在開發者PC中編寫程序
- 使用git push將源碼上傳到服務器
- 服務器收到客戶機的git push命令后,執行git hook
- 在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。