發表文章

目前顯示的是 1月, 2020的文章

[微服務] Docker基礎(8) - 讓Docker進入實務的專案(二)

圖片
前言 我們會延續第七篇的內容,創造一個真實實務的Docker體系,包含 開發 測試 部屬 工具 在這個實務專案我們會用到 GitHub (Free) 包含master和feature觀念 Travis CI (Free) 由GitHub提供的CI工具 AWS (有免費專案) 我們會將AWS的服務當作最終生產環境 React 我們只單純的使用React的初始APP不會做太多的React Code主要是要看到他的畫面 流程 Dev 創建/更新code 在feature branch中 將code merge到master中 Test 將code push到Travis CI中 測試程式碼 Prod 將PR merge進master中 測試 部屬到AWS Beanstalk中 這篇文章會著重於,將Code推上GitHub透過Travis部屬至AWS平台 讓你的專案和GitHub連接 先到你的GitHub創立一個Repository 在到上篇文章的React app和GitHub連接 git init git add . git commit -m "First commit" git remote add origin 你的.git連結 git push origin master 就完成專案和GitHub的連接了 Travis 直接用GitHub的SSO登入Travis,並且透過官方的基本操作將目標Repository拉到Travis工作區 接下來我們要 透過Travis跑我們的Docker.dev環境 告訴Travis我們要跑測試 只要在上一篇(七)的文章中我們前置作業做好的React App資料夾中加上.travis.yml檔案就可以開始使用travis的功能 將GitHub的專案拉到Trais工作區 登入Travis後點擊右上角的帳號setting就可以將自己的範例專案拉到工作區,如下點擊我們這範例的Docker react專案 接下來Travis只要新增下面的檔案到自己專案的根目錄,每次push上去就會幫你建置搂! .travis.yml sudo: required services: - docker

[微服務] Docker基礎(7) - 讓Docker進入實務的專案(一)

圖片
前言 我們會用到前六篇文章的內容,創造一個真實實務的Docker體系,包含 開發 測試 部屬 工具 在這個實務專案我們會用到 GitHub 包含master和feature觀念 Travis CI 由GitHub提供的CI工具 AWS 我們會將AWS的服務當作最終生產環境 React 我們只單純的使用React的初始APP不會做太多的React Code主要是要看到他的畫面 流程 Dev 創建/更新code 在feature branch中 將code merge到master中 Test 將code push到Travis CI中 測試程式碼 Prod 將PR merge進master中 測試 部屬到AWS Beanstalk中 Docker 在哪? 其實我們並不會真的使用到Docker,我們只會用Docker讓這過程變得簡單 開始開發環境 開始前知識 npm run start 啟動react app可以馬上看到畫面 npm run test 執行單元測試 npm run build 將分散的js包裝成一個js檔,通常開發完放上生產環境就是這包js 為何要選擇ract而不是python?java原因很簡單,npm比較方便 建立React專案 只要找到目標資料夾,輸入 npx create-react-app my-app 就可以看到我們React app專案建好了,接下來的操作都會在這個資料夾的根目錄進行操作 創立Dockerfile 這個環節的Dockerfile我們會加上.dev,為了強調這是在開發環境時的Dockerfile,所以裡面的Image配置也會是以開發環境為主 Dockerfile.dev FROM node:alpine WORKDIR '/app' COPY package.json . RUN npm install COPY . . CMD ["npm", "run", "start"] 這裡我們呼叫的docker build .必須做一點小小的改變 docker build -f Dockerfile.dev

[微服務] Docker基礎(6) - 使用Docker compose加速我們容器運作

圖片
前言 我們會透過一個簡單的NodeJS web app搭配redis no-SQL資料庫做為範例,並且透過docker compose加速我們的Docker流程 範例介紹 初步的Node app原始碼如下 記得先開一個專屬的app資料夾,要在此資料夾呼叫docker build index.js const express = require('express'); const redis = require('redis'); const app = express(); const client = redis.createClient(); client.set('visits', 0); app.get('/', (req, res) => { client.get('visits', (err, visits) => { res.send('Number of visits is ' + visits); client.set('visits', parseInt(visits) + 1); }) }) app.listen(8081, () => { console.log('Listening on prot 8081'); }) package.json { "dependencies": { "express": "*", "redis": "2.8.0" }, "scripts": { "start": "node index.js" } } Dockerfile FROM node:alpine WORKDIR '/app' COPY package.json . RUN npm install COPY . . CMD ["npm", &quo

[微服務] Docker基礎(5) - 使用Docker進行第一個實戰

圖片
前言 在這篇文章我們要 建立一個超簡單的node.js web app 根據此app創建我們的Dockerfile 建立image 執行container 透過瀏覽器連接我們的web應用 建立NodeJs web app 前言: 這不是我們的主要目的如果有更喜歡的語言或方式的話都可以取代 創建一個乾淨的資料夾並且建立一個簡單的nodeJs app package.json { "dependencies": { "express": "*" }, "scripts": { "start": "node index.js" } } index.js const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hi there'); }); app.listen(8080, () => { console.log('Listening on port 8080'); }) 記得要先安裝node.js與npm 建立Dockerfile 基底選擇 哪個基底:他的tagName 跑哪個Dependency 執行Dependency指令 # Specify a base image FROM node:alpine # Install some dependencies RUN npm install # Default command CMD ["npm", "start"] 可以看到FROM中我們將alpine改成node:alpine 因為node這個基底是node官方提供的,他可以直接幫你將node的各種工具安裝好,而我們為了方便所以選擇了alpine的tag,代表著這個基底也包含了alpine提供的package功能 問題來了 如何放我們的source

[微服務] Docker基礎(3) - 開始用Docker吧

圖片
複習Docker image 在開始前我們先複習一次image與container的關西 image其實就是file snapshot搭配Startup command,而這snapshot就由image提供方設計(目前這階段我們應該是還不需要考慮這些),Startup command則是告訴容器啟動時要使用那些command 可以看到上圖當容器啟動後,Docker會依照image切出與分配FS並且在Running process時執行你的Starup command 創建第一個Container docker run docker run指令是由create和start組成 docker create <image-id/image-name> docker start <image-id/image-name> 基本輸入格式 docker run <image-id/image-name> 就可以看到自己第一個容器搂 hello-world 執行下方指令 docker run hello-world 就可以看到hello-world歡迎你進入docker世界 如果要將run拆解成create和start可以嘗試這樣輸入 docker create hello-world 你的顯示器會顯示此image的id,將你的id複製 docker start -a 上一行的image id 也會有一樣的效果 -a 在這裡代表的告訴docker start指令要attach後面這個image id busybox busybox可以讓使用者練習對容器下終端機指令 docker run busybox command-line docker run busybox echo hi docker ps docker ps指令是讓使用者查看目前電腦上運行的docker容器有哪些 我們嘗試用busybox來做ps的示範,因為busybox在執行我們的終端機指令後就會自動關閉,所以我們這次給他一個需要持續執行的指令,以ping google.com來示範 docker run busybox ping google.com 開啟新的終端機輸入 docker ps 就可

[微服務] Docker基礎(4) - 建立自己的Docker Image吧

圖片
Overview Dockerfile 表明我們的container要如何運作 有甚麼程式要在此container運作 只需要幾個簡單的command就可以製作 過程 標註那些是基本的Image 撰寫基本command還有安裝額外的程式 撰寫當container啟動時的command Dockerfile Dockerfile是甚麼? Docker Server會讀取Dockerfile根據內容打包屬於你的Image Example 自己組裝一個redis資料庫Dockerfile 建立一個Dockerfile # Use an exisiting docker image as a base FROM alpine # Download and install a dependency RUN apk add --update redis # Tell the image what to do when it starts # as a container CMD [ "redis-server" ] 在Dockerfile的資料夾下呼叫docker build . 使用docker images查看自己創建的image Instruction 告訴Docker Server要做甚麼的指令 FROM 我們要設定甚麼Image當作基底 RUN 要在上面跑甚麼 (如同設定Dependency) CMD 要跑甚麼指令作為start-up 概念 如果今天要你在一台全新的電腦安裝Chorme瀏覽器(此電腦沒有安裝OS)那你會如何做呢? 而Dockerfile的功用其實就如上圖 範例 FROM alpine 為什麼alpine? 這就如同上圖說的,你想選擇甚麼OS,今天為什麼選擇Window?Mac OS? Linux?一樣的道理,單純這個比較適合 Alpine Docker Hub網址 RUN apk add --update redis apk 就是Linux Apache package (他已預先安裝於alpine image中) 運作 docker build . 讓docker根據dock

[微服務] Docker基礎(1) - 什麼是Docker?

圖片
前言 此篇文章,會著重於 Why - 為什麼要使用Docker What - 甚麼是Docker Why? 為什麼要用Docker Docker是一個輕量級的虛擬化技術,它主要解決的問題如下 每當我們要安裝一個應用的時候,都會面臨如上圖的煩惱循環,只要用了Docker,那我們就不用再苦惱那些煩人的環境變數和與官方網站安裝教學不一致的作業環境造成的問題。 Docker的出現讓我們,可以簡單的透過幾個指令與下載Docker的Container就可以解決。 What? 甚麼是Docker? Docker的生態圈如下圖所示 Docker Client 使用者可以透過Docker Client做Command Line的操控 Docker Server Docker透過Docker Server去對Docker Hub上傳或下載Image Docker Machine 日後文章介紹 Docker Images Docker的精隨,Docker會根據Image的設定啟動Container Docker Hub 如同Git Hub般,許多人會將自己的Image開源在此網站之上,通常我們的Image是直接從此下載 Docker Compose 如果要同使啟用多個Docker一行一行的指令輸入太慢了,可以透過Docker Compose一鍵建立我們的Docker生態 而Docker中的重點就是Docker Container與Docker Images Docker Image Docker Image 只是一個檔案,其中包含了他要安裝甚麼服務與設定,還有啟動時的Command line指令 Docker中的Container會根據Image的內容而建立,每個Image可以創立多個Container Docker Container 因為篇幅較大所以分到下一篇文章撰寫 使用概觀 所以我們正常使用時,會對Docker Clinet輸入我們的Docker指令,而Docker Server則負責處理這些指令的功能。 快速使用 註冊一個自己的Docker Hub帳號 下載Docker在自己的電腦裡 登入Docker 確定自己的Docker有沒有安裝 docker --versi

[微服務] Docker基礎(2) - 什麼是Docker容器

圖片
前言 在介紹Docker之前我們需要知道,正常的OS(Operate System)是如何運作的。 如果今天有多個應用程式在機器上運行時,整體流程會如下圖 每個Process(程式)接收使用者的命令 使用System Call呼叫底層OS kernel操控記憶體、CPU和硬碟 狀況 假設今天我們的Chrome和NodeJS程式需要使用不同版本的Python去做操控,而機器目前只可以運轉的Python 2的版本,那就尷尬了,這樣代表Chrome和NodeJS使用Python3的應用與我們機器不相容。 解決方法 按照邏輯來說,我們只要想辦法讓Chorme和NodeJS都有個可以判別的標籤,讓他操控OS Kernel時知道他要使用哪一個Python版本。如下圖對硬碟做區隔並且設定對應的版本 通常在Linux上的處理方法是使用Namespacing和Control Groups(cgroups)去對機器資源做區隔與貼上標籤。讓Kernel知道這個Process要使用哪一個資源。 而Namespacing和Control Groups分別是甚麼呢? Namespacing 可以將Process需要的資源和其他資源分割獨立出來 Control Groups 可以控管每個Process可以使用多少個資源 這代表美當我們遇到類似這樣不相容的問題時,我們都要去設定Namespacing和Contrl Groups。如果今天有上百個不相容的問題的話,那我們對資源的控管也會天下大亂 Docker Container 而Docker的出現,解放了我們原本的作法,我們不在需要去設定與花心思做額外的資源管理,因為Docker Container直接幫我們做掉了。 每當我們開啟一個Container,就代表Docker已經幫我們對系統做到資源與Process的區隔,如下圖 而每個Container都是一個獨立的Process並且有自己獨立的資源集合,而他的呼叫方式還是依賴我們機器上的作業系統Kernel呼叫。 結論 所以Docker容器的出現 讓我們直接從資源與Process的管理中解放 他只是對現有的作業系統做資源區隔,而不像是VM完全在創立一個新的OS系統,所以他是輕量級虛擬化

系統設計 - 基礎概念 CAP (Consistency, Availability, Partition Tolerance)

此篇文章大致上是翻譯一篇國外精彩的CAP介紹文,讀者在此篇文章可以透過有趣的小故事了解到甚麼是CAP。 我們先節錄Wiki介紹的CAP Consistency - 一致性 等同於所有節點訪問同一份最新的數據副本 Availability - 可用性 每次請求都能獲取到非錯的響應——但是不保證獲取的數據為最新數據 Partition Tolerance - 分區容錯性 以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味著發生了分區的情況,必須就當前操作在C和A之間做出選擇 看完是不是一頭霧水呢?沒關係我也是,接下來的主文我們會用個簡單的小故事來講解CAP到底是甚麼 wiki 主文 第一章 : “幫你記” 公司開張 在前一天晚上你的另一半非常開心你記住了他的生日,並且送了他曾經告訴過你他最喜歡的東西當作禮物,你突然想到大家常常忘東忘西的但是我的記憶力特別強,何不用這項能力當作我的第一項事業呢?於是幫你記公司成立了! 幫你記有限公司 - 別再忘記,也不用再記 你是否曾經非常失落自己又落東落西了呢? 不用擔心,只要一通電話讓你馬上回憶 如果你需要記住甚麼東西馬上撥打 555-55-5807 並且告訴我們你要記住甚麼東西 當你要回憶時,馬上再次撥打我們會讓你得到你要的答案 例如: 我今天要記住我老婆的生日,只要一通電話先在我們公司留下紀錄,下一次有不好的預感時馬上call我們,我們會馬上告訴你 收費 : 每次紀錄/詢問只要 1 塊錢 所以你典型的一次成交對話會如下 消費者 : 你好請問可以幫我記住鄰居的生日嗎? 你 : 當然! 幾時? 消費者 : 七月二號 你 : (記錄在記事本之中) 以記錄,之後如果要查詢的話歡迎隨時撥打 消費者 : 謝謝你 你 : 沒問題的,這次記錄收取你1元的服務費哦 第二章 : 生意興隆 你的創業點子非常簡單而且實用,所以得到了創投的第一筆資金, 每天的消費者電話來到了一百多通,但是人不是鐵打的也需要休息,每一次休息都會讓你損失一整天的生意,況且會讓消費者們不滿意,所以你拉了自己老婆一起做生意,下面是你新的營運系統計畫 你和老婆都有一隻分機 客戶撥打一樣的電話會自動轉接到目前有空的人分機 第三章 : 你的第一個服務失敗案例