紐西蘭外海領航鯨擱淺 保育人士搶救總動員_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

摘錄自2020年10月17日中央通訊社紐西蘭報導

紐西蘭科羅曼德爾半島(Coromandel Peninsula)沿海今(17日)傳出鯨魚擱淺受困,保育人士動員搶救。海洋保育團體喬納計畫(Project Jonah)發言人表示:「發現約有40隻鯨魚,而很不幸有25隻擱淺。」

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

成年的領航鯨(pilot whale)身體可以長達6公尺以上。領航鯨經常傳出擱淺受困的消息,上月澳洲才發生超過376頭領航鯨擱淺喪命。當時約470頭鯨魚在塔斯馬尼亞州(Tasmania)西部崎嶇海岸的偏遠港口擱淺,這可能是澳洲史上最大規模鯨魚擱淺事件。

海洋
國際新聞
紐西蘭
領航鯨
擱淺
鯨豚擱淺

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

Microsoft 365 還是 Google Workspace?一文看懂企業生產力工具選哪套_如何寫文案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

不管是微軟或是 Google,都在積極推動以雲端為基礎的生產力軟體與服務套裝工具,希望能夠幫助用戶在激烈的競爭中贏得勝利,而兩家巨頭所推出的解決方案就是 Microsoft 365 與 Google Workspace(以前的 G Suite),這次「一文看懂」就要來帶大家仔細看看這兩套不同生產力工具之間差異與不同。

Microsoft 365 還是 Google Workspace?一文看懂企業生產力工具選哪套

微軟與 Google 都想成為用戶首選的一站式生產力工具服務,各自推出的訂閱商品也擁有各自的特色。Microsoft 365 與 Google Workshop 這兩套不同工具都具備有下面這些功能:

  • 可自訂域名的工作用電子郵件信箱和共用行事曆功能
  • 擁有線上儲存、協作的共用空間,而且每個使用者帳號都分配有大量個人儲存空間
  • 可用於建立和協作文件、表格和簡報的生產力應用程式
  • 都有自家企業通信軟體,裡面都有傳訊、線上會議和視訊會議功能
  • 管理介面具備企業用戶的合規性與歸檔等高階功能以及包含雙重身份驗證等在內的安全功能

這兩巨頭的服務皆以強大、可靠性高的雲端基礎架構為核心,並擁有自家的全球數據中心,且兩家企業在生產力工具市場皆佔據了主導地位,其他小型競爭對手根本沒得打。儘管表面上看起來功能性差不多,但 Microsoft 與 Google Workshop 在雲端結構和應用程式的設計方面明顯採取不同的邏輯與方式,對大多數人來說,選擇使用哪一款的最直接方式就是從硬體合適度來著手。

微軟的方式在於構築自家的 Office 專有權(過去稱為 Office 365,現在叫 Microsoft 365),所包含的應用程式皆為可自動更新的同捆之中,點對點服務(包括 Exchange Online、OneDrive Business、SharePoint Online 和 Microsoft Teams)讓團隊從本地伺服器遷移到雲端提供了簡易途徑,員工可以利用熟悉的電腦版應用來造訪包含 Outlook、Word、Excel 和 PowerPoint 等服務,也可以使用網頁版的替代方案。相比之下,Google 的方式是以雲端原生工具和瀏覽器為中心,包含 Gmail、Google 雲端硬碟、Google 文件和 Google 試算表等基於網頁服務與員工已經熟悉的個人工具相同,當與 Chrome 瀏覽器一起使用時,這些應用程式可支援離線儲存文件與檔案。

這兩種服務都內含專為中型與大型企業設計的網頁版本管理介面,而這些管理工具對於沒有全職 IT 工程師的小型企業中可能會讓人感到棘手。如果是企業採購相關方案,還是與認證經銷合作會是最好的選擇,後續服務方面也較為完善。

套裝價格

若要看到 Microsoft 365 與 Google Workshop 的明顯差異,可以從兩家廠商提供訂閱的各項計劃內容來看。
Google 保有其簡單明瞭的概念,共推出有四種不同的方案,分別為入門型的 Business Starter(每月 6 美元)、標準型的 Business Standard(每月 12 美元)、進階型的 Business Plus(每月 18 美元) 與企業大量授權型的 Enterprise(需另外詢價)。

相形之下,Microsoft 365 的方案就讓人較為眼花撩亂。三種針對小型企業的訂閱記劃(Microsoft 365 E3、E5 與 F3),以及僅包含有電腦應用和雲端儲存的 Microsoft 365 APPS 企業版,另外還沒有重新命名的 Office 365 E1、E3 與 E5 企業方案,還有專為大型組織從每台電腦授權和本地伺服器過渡的方案,另外對於教育機構、政府機關和非營利組織還有單獨的 Microsoft 365 計劃。Microsoft 365 的收費從每人每月 300 元至 1040 元不等,最貴的方案包含了 Windows 10 企業版 E3 和企業行動性 + 安全 E3 的許可。如果上面這些方案都不適合你的需求,你還可以混合搭配各種服務以建立個人化的訂閱方案。

兩種服務之間儘管有些相似之處,但很難進行一項一項的比較,由於內含 Office 桌面應用,大多數 Microsoft 365 計劃的費用都高於 Google Workspace。

Google 所有方案皆包含下面的功能:
Gmail for Business
Meet(視訊與語音會議)
Chat(安全訊息)
共用行事曆
Google 文件、試算表和簡報
Keep(共用筆記)
表單(可製作問券)
協作平台(Sites,可在沒有程式基礎下快速建立協作平台)
Currents(Google Workshop 中的 Google+ 替代品)
至少 30GB 的雲端儲存容量(Google 雲端硬碟)
安全和行政控制

而所有 Microsoft 365 計劃都內含一組雲端功能,或有權在最多 15 部裝置上下載安裝 Office 應用程式(5 台 Windows 電腦或 Mac、5 台平板電腦和 5 部智慧型手機),或是兩者皆有。電腦版應用程式包括 Outlook、Word、Excel、PowerPoint 和 OneNote(僅在 Windows 電腦上提供訪問和創建),以及每個使用者至少 1TB 的 OneDrive 儲存容量,與網頁版本的 Word、Excel、PowerPoint 和 OneNote。

Microsoft 365 的雲端服務包含下面這些:
Exchange 最大收件匣容量為 50 或 100GB 的線上電子郵件託管
網頁版 Word、Excel、PowerPoint 和 Outlook
每個使用者至少 1TB 的 OneDrive 用於業務檔案存儲
SharePoint 線上團隊網站
高解析視訊會議
線上會議(Skype 會議廣播或 Microsoft Teams 即時活動)
安全訊息傳遞和協作(Microsoft Teams)
安全和行政控制

商務計劃還包含有約會計劃應用、Microsoft Bookings 和 MileIQ 費用追蹤軟體。而企業計劃則包含有任務管理軟體 Microsoft Planner、高級分析工具的MyAnalytics 和 Power BI Pro、流程管理工具 Power Apps 與 Power Automate、協作軟體 Yammer 以及眾多進階功能,像是 Microsoft Advanced Threat Protection、Microsoft Bookings 等功能,以及 150 或更多人員的免費部屬支援。

兩者間的比較

Microsoft 365 與 Google Workspace 都有讓人印象深刻的眾多功能清單,事實上兩種服務之間最大的區別不是特定功能是否存在,而是如何實現這些功能,總結是指兩個服務之間的風格差異。

※別再煩惱如何寫文案,掌握八大原則!

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

  • 電子郵件
    Microsoft 具有 Exchange Online,針對 Outlook 電腦版進行了最佳化;Google 的 Gmail 服務,針對 Chrome 瀏覽器和行動應用進行了最佳化。除了這些基本的體系結構差異外,功能項目裡面還包括企業電子郵件管理員想要的所有內容,包括反惡意軟體防護、垃圾郵件過濾和群組別名。

    Google Workspace 的 Business Starter 方案中,最大收件匣容量為 30GB(或更少),該空間與使用者的雲端硬碟儲存容量共用。此限制隨著 Google Workspace 更高階的訂閱方案而消失。Microsoft  365 電子郵件信箱大小上限為 50GB 或 100GB,具體取決於選購的計劃,對於啟用存檔的企業帳戶,存檔郵箱容量則為無限制。

  • 生產力應用
    Google 的旗艦生產力應用專為在瀏覽緝獲行動應用中工作而設計,相比之下較為主流的 Microsoft 365 方案中還包含了 Windows PC 和 Mac 上最新版本 Office 桌面應用軟體,此外還有功能日益完整的網頁版核心應用。

    這些 Office 桌面應用可用性是某些組織或企業的必須項目,當 Office 文件格式的保真度至關重要時,情況尤其如此。導入和匯出 Google 文件和表格很容易,但 Office 文件卻不能保證在兩個環境之間無損往來。在這些格式沒什麼大不了的,而且在相對成員較為年輕化的團體在 Gmail 和 Google 文件的使用較為順手,瀏覽器介面或許可以被視為一種優勢。

  • 雲端儲存
    OneDrive for Business 曾是 SharePoint 的笨重副產品,現在與消費者共用相同的同步引擎,已經發展成與 Microsoft 365 和 Windows 能有高整合度的可靠服務,它在 Mac 和行動裝置運行狀況也不錯。預設情況下,每個 OneDrive for Business 用戶都會獲得 1TB 的個人雲端空間,只要企業帳戶有至少五位用戶這個上限就消失了。對於所有帳戶類型,團隊可獲取 SharePoint  1TB 儲存容量(再加上每個使用者 10GB)。

    如前面提過的,Google 雲端硬碟儲存分配與 Gmail 共用。在基本帳戶上,上限為 30GB,升級帳戶的限制將限制為 1TB,對於至少有五個使用者的 Google Workspace 商務和企業計劃則為無上限。管理員可以使用設備策略控制離線儲存,並可以控管使用者是否可以將雲端檔案同步到電腦或行動裝置中。

  • 溝通與協作
    無論是 Google Workspace 或 Microsoft 365,都提供用戶各種通訊和協作工具。這兩種服務都允許用戶在網頁瀏覽器上同時編輯文件,以便團隊處理共享專案;對於儲存在 OneDrive 上的檔案,你也可以使用 Office 電腦版應用進行協作。

    Google 已經將旗下的原本的 Hangouts 聊天應用程式改名為 Meet,可用於進行線上會議、視訊會議和語音通話,也能簡單地傳送文字訊息對話;Microsoft 365 則透過 Microsoft Teams 取代 Skype 商務版和古老的 Lyc 來提供同樣的功能。

Google Workspace 或 Microsoft 365,不管哪一套工具,在現在工作型態轉為遠端的時局下,都以提供無縫的團隊協作與即時溝通為主要重點,打破不在一地工作時距離與時間帶來的障礙,讓企業與商務生產力保有往常的水準。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※教你寫出一流的銷售文案?

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

Sony Mobile 全新 Xperia Compact 小尺寸手機回歸?爆料大神釋出高清晰渲染圖_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

去年, Apple 在 iPhone 12 系列中推出小尺寸的 iPhone 12 mini 以滿足喜好小尺寸手機需求的使用者需求。回顧 2018 年 Sony Mobile 曾推出 Xperia XZ2 Compact ,但後續在 Android 陣營的手機這方面,大螢幕、大尺寸手機已成為主流,已經許久未見到有品牌推出尺寸方便單手持握的小尺寸旗艦 Android 手機。
這些年一直謠傳 Sony Mobile 可能再次推出小尺寸手機,現在根據 OnLeaks 的爆料, Xperia Compact 系列很可能在 2021 年復活。

▲圖片來源:Steve Hemmerstoffer(Voice/OnLeaks)

Sony Mobile 全新 Xperia Compact 小尺寸手機回歸?爆料大神釋出高清晰渲染圖

這些年來,市場不時會傳聞 Sony Mobile 可能再次將旗下 Xperia Compact 系列小尺寸手機再次回歸。在兩個月前,日本部落格 AndroidNext 報導 Xperia Compact 系列可能會在 2021 年「復活」。稍早,爆料大神 OnLeaks 也據稱取得獨家消息指出 Sony Mobile 確實將推出新款小尺寸智慧型手機。
雖然目前無法得知這款新機的正確名稱為何,不過 OnLeaks 已釋出大量關於這款新機的外觀渲染圖。傳聞這款 Xperia Compact 手機將採用 5.5 吋螢幕,機身尺寸僅有 140*68.9*8.9mm ,不過仍比 5.4 吋的 iPhone 12 mini 的 131.5*64.2*7.4mm 略大一些。

▲圖片來源:Steve Hemmerstoffer(Voice/OnLeaks)

傳聞這款新機將採用平面顯示螢幕和底部邊框帶有些「份量」的下巴,螢幕前置鏡頭採用水滴螢幕設計,配備 800 萬像素自拍鏡頭,機身背面謠傳將配備 1300 萬像素雙鏡頭主相機。

▲圖片來源:Steve Hemmerstoffer(Voice/OnLeaks)

音量鍵設置於機身左側,同側還可見到實體快門鍵和結核電容式指紋感應器的電源鍵,SIM 卡槽則設計在機身另一側。在機身頂部可見到 3.5mm 耳機插孔,底部則有立體聲揚聲器和 USB Type-C 接口。

▲圖片來源:Steve Hemmerstoffer(Voice/OnLeaks)

▲圖片來源:Steve Hemmerstoffer(Voice/OnLeaks)

消息來源:Steve H.McFly(Twitter/@OnLeaks)|Steve Hemmerstoffer(Voice/OnLeaks)

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

延伸閱讀:
Sony Mobile 中階新機 Xperia 10 III 高清晰渲染圖曝光:外型與前代相似、仍將保留3.5mm耳機孔

OPPO Find X3 Lite 完整實機開箱照洩漏!只是外觀有點眼熟?

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

微軟最新的廣告,直白地跟你說 Surface Pro 7 就是比 MacBook Pro 好_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

近期關於筆電的話題,MacBook 可以說是出盡了風頭,身為電腦作業系統霸主的微軟當然不依,近日,微軟發表了一支最新的 Surface Pro 7 廣告影片,這回揚棄了迂迴影射等小家子氣的作法,用最直接的方式向全世界宣示,咱門家的 Surface Pro 7 就是比 MacBook Pro 好!

微軟最新的廣告,直白地跟你說 Surface Pro 7 就是比 MacBook Pro 好

在微軟的最新影片中,著重於突顯兩者之間的差異性, Surface Pro 7 因為擁有觸控螢幕、手寫筆、可移動拆卸的鍵盤以及大量可支援的應用軟體,自然毫不意外地在這場比較大賽中獲勝。從另外一個方面來看,雖然 MacBook Pro 也有將觸控的元素融入其中,但僅限於 Touch Bar 的部分,顯然無法提供用戶與 Surface Pro 7 同等的功能性。

這支名為「Microsoft Surface Pro 7:The Better Choice」的宣傳廣告中,還特別說明了只有 Surface Pro 7 同時兼有平板電腦和筆記型電腦的多功能性和便於攜帶。借助觸控螢幕、可拆卸鍵盤和手寫筆等功能,還能運行你最喜愛的應用程式等眾多功能,Microsoft Surface Pro 7 擁有做你喜歡的事情所需要的一切,讓你可以隨時隨地工作或玩遊戲。

近期,微軟還推出了 Surface Pro 7+,這款以企業、商務用戶為主的升級版本中附帶了新一代的硬體配備與更強大的安全性。除卻內裡,從外觀上看與 Surface Pro 7 並無二致,而這款機型在上週已經在台灣開賣,定價方面算是頗有誠意。

或許對於兩種系統間游移不定的消費者來說,這樣直接剖白的廣告能夠讓人有所導向,但對於大多數用戶來說,心中已經有自己偏好的系統,是不是真的能夠藉由這樣的話術就能把用戶洗過去還很難說。

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

◎資料來源:SoftPedia 

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

YouTube 的 PWA 應用終於在 Windows 與 ChromeOS 上推出了(內含一秒安裝方式)_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

一直以來,Windows 平台上都沒有可以直接安裝到電腦上的 YouTube 應用程式,所以每次當你想要觀賞影片時,都必須先打開瀏覽器,然後再前往 YouTube 網站上,不像在手機上那麼直接點擊就能前往。不過,現在 YouTube 的 PWA 應用終於登陸 Windows 10 與 ChromeOS 上,以後不用那麼麻煩囉!

YouTube 的 PWA 應用終於在 Windows 與 ChromeOS 上推出了

明明 YouTube 在全球擁有那麼多用戶,但卻遲遲沒有在電腦版本上推出像手機那般一點就開的應用程式,大家只能從瀏覽器前往網頁版本,隨著 PWA(漸進式網頁應用程式)的興起,這件小事日前已經迎刃而解。只要你是 Windows 10 或 ChromeOS 作業系統,現在都能安裝 YouTube 的 PWA。

怎麼安裝呢?首先打開你的 Chrome 或 Microsoft Edge 瀏覽器,然後前往 YouTube 網站。接著點選瀏覽器網址列旁邊的「+」號即可進行安裝。由於 Chrome 與 Edge 瀏覽器上會看到的圖示不太一樣,下面筆者將兩者都截圖下來,這樣大家比較好辨認。接著同意安裝後就馬上完成,完全不需等候。

安裝好後,你可以在電腦桌面上看到開啟 YouTube PWA 應用的捷徑,同時在開始功能表中也可以看到 YouTube PWA 的身影,未來想要看 YouTube 影片,你可以直接點擊圖示就能快速喚出。

YouTube PWA 應用的好處是它會變成獨立應用般運作(如下圖),不需要另外開瀏覽器,特別是當你瀏覽器分頁或視窗開了很多的時候,從一大堆網站裡面撈出 YouTube 也並不是那麼容易的事情,非常難找。其他包含功能、介面,其實就與網頁版差不多,沒有什麼需要重新適應的問題。

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

如果某日你想要移除它,就像移除其他 Windows 系統中的應用程式與軟體一樣,從設定功能中去執行就好,不會有一安裝就像被咬住不放的感覺。目前 YouTube PWA 需在網路連線狀態下運作,Google 一直在鼓勵各家 PWA 的開發者於應用中增加更多離線功能,這表示未來我們還可以在 YouTube PWA 中看到一些新的離線驚喜,筆者個人是希望可以有影片下載,這樣就算在網路不方便連接的地方也可以輕鬆看啦!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

一篇文章帶你快速弄清楚什麼是終端_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

Linux的使用者可能每天都會接觸到 Bash、Shell、控制台、終端。它們之間有什麼不同嗎?本文為你快速解釋這些概念以及它們的區別。

  

什麼是終端

 

首先我們來弄清楚什麼是終端(terminal)。按照百度百科的解釋是:“經由通信設施向計算機輸入程序和數據或接收計算機輸出處理結果的設備。” 聽起來似乎有點晦澀,其實用台式PC機來舉例就很容易理解了。一台台式機是由主機(機箱)和很多外圍設備組成的。主機裡邊包括主板、CPU、內存、硬盤、和其他芯片等等。外圍設備包括显示器、鼠標、鍵盤、耳機、麥克風、和攝像頭等等。這些外圍設備就被稱為終端,負責向主機輸入數據的就叫輸入終端,比如鼠標、鍵盤、麥克風、攝像頭,負責接收主機輸出數據的設備就被稱作輸出終端,比如显示器、耳機。

 

 

所以有兩個概念我們這裏就清楚了:

計算機 = 主機 + 終端

終端 = 輸入終端 + 輸出終端

  

終端的類型

 

終端,除了可以分為輸入終端與輸出終端外,還可以按照與主機的距離可以本地終端和遠程終端,或者按照與主機的連接方式分成物理終端和虛擬終端。

 

舉個例子,比如我們在杭州的某個機房裡有一台服務器,用VGA線接了一台显示器,用USB連接了鍵盤,那麼這台显示器和這個鍵盤就是服務器的本地終端。假如我們在隔壁機房用串口線又接了一個显示器和鍵盤,那它們就可以稱為遠程終端。不管是在本地機房還是隔壁機房,因為這幾個終端和服務器都是通過物理設備直接連接的,所以它們都被稱為物理終端。物理終端在 Linux中被標識為 tty。它是teletype的縮寫,因為在計算機早期的時候,Ken Thompson 和 Dennis Ritchie用電傳打印機作為他們  Unix 服務器的終端(參考《Linux,Unix,GNU 到底有什麼樣的淵源?》),所以這個名字就這樣被沿用了下來。

 

假如我們在上海的家裡通過 ssh 遠程登陸杭州的服務器,那麼我們在家中用的設備就是服務器的遠程終端,也是一個虛擬終端(因為沒有與服務器在本地用物理設備連接)。虛擬終端在 Linux 中用 pts (pseudo termial slave)來標識。用 who 命令可以查看當前登陸系統的用戶,以及他們所使用的終端類型。

 

 

什麼是控制台

 

控制台(console)與終端現在已經幾乎表示同一個意思了,但是在計算機發展的早期它們還是有本質區別的。最初,大型計算機(可能有幾間屋子那麼大)只有一個終端,被稱為”控制台“,而它真的是一個控制台,就像下面這張圖這樣,有很多的儀錶和開關,技術人員就是通過它來對計算機發出指令。那個時候計算機雖然很大,但每次只能有一個人來操作,並且一次也只能運行一個程序。後來Ken Thompson 和 Dennis Ritchie發明了Unix,於是操作系統可以同時運行多個程序,並且支持多個用戶同時登陸。這樣一來,僅有一個控制台就顯得不夠了。因為控制台又很貴,所以 Ken Thompson 和 Dennis Ritchie就用了相對便宜的電傳打字機作為新增加的終端連接到他們的計算機上。雖然一台計算機可以連接很多個終端,但這裏邊只能有一個控制台,並且控制台的權限要遠大於其他的終端,比如當系統發生啟動錯誤時,只有控制台會显示錯誤消息,而其他終端不會;或者當系統進入單用戶登陸模式時,只有通過控制台才能進行登陸,而通過其他終端沒有辦法登陸。所以如果用一句話來總結控制台與終端的區別,可以說控制台是計算機最早的以及權限最大的一個終端。

 

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

  

什麼是 Shell 和 Bash

 

終端和主機雖然連接起來了,但是計算機還是需要一個程序才能明白我們輸入的命令,這個程序就是 Shell。我們的命令就是通過終端輸入到 Shell 里,再由 Shell 轉換成計算機明白的指令,然後計算機才能運行。

 Shell 有很多種,我們最常用的是 Bash,另外還有Csh, Ksh, Zsh等等。對於Bash,Linux的用戶應該每天都在使用,這裏就不再展開介紹了。

  

最後

 

控制台、終端、Shell、Bash 這些名詞經常被大家混淆,雖然今天在很多場合它們經常被替換使用,大家也都明白,不過希望通過本文大家可以弄清楚它們之間的區別和聯繫。

 

 

推薦閱讀:

《一篇文章看清楚 Linux 的職業發展方向》

《2020年你最需要掌握的11種編程語言》

《微軟:懸賞10萬美金破解 Linux 系統》

《安卓到底是不是Linux》

《在 Linux 系統中如何管理 systemd 服務》

《Linux的運行級別與目標》

《軟鏈接 vs. 硬鏈接》

 

 

 

歡迎大家關注我的微信公眾號,獲取知識乾貨、增加面試經驗、了解程序人生。
回復【面試】,獲取技術大廠面試寶典

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

容器技術之Dockerfile(二)_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

  前文我們聊到了什麼是dockerfile,它的主要作用以及dockerfile的一些基本指令的使用方法,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13019411.html;今天我們在來聊一聊dockerfile餘下指令的用法和作用;

  1、RUN:該指令用於docker build 過程中運行的程序,可以是任何命令;語法格式RUN <command> 或RUN [“<executable>”, “<param1>”, “<param2>”];第一種格式中,<command>通常是一個shell命令,且以“/bin/sh -c”來運行它,這意味着此進程在容器中的PID不為1,不能接收Unix信號,因此,當使用docker stop <container>命令停止容器時,此進程接收不到SIGTERM信號; 第二種語法格式中的參數是一個JSON格式的數組,其中<executable>為要運行的命令,後面的<paramN>為傳遞給命令的選項或參數;然而,此種格式指定的命令不會以“/bin/sh -c”來發起,因此常見的shell操作如變量替換以及通配符(?,*等)替換將不會進行;不過,如果要運行的命令依賴於此shell特性的話,可以將其替換為 RUN [“/bin/sh”, “-c”, “<executable>”, “<param1>”]這樣的格式;注意:json數組中,要使用雙引號;

  示例:

[root@node1 test]# cat Dockerfile 
FROM centos:7 

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

RUN mkdir -p /aaa/bbb/t{1..4}



[root@node1 test]# 

  提示:以上Dockerfile中,用RUN指令運行了mkdir命令,這種運行命令的方式在就可以利用shell的特性,如上大括號展開功能;

  驗證:build 該dockerfile后,運行該鏡像為容器,看看容器內部是否創建了/aaa/bbb/t1 t2 t3 t4?

[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              1c35c4412082        16 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker build . -t myimg:v1
Sending build context to Docker daemon   1.05MB
Step 1/9 : FROM centos:7
 ---> b5b4d78bc90c
Step 2/9 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Running in 64c792ce6750
Removing intermediate container 64c792ce6750
 ---> 604899ef29f9
Step 3/9 : LABEL version="1.0"
 ---> Running in 6a3f9b4a9058
Removing intermediate container 6a3f9b4a9058
 ---> d9edea71fa22
Step 4/9 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Running in b191ab5e19f9
Removing intermediate container b191ab5e19f9
 ---> ee027bbdc04b
Step 5/9 : ARG web_home
 ---> Running in a4c86febf616
Removing intermediate container a4c86febf616
 ---> 5b25bb7421dd
Step 6/9 : COPY html ${web_home:-"/data/htdoc/"}
 ---> 7c7a667149fa
Step 7/9 : VOLUME ${web_home:-"/data/htdoc/"}
 ---> Running in f9ec02d8f736
Removing intermediate container f9ec02d8f736
 ---> 86c7226f6b21
Step 8/9 : EXPOSE 80/tcp 443/tcp
 ---> Running in ad82d389ac25
Removing intermediate container ad82d389ac25
 ---> 28dadea40aff
Step 9/9 : RUN mkdir -p /aaa/bbb/t{1..4}
 ---> Running in 1013a212d3f2
Removing intermediate container 1013a212d3f2
 ---> 7f109a34a4a5
Successfully built 7f109a34a4a5
Successfully tagged myimg:v1
[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1                  7f109a34a4a5        4 seconds ago       203MB
busybox             latest              1c35c4412082        16 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker run --name test --rm -it myimg:v1 /bin/bash
[root@fc89ca934ed5 /]# ls /
aaa                bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
anaconda-post.log  data  etc  lib   media  opt  root  sbin  sys  usr
[root@fc89ca934ed5 /]# ls /aaa/
bbb
[root@fc89ca934ed5 /]# ls /aaa/bbb/
t1  t2  t3  t4
[root@fc89ca934ed5 /]# exit
exit
[root@node1 test]# 

  提示:底層基礎鏡像的shell如果不支持大括號展開,那麼我們基於這種鏡像做出來的鏡像運行以上命令也就不支持shell的大括號展開功能;

  示例:

[root@node1 test]# cat Dockerfile
FROM centos:7

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

RUN mkdir -p /aaa/bbb/t{1..4}

RUN ["mkdir","-p","/ccc/ddd/f{1..4}"]

[root@node1 test]# 

  提示:以json數組格式的方式去運行命令,它默認是不支持shell的任何特性,這意味着運行該命令時,不是基於shell子進程的方式在執行命令,通常是內核直接執行了;所以上面的命令它會把大括號處理成字符,而不會展開;

  驗證:build成鏡像運行成容器,看看是否把大括號處理成字符了?

[root@node1 test]# docker build . -t myimg:v1.1
Sending build context to Docker daemon   1.05MB
Step 1/10 : FROM centos:7
 ---> b5b4d78bc90c
Step 2/10 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Using cache
 ---> 604899ef29f9
Step 3/10 : LABEL version="1.0"
 ---> Using cache
 ---> d9edea71fa22
Step 4/10 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Using cache
 ---> ee027bbdc04b
Step 5/10 : ARG web_home
 ---> Using cache
 ---> 5b25bb7421dd
Step 6/10 : COPY html ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> 7c7a667149fa
Step 7/10 : VOLUME ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> 86c7226f6b21
Step 8/10 : EXPOSE 80/tcp 443/tcp
 ---> Using cache
 ---> 28dadea40aff
Step 9/10 : RUN mkdir -p /aaa/bbb/t{1..4}
 ---> Using cache
 ---> 7f109a34a4a5
Step 10/10 : RUN ["mkdir","-p","/ccc/ddd/f{1..4}"]
 ---> Running in 9da1e6bab59f
Removing intermediate container 9da1e6bab59f
 ---> ae463ec8cbd9
Successfully built ae463ec8cbd9
Successfully tagged myimg:v1.1
[root@node1 test]# docker run --name test --rm -it myimg:v1.1 /bin/bash
[root@02ec6e404100 /]# ls /
aaa                bin  data  etc   lib    media  opt   root  sbin  sys  usr
anaconda-post.log  ccc  dev   home  lib64  mnt    proc  run   srv   tmp  var
[root@02ec6e404100 /]# ls /ccc/ddd/
f{1..4}
[root@02ec6e404100 /]# 

  提示:可以看到在/ccc/ddd/目錄下並沒有把大括號展開,而是直接把它當成了字符處理了;如果我們想要用json數組這種方式運行命令,又想讓使用shell特性,我們可以使用”/bin/sh -c”來明確聲明後面的命令用shell子進程的方式運行;如下所示

[root@node1 test]# cat Dockerfile
FROM centos:7

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

RUN mkdir -p /aaa/bbb/t{1..4}

RUN ["/bin/bash","-c","mkdir -p /ccc/ddd/f{1..4}"]

[root@node1 test]# 

  提示:以上運行命令的方式就明確聲明使用shell子進程的方式運行命令;這裏需要注意一點的是,如果使用json數組的方式運行命令,後面真正執行的命令要一個整體當作參數傳給”/bin/bash”

  驗證:看看是否會把大括號展開?

[root@node1 test]# docker build . -t myimg:v1.2
Sending build context to Docker daemon   1.05MB
Step 1/10 : FROM centos:7
 ---> b5b4d78bc90c
Step 2/10 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Using cache
 ---> 604899ef29f9
Step 3/10 : LABEL version="1.0"
 ---> Using cache
 ---> d9edea71fa22
Step 4/10 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Using cache
 ---> ee027bbdc04b
Step 5/10 : ARG web_home
 ---> Using cache
 ---> 5b25bb7421dd
Step 6/10 : COPY html ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> 7c7a667149fa
Step 7/10 : VOLUME ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> 86c7226f6b21
Step 8/10 : EXPOSE 80/tcp 443/tcp
 ---> Using cache
 ---> 28dadea40aff
Step 9/10 : RUN mkdir -p /aaa/bbb/t{1..4}
 ---> Using cache
 ---> 7f109a34a4a5
Step 10/10 : RUN ["/bin/bash","-c","mkdir -p /ccc/ddd/f{1..4}"]
 ---> Running in a5785a139e1f
Removing intermediate container a5785a139e1f
 ---> 30a5f5594104
Successfully built 30a5f5594104
Successfully tagged myimg:v1.2
[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1.2                30a5f5594104        5 seconds ago       203MB
myimg               v1.1                ae463ec8cbd9        9 minutes ago       203MB
myimg               v1                  7f109a34a4a5        21 minutes ago      203MB
busybox             latest              1c35c4412082        16 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker run --name test --rm -it myimg:v1.2 /bin/bash
[root@549f875aa4de /]# ls /
aaa                bin  data  etc   lib    media  opt   root  sbin  sys  usr
anaconda-post.log  ccc  dev   home  lib64  mnt    proc  run   srv   tmp  var
[root@549f875aa4de /]# ls /ccc/ddd/
f1  f2  f3  f4
[root@549f875aa4de /]# 

  提示:可以看到用”/bin/bash -c” 是可以明確聲明後面的命令用shell子進程的方式運行,這樣一來就可以在後面的命令使用shell特性的語法;

  2、CMD:該指令類似於RUN指令,CMD指令也可用於運行任何命令或應用程序,不過,二者的運行時間點不同; RUN指令運行於映像文件構建過程中,而CMD指令運行於基於Dockerfile構建出的新映像文件啟動一個容器時; CMD指令的首要目的在於為啟動的容器指定默認要運行的程序,且其運行結束后,容器也將終止;不過,CMD指定的命令其可以被docker run的命令行選項所覆蓋;在Dockerfile中可以存在多個CMD指令,但僅最後一個會生效;語法格式 CMD <command> 或 CMD [“<executable>”, “<param1>”, “<param2>”] 或 CMD [“<param1>”,”<param2>”];前兩種語法格式的意義同RUN,第三種則用於為ENTRYPOINT指令提供默認參數;

  示例:

[root@node1 test]# cat Dockerfile
FROM busybox:latest

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

CMD httpd -f -h /data/htdoc/
[root@node1 test]# 

  提示:docker容器內部運行的程序必須運行為前台;CMD是指定容器運行時要運行的命令;通常該命令或程序是以前台方式運行;如果不是前台運行,我們的容器就會存在一啟動就退出的情況;以上命令就表示前台運行httpd程序 並指定httpd 的工作目錄為${web_home}變量所指定的目錄;

  驗證:build后看看啟動為容器是否提供80訪問服務?

[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1.2                30a5f5594104        23 minutes ago      203MB
myimg               v1.1                ae463ec8cbd9        32 minutes ago      203MB
myimg               v1                  7f109a34a4a5        44 minutes ago      203MB
busybox             latest              1c35c4412082        16 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker build . -t myimg:v1.3
Sending build context to Docker daemon   1.05MB
Step 1/9 : FROM busybox:latest
 ---> 1c35c4412082
Step 2/9 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Running in deb5e54eef87
Removing intermediate container deb5e54eef87
 ---> baf170e0c586
Step 3/9 : LABEL version="1.0"
 ---> Running in 433669185e0d
Removing intermediate container 433669185e0d
 ---> d96fb4ae3d58
Step 4/9 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Running in b5da74e27c69
Removing intermediate container b5da74e27c69
 ---> 62372d19daf3
Step 5/9 : ARG web_home
 ---> Running in 3f65a67bb15a
Removing intermediate container 3f65a67bb15a
 ---> 1ce797c7cde0
Step 6/9 : COPY html ${web_home:-"/data/htdoc/"}
 ---> 15848dea21b9
Step 7/9 : VOLUME ${web_home:-"/data/htdoc/"}
 ---> Running in 868f4c10e00f
Removing intermediate container 868f4c10e00f
 ---> f3ec40d1cb5e
Step 8/9 : EXPOSE 80/tcp 443/tcp
 ---> Running in 7f72c2612e92
Removing intermediate container 7f72c2612e92
 ---> 5ccfc6d604cc
Step 9/9 : CMD httpd -f -h /data/htdoc/
 ---> Running in 95a4fd578821
Removing intermediate container 95a4fd578821
 ---> 2e296b4f4500
Successfully built 2e296b4f4500
Successfully tagged myimg:v1.3
[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1.3                2e296b4f4500        3 seconds ago       1.22MB
myimg               v1.2                30a5f5594104        23 minutes ago      203MB
myimg               v1.1                ae463ec8cbd9        33 minutes ago      203MB
myimg               v1                  7f109a34a4a5        44 minutes ago      203MB
busybox             latest              1c35c4412082        16 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker run --name b1 -d myimg:v1.3
c3514f782cffd8140aa7c612293029f4d0302e8d697887dfc2696eea44a31700
[root@node1 test]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c3514f782cff        myimg:v1.3          "/bin/sh -c 'httpd -…"   4 seconds ago       Up 3 seconds        80/tcp, 443/tcp     b1
[root@node1 test]# curl http://172.17.0.2/test1.html
this is test1 html
[root@node1 test]# 

  提示:可以看到httpd是可以正常提供服務的;從上面的信息我們也可以了解到運行容器后,它默認是把我們寫的命令當作shell子命令的方式在運行;

  示例:以json數組方式運行命令

[root@node1 test]# cat Dockerfile 
FROM busybox:latest

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

CMD ["httpd","-f","-h","/data/htdoc/"]

[root@node1 test]# 

  提示:用json數組格式運行命令,需要把後面的每個選項當作參數傳給httpd;

  驗證:運行容器看看容器是否退出,是否能夠正常提供httpd服務?

[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1.3                2e296b4f4500        24 minutes ago      1.22MB
myimg               v1.2                30a5f5594104        47 minutes ago      203MB
myimg               v1.1                ae463ec8cbd9        57 minutes ago      203MB
myimg               v1                  7f109a34a4a5        About an hour ago   203MB
busybox             latest              1c35c4412082        17 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker build . -t myimg:v1.4
Sending build context to Docker daemon   1.05MB
Step 1/9 : FROM busybox:latest
 ---> 1c35c4412082
Step 2/9 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Using cache
 ---> baf170e0c586
Step 3/9 : LABEL version="1.0"
 ---> Using cache
 ---> d96fb4ae3d58
Step 4/9 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Using cache
 ---> 62372d19daf3
Step 5/9 : ARG web_home
 ---> Using cache
 ---> 1ce797c7cde0
Step 6/9 : COPY html ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> 15848dea21b9
Step 7/9 : VOLUME ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> f3ec40d1cb5e
Step 8/9 : EXPOSE 80/tcp 443/tcp
 ---> Using cache
 ---> 5ccfc6d604cc
Step 9/9 : CMD ["httpd","-f","-h","/data/htdoc/"]
 ---> Running in 5bebdabfe2b7
Removing intermediate container 5bebdabfe2b7
 ---> 58e3b4c40ae7
Successfully built 58e3b4c40ae7
Successfully tagged myimg:v1.4
[root@node1 test]# docker run --name b1 -d myimg:v1.4
a32a05033a6dcb735363906bfcd2b84cfb290ca1b60c17d3ac2f81cdeceee705
[root@node1 test]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a32a05033a6d        myimg:v1.4          "httpd -f -h /data/h…"   6 seconds ago       Up 5 seconds        80/tcp, 443/tcp     b1
[root@node1 test]# curl http://172.17.0.2/test1.html
this is test1 html
[root@node1 test]# 

  提示:可以看到httpd服務可以正常提供訪問,說明我們用json數組方式運行命令是正確的;總結一點,用CMD或RUN指令運行命令時,如果直接在CMD或RUN指令後面接命令,這種方式通常會被解釋為啟動一個shell子進程運行命令,RUN指令表現形式就是後面的命令可以使用shell特性的語法格式的命令,比如大括號展開等等;而CMD指令表現形式就是啟動為容器后,它默認會把我們指定運行的命令當作參數傳給“/bin/sh”來運行;CMD或RUN指令加中括號的形式就表示使用json數組格式方式運行命令;這種方式運行命令在CMD中表現形式是我們運行的命令的選項都要當作參數傳給該命令;RUN指令表現形式是不能使用shell特性的命令;如果非要使用shell特性的命令格式,我們需要把我們的命令當作參數傳給“/bin/sh”,當然前提是我們的基礎鏡像shell支持shell特性的語法;

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

  3、ENTRYPOINT:該指令類似CMD指令的功能,用於為容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序;與CMD不同的是,由ENTRYPOINT啟動的程序不會被docker run命令行指定的參數所覆蓋,而且,這些命令行參數會被當作參數傳遞給ENTRYPOINT指定的程序(不過,docker run命令的–entrypoint選項的參數可覆蓋ENTRYPOINT指令指定的程序);語法格式 ENTRYPOINT <command>或 ENTRYPOINT [“<executable>”, “<param1>”, “<param2>”];docker run命令傳入的命令參數會覆蓋CMD指令的內容並且附加到ENTRYPOINT命令最後做為其參數使用;Dockerfile文件中也可以存在多個ENTRYPOINT指令,但僅有最後一個會生效;

  示例:

[root@node1 test]# cat Dockerfile
FROM busybox:latest

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

ENTRYPOINT httpd -f -h /data/htdoc/
[root@node1 test]# 

  提示:以上dockerfile中用ENTRYPOINT 來指定容器默認運行程序,它和CMD不同的是,CMD指定運行的命令,我們可以使用docker run 命令加要運行的的命令替代容器里默認運行的命令,而ENTRYPOINT指定的命令我們是不可隨便替換的,如果要替換必須要使用–entrypoint選項來指定;

  驗證:build成鏡像,我們啟動為容器直接運行/bin/sh 看看是否可行?

[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1.4                58e3b4c40ae7        23 minutes ago      1.22MB
myimg               v1.3                2e296b4f4500        47 minutes ago      1.22MB
myimg               v1.2                30a5f5594104        About an hour ago   203MB
myimg               v1.1                ae463ec8cbd9        About an hour ago   203MB
myimg               v1                  7f109a34a4a5        2 hours ago         203MB
busybox             latest              1c35c4412082        17 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker build . -t myimg:v1.5
Sending build context to Docker daemon   1.05MB
Step 1/9 : FROM busybox:latest
 ---> 1c35c4412082
Step 2/9 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Using cache
 ---> baf170e0c586
Step 3/9 : LABEL version="1.0"
 ---> Using cache
 ---> d96fb4ae3d58
Step 4/9 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Using cache
 ---> 62372d19daf3
Step 5/9 : ARG web_home
 ---> Using cache
 ---> 1ce797c7cde0
Step 6/9 : COPY html ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> 15848dea21b9
Step 7/9 : VOLUME ${web_home:-"/data/htdoc/"}
 ---> Using cache
 ---> f3ec40d1cb5e
Step 8/9 : EXPOSE 80/tcp 443/tcp
 ---> Using cache
 ---> 5ccfc6d604cc
Step 9/9 : ENTRYPOINT httpd -f -h /data/htdoc/
 ---> Running in de274d68686c
Removing intermediate container de274d68686c
 ---> 5825c2ec655f
Successfully built 5825c2ec655f
Successfully tagged myimg:v1.5
[root@node1 test]# docker run --name b1 --rm -it myimg:v1.5 /bin/sh

  提示:運行以上命令后,不會給我們一個shell終端,也不報錯;但是我們直接訪問httpd服務是可以正常訪問的;這意味我們用docker run 命令是不能替換我們用entrypoint指定指定的命令的;

  測試:用–entrypoint 選項來看看是否能夠覆蓋ENTRYPOINT指定所指定的命令程序?

[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myimg               v1.5                5825c2ec655f        12 minutes ago      1.22MB
myimg               v1.4                58e3b4c40ae7        35 minutes ago      1.22MB
myimg               v1.3                2e296b4f4500        About an hour ago   1.22MB
myimg               v1.2                30a5f5594104        About an hour ago   203MB
myimg               v1.1                ae463ec8cbd9        2 hours ago         203MB
myimg               v1                  7f109a34a4a5        2 hours ago         203MB
busybox             latest              1c35c4412082        17 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker run --name b1 --rm -it --entrypoint "/bin/sh" myimg:v1.5
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
    7 root      0:00 ps
/ # 

  提示:可以看到使用docker run 必須要加–entrypoint 選項才可以覆蓋ENTRYPOINT指令指定的命令;

  示例:使用json數組格式來指定命令

[root@node1 test]# cat Dockerfile 
FROM busybox:latest

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

ARG web_home

COPY html ${web_home:-"/data/htdoc/"}

VOLUME ${web_home:-"/data/htdoc/"}

EXPOSE 80/tcp 443/tcp

ENTRYPOINT ["httpd","-f","-h","/data/htdoc/"]

[root@node1 test]# 

  提示:使用json數組格式來指定命令時,都需要將後面的選項和參數當作該命令的參數傳進去;

  測試:使用docker run 直接加命令 看看是否能夠覆蓋ENTRYPOINT指令指定的命令?

  提示:可以看到我們直接使用命令是無法覆蓋ENTRYPOINT指令說指定的命令;

  示例:

[root@node1 test]# cat Dockerfile 
FROM centos:7

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

RUN yum install -y httpd

EXPOSE 80/tcp 

ENTRYPOINT ["/usr/sbin/httpd","-DFOREGROUND"]

[root@node1 test]# 

  測試:用docker run 命令覆蓋ENTRYPOINT指定的默認命令,看看是否可行?

[root@node1 test]# docker build . -t myimg:v1.7
Sending build context to Docker daemon  1.051MB
Step 1/7 : FROM centos:7
 ---> b5b4d78bc90c
Step 2/7 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Using cache
 ---> 604899ef29f9
Step 3/7 : LABEL version="1.0"
 ---> Using cache
 ---> d9edea71fa22
Step 4/7 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Using cache
 ---> ee027bbdc04b
Step 5/7 : RUN yum install -y httpd
 ---> Running in 164240645e39
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-93.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-93.el7.centos for package: httpd-2.4.6-93.el7.centos.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-93.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-93.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-93.el7.centos.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-93.el7.centos.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-5.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-93.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch          Version                    Repository   Size
================================================================================
Installing:
 httpd               x86_64        2.4.6-93.el7.centos        base        2.7 M
Installing for dependencies:
 apr                 x86_64        1.4.8-5.el7                base        103 k
 apr-util            x86_64        1.5.2-6.el7                base         92 k
 centos-logos        noarch        70.0.6-3.el7.centos        base         21 M
 httpd-tools         x86_64        2.4.6-93.el7.centos        base         92 k
 mailcap             noarch        2.1.41-2.el7               base         31 k

Transaction Summary
================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 24 M
Installed size: 32 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/apr-util-1.5.2-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for apr-util-1.5.2-6.el7.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                              7.8 MB/s |  24 MB  00:03     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-8.2003.0.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-5.el7.x86_64                                       1/6 
  Installing : apr-util-1.5.2-6.el7.x86_64                                  2/6 
  Installing : httpd-tools-2.4.6-93.el7.centos.x86_64                       3/6 
  Installing : centos-logos-70.0.6-3.el7.centos.noarch                      4/6 
  Installing : mailcap-2.1.41-2.el7.noarch                                  5/6 
  Installing : httpd-2.4.6-93.el7.centos.x86_64                             6/6 
  Verifying  : mailcap-2.1.41-2.el7.noarch                                  1/6 
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                  2/6 
  Verifying  : httpd-2.4.6-93.el7.centos.x86_64                             3/6 
  Verifying  : apr-1.4.8-5.el7.x86_64                                       4/6 
  Verifying  : httpd-tools-2.4.6-93.el7.centos.x86_64                       5/6 
  Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                      6/6 

Installed:
  httpd.x86_64 0:2.4.6-93.el7.centos                                            

Dependency Installed:
  apr.x86_64 0:1.4.8-5.el7                                                      
  apr-util.x86_64 0:1.5.2-6.el7                                                 
  centos-logos.noarch 0:70.0.6-3.el7.centos                                     
  httpd-tools.x86_64 0:2.4.6-93.el7.centos                                      
  mailcap.noarch 0:2.1.41-2.el7                                                 

Complete!
Removing intermediate container 164240645e39
 ---> 63db91f4fe6a
Step 6/7 : EXPOSE 80/tcp
 ---> Running in 6585da71fc3b
Removing intermediate container 6585da71fc3b
 ---> eb671cf67f52
Step 7/7 : ENTRYPOINT ["/usr/sbin/httpd","-DFOREGROUND"]
 ---> Running in f6e7297025af
Removing intermediate container f6e7297025af
 ---> bac03b20761a
Successfully built bac03b20761a
Successfully tagged myimg:v1.7
[root@node1 test]# docker run --name m1 --rm -it myimg:v1.7 /bin/sh
Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file]
                       [-C "directive"] [-c "directive"]
                       [-k start|restart|graceful|graceful-stop|stop]
                       [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings
  -t -D DUMP_RUN_CFG : show parsed run settings
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)
[root@node1 test]# 

  提示:可以看到我們用docker run指定命令去覆蓋ENTRYPOINT指令指定的命令,它給我們打印了httpd命令的用法,這說明我們後面傳遞的/bin/sh 當作參數傳遞給ENTRYPOINT說指定的命令;這裏還需要說一下,上面的示例用docker run 去覆蓋ENTRYPOINT指令指定的命令,沒有報錯的原因應該是busybox里的httpd程序支持傳遞/bin/sh當作參數;

  示例:CMD指令同ENTRYPOINT一起使用

[root@node1 test]# cat Dockerfile 
FROM centos:7

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."

RUN yum install -y httpd

ADD entrypoint.sh /bin/

EXPOSE 80/tcp 

CMD ["/usr/sbin/httpd","-DFOREGROUND"]

ENTRYPOINT ["/bin/entrypoint.sh"]

[root@node1 test]# 

  提示:以上dockerfile使用了CMD和ENTRYPOINT指令來指定容器默認運行程序;此時CMD所指定的命令默認會以參數的形式傳給ENTRYPOINT指令所指定的命令;而上面ENTRYPOINT指定指定的是一個腳本,也就說上面dockerfile最終運行的命令是/bin/entrypoint.sh /usr/sbin/httpd -DFOREGROUND;這裏的腳本就相當於中間層,通過腳本設定一些參數,然後把CMD指定的命令當作參數傳給腳本,最終腳本運行起來;

  entrypoint腳本

[root@node1 test]# ll
total 1032
-rw-r--r-- 1 root root     307 Jun  3 11:28 Dockerfile
-rwxr-xr-x 1 root root     300 Jun  3 11:22 entrypoint.sh
drwxr-xr-x 2 root root      42 May 31 01:51 html
-rw-r--r-- 1 root root 1043748 May 26 11:07 nginx-1.19.0.tar.gz
-rw-r--r-- 1 root root      22 May 31 01:52 test.html
[root@node1 test]# cat entrypoint.sh 
#!/bin/bash

doc_root=${DOC_ROOT:-/var/www/html}
cat > /etc/httpd/conf.d/myweb.conf <<EOF
        <virtualhost *:80>
                servername "localhost"
                documentroot "${doc_root}"
                <directory "${doc_root}">
                        options none
                        allowoverride none
                        require  all granted
                </directory>
        </virtualhost>
EOF

exec "$@"
[root@node1 test]# 

  提示:這個腳本很簡單就是在/etc/httpd/conf.d/生成一個myweb.conf的配置文件,然後最後引用腳本的參數運行;exec “$@” 表示把腳本的所有參數獨立運行成一個守護進程;默認不使用exec就表示以shell子進程的方式運行,exec就表示運行為單獨的守護進程,不再是shell子進程的方式;

  測試:

[root@node1 test]# docker build . -t httpd:v1
Sending build context to Docker daemon  1.051MB
Step 1/9 : FROM centos:7
 ---> b5b4d78bc90c
Step 2/9 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>"
 ---> Using cache
 ---> 604899ef29f9
Step 3/9 : LABEL version="1.0"
 ---> Using cache
 ---> d9edea71fa22
Step 4/9 : LABEL description="this is test file \ that label-values can span multiple lines."
 ---> Using cache
 ---> ee027bbdc04b
Step 5/9 : RUN yum install -y httpd
 ---> Using cache
 ---> 63db91f4fe6a
Step 6/9 : ADD entrypoint.sh /bin/
 ---> 49d1270c3aa3
Step 7/9 : EXPOSE 80/tcp
 ---> Running in 3dacf6acf23b
Removing intermediate container 3dacf6acf23b
 ---> edced77af5b5
Step 8/9 : CMD ["/usr/sbin/httpd","-DFOREGROUND"]
 ---> Running in 23bb32def296
Removing intermediate container 23bb32def296
 ---> 169a5e164ba5
Step 9/9 : ENTRYPOINT ["/bin/entrypoint.sh"]
 ---> Running in f3bf0c267c7b
Removing intermediate container f3bf0c267c7b
 ---> 0801db092665
Successfully built 0801db092665
Successfully tagged httpd:v1
[root@node1 test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               v1                  0801db092665        35 seconds ago      307MB
myimg               v1.7                bac03b20761a        12 minutes ago      307MB
myimg               v1.6                5370df4238eb        2 hours ago         1.22MB
myimg               v1.5                5825c2ec655f        2 hours ago         1.22MB
myimg               v1.4                58e3b4c40ae7        2 hours ago         1.22MB
myimg               v1.3                2e296b4f4500        3 hours ago         1.22MB
myimg               v1.2                30a5f5594104        3 hours ago         203MB
myimg               v1.1                ae463ec8cbd9        3 hours ago         203MB
myimg               v1                  7f109a34a4a5        3 hours ago         203MB
busybox             latest              1c35c4412082        19 hours ago        1.22MB
centos              7                   b5b4d78bc90c        4 weeks ago         203MB
[root@node1 test]# docker run --name h1 -d httpd:v1
cee14b04912822c33e7deeee361e1ce0c20d7daf6c0666bff319bf3f1bc69bdc
[root@node1 test]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cee14b049128        httpd:v1            "/bin/entrypoint.sh …"   9 seconds ago       Up 9 seconds        80/tcp              h1
[root@node1 test]# 

  提示:可以看到我們build成鏡像后,直接運行為容器,容器正常;我們進入容器內部看看它到底運行的說明命令

[root@node1 test]# docker exec -it h1 /bin/bash
[root@cee14b049128 /]# ls /etc/httpd/conf.d/myweb.conf 
/etc/httpd/conf.d/myweb.conf
[root@cee14b049128 /]# cat /etc/httpd/conf.d/myweb.conf
        <virtualhost *:80>
                servername "localhost"
                documentroot "/var/www/html"
                <directory "/var/www/html">
                        options none
                        allowoverride none
                        require  all granted
                </directory>
        </virtualhost>
[root@cee14b049128 /]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 224080  5016 ?        Ss   16:26   0:00 /usr/sbin/httpd -D
apache        7  0.0  0.0 224212  2960 ?        S    16:26   0:00 /usr/sbin/httpd -D
apache        8  0.0  0.0 224212  2960 ?        S    16:26   0:00 /usr/sbin/httpd -D
apache        9  0.0  0.0 224212  2960 ?        S    16:26   0:00 /usr/sbin/httpd -D
apache       10  0.0  0.0 224212  2960 ?        S    16:26   0:00 /usr/sbin/httpd -D
apache       11  0.0  0.0 224212  2960 ?        S    16:26   0:00 /usr/sbin/httpd -D
root         12  0.0  0.0  11828  1932 pts/0    Ss   16:35   0:00 /bin/bash
root         27  0.0  0.0  51756  1720 pts/0    R+   16:36   0:00 ps aux
[root@cee14b049128 /]# httpd -t -D DUMP_VHOSTS
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
*:80                   localhost (/etc/httpd/conf.d/myweb.conf:1)
[root@cee14b049128 /]# 

  提示:可以看到容器內部運行的就是/usr/sbin/httpd -DFOREGROUND這個命令;其實這個命令不是CMD直接運行的命令,而是通過腳本獲取參數而來的;我們通過腳本添加的配置文件都在對應的位置,並且也都生效了;總結一點,通常CMD和ENTRYPOINT應用在通過entrypoint腳本做中間層向容器內運行的程序提供配置文件的場景,通常這些應用程序不是雲原生的;

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

系統梳理一下鎖_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

背景

有人對Java主流鎖做了下面全面的梳理。梳理的確實挺好的。但是我看到這張圖,第一個感覺是:記不住。

  

因為分了太多類,彼此之間沒有什麼聯繫。做PPT可以。如果聊天或者面試,不用紙筆的情況下,就不太好描述了。也不利於對原理和應用的理解。

基於上述的考慮,我就自己系統的梳理一下鎖,希望可以有助於大家理解和記憶,以至於最後在工作中得到很好的應用。

先說線程鎖再說分佈式鎖。

 

線程鎖

概述 

這裏說的線程鎖是Java線程鎖,從原理上各個語言應該都比較相似。有很多維度的劃分方式,我比較建議的是從大面上分為樂觀鎖和悲觀鎖。

樂觀鎖主要是自旋+CAS的方式,比如JUC(java.util.concurrent包)的原子類。 

悲觀鎖主要用synchronized關鍵字的隱式鎖和基於AQS的显示鎖。

上面三段總結如下:

 

悲觀鎖的實現原理

1>synchronized關鍵字

隨着java版本升級,synchronized關鍵字雖然是用C++寫的,但是原理和JCU包的ReentrantLock很相似。synchronized關鍵字有4種鎖狀態:無鎖、偏向鎖、輕量級鎖、重量級鎖。無鎖類似於ReentrantLock的交替執行,沒有併發,就不涉及鎖;偏向鎖類似於ReentrantLock的可重入的概念,使得已經獲取到鎖的線程可以多次獲取鎖;輕量級鎖解決的問題是盡量避免線程切換,使用的方法也和ReentrantLock相似,是自旋+CAS的方式;重量級鎖依賴於管程monitor來實現,和ReentrantLock一樣都涉及用戶態和內核態切換。

根據這個我們再來補充一下Java線程鎖的思維導圖:

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

 

2>基於基於AQS的显示鎖

基於AQS的显示鎖我之前看過一些源碼。這裏面比較經典的是ReentrantLock。這是可重入鎖,就是同一個線程可以反覆進入加鎖的線程。如果想實現不可重入鎖也很簡單。把可重入鎖對當前線程做特殊處理的部分去掉就好了。

其他JCU下locks包里的鎖比如讀寫鎖就是將鎖細化成了讀鎖和寫鎖。讀鎖是共享鎖的實現,寫鎖是排他鎖的實現。

ReentrantLock可以使用公平鎖和非公平鎖兩種方式,公平鎖和非公平鎖各自繼承了AQS。區別只是非公平鎖在需要加鎖時先直接嘗試是否可以獲取鎖成功,而公平鎖是先看自己是否需要排隊。

下面以ReentrantLock的公平鎖為例來簡單聊一下AQS的源碼。AQS核心是實現了CLH隊列。

AQS有head、tail、持有鎖的線程、狀態4個主要的成員變量。

利用head!=tail就是說AQS是否未被初始化來判斷是否交替執行,交替執行則不用加鎖;如果需要加鎖則判斷是否就是當前擁有鎖的線程,是的話,將進入次數+1;如果不是則判斷是否需要初始化AQS,需要的話先初始化一個dummy header,再將自己加入隊尾,如果是隊列里dummy header的指針指向的節點,則它為先自旋判斷是否可以獲取鎖;如果不是dummy header指針指向的節點,則使用park讓出cpu。當dummy header的指針指向的節點獲取到鎖之後,會將head指向自己,同時將自己這個Node節點的當前線程設置為空,將自己設置為dummy header,同時將原來dummy header的指針都設置為null,使得原dummy header成為一個沒有引用的節點,便於垃圾回收。

根據這個我們再來補充一下Java線程鎖的思維導圖:

 

 

 

 

分佈式鎖

不管是線程鎖還是分佈式鎖,都實現了tryLock、lock、unlock三個方法。

tryLock的語義是非阻塞鎖,嘗試獲取鎖,成功返回true,不成功返回false;主流lock語義是阻塞鎖。實現一般基於tryLock來做自旋,不成功的時候也會有像ReentrantLock一樣的阻塞操作。

常見的分佈式鎖實現以及數據庫鎖的實現詳見之前寫的文章:《MySQL常見6個考題在實際工作中的運用》這裏就不再贅述了。

 

總結

本篇文章在介紹知識點是次要的,主要是展示了總結思考的思路,希望能對讀者朋友們的思考問題方法上有所幫助,僅做參考。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

我終於搞清了啥是 HTTPS 了_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

引言

最近上海連續下了一周雨,溫度一夜之間回到解放前,穿夏裝的我被凍得瑟瑟發抖,躲在家裡哪也不想去。

在家百無聊賴的刷着網頁,看到公眾號後台的留言,有同學問我 HTTP 和 HTTPS 有啥區別?

這還用問,當然是 HTTPS 要比 HTTP 更加的安全啊,沒看到後面帶着個 S 呢么,帶着 S 就這麼 NB 。

然後同學的下一個問題把我問懵逼了,為啥帶 S 的更安全呢?能詳細的講講么。

我跟你講嗷,不是我吹,我這麼多年。。。。。。

就沒見過你這麼刨根究底的同學,老問這種我也不是很清楚的問題。

雖然這個問題問的我老臉一紅,但是我有一種不要臉的精神 「我不會,但是我可以學」 。

HTTP

首先先來了解下 HTTP :

HTTP 協議全稱為:Hyper Text Transfer Protocol ,翻譯過來就是超文本傳輸協議,請不要質疑這個翻譯,我專門用百度翻譯翻了一下。

TCP/IP 四層模型應該都知道的,有數據鏈路層,網絡層,傳輸層和應用層:

而 HTTP 協議就是位於 TCP/IP 四層模型的應用層上。

這裏很多人都會混淆 TCP 和 HTTP ,實際上 HTTP 是基於 TCP 連接基礎上的。

簡單的說, TCP 就是單純建立連接,不涉及任何我們需要請求的實際數據,簡單的傳輸。而 HTTP 是用來收發數據,即實際應用上來的。

HTTP 協議通過請求和響應在客戶端和服務端之間收發數據,進行通信:

HTTPS

HTTP 協議看起來好像沒啥問題,唯一的問題就是不夠安全,因為 HTTP 協議的傳輸方式完全是由明文傳輸的,不做任何加密,這就讓一些不懷好意的人有了可乘之機。

這種傳輸方式誘發了一種經典的攻擊方式:中間人攻擊。

對於這種情況,最簡單的我們可以使用加密方案,比如使用 AES 加密,服務端和客戶端先約定一個隨機生成的密鑰 key ,後續的通信中,所有的信息都使用這個密鑰進行 AES 加密:

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

這樣雖然後面的通信過程安全了,但是我們在第一發送 AES 密鑰的時候還是存在被中間人攔截的風險,一旦中間人攔截到我們的密鑰,可用對密鑰進行更換或者直接解密請求內容:

這時我們可以使用不對稱加密,來專門對密鑰的傳輸做一次額外的保護。

不對稱加密會有兩個密鑰,一個是公鑰,一個是私鑰。明文可以使用公鑰加密私鑰解密,也可以使用私鑰加密公鑰解密。

現在比較通用的非對稱加密算法有 RSA 。

看到這裏的同學一定在奇怪,既然都使用了不對稱加密,為啥只對 AES 的密鑰做不對稱加密,好像有多此一舉,完全可以對後續所有的通信信息全都使用不對稱加密。

因為不對稱加密相比較對稱加密性能上存在明顯的劣勢,可能你覺得在一個請求中多消耗幾 ms 或者幾 ns 無所謂,但是請求到達服務端是要進行解密,每個請求都多消耗幾 ms 累計起來還是非常可觀的。

上面這個方案看起來已經很安全了,中間人即使攔截到我們的公鑰,由於不知道我們的私鑰貌似也沒辦法解密。

實際上中間人完全不需要解密我們的信息,他可以生成一對新的公私鑰發送給客戶端進行攻擊,後續客戶端的通信中間人使用自己創造的私鑰進行解密,然後通過服務端生成的公鑰進行加密返回給服務端:

CA 證書

上面的問題我們僅通過客戶端和服務端已經沒辦法了,這時候需要引入新的第三方機構,一個頒發 CA 證書的機構。

常見的第三方 CA 機構有:Symantec(賽門鐵克),Comodo(科莫多),GeoTrust(環度網信),GoDaddy,Thawte,daoRapidSSL 等等。

在中間人攻擊中,我們遇到的問題不是加密算法不夠神奇,不是密鑰方式不夠嚴謹,而是我們沒有辦法向我們的客戶端表明我們給他的公鑰是我們的,是不是很像我沒辦法證明我是我的問題。

所以第三方機構應運而生,第三方機構只做一件事情,將服務端的公鑰刻上了我們的名字(CA 證書),客戶端接收到公鑰之後,只需要來第三方機構這裏查詢,就能知道這個公鑰是不是真的服務器,然後再將自己生成的 AES 密鑰使用 CA 證書中解密得到的公鑰進行加密后發送給服務端。

最後服務端使用私鑰解密得到 AES 密鑰,就可以愉快的和客戶端進行通信了。

最後的最後,CA 機構驗證不是每次都要去 CA 機構查詢。這樣做太傻了而且太耗時,尤其是很多 CA 機構的服務都在海外,這樣一來一去消耗的時間太多了。

CA 機構高明的地方就在於,我們去找它註冊公鑰,它會使用另一個來註冊的公司的私鑰對我們的公鑰加密,得到一個我們的公鑰的指紋(全球唯一),然後將這家公司的公鑰信息(其實也是證書)和我們的公鑰以及我們公鑰的指紋打包成一個證書。

當我們使用 HTTPS 將證書下發給客戶端校驗時,客戶端(比如瀏覽器)從證書中看到了上級證書的信息,恰巧這個證書就在瀏覽器(或者本機)中,已經被驗證過是合法的,瀏覽器只要使用這個證書中的公鑰將我們的公鑰指紋進行解密,然後比對我們的公鑰信息就知道我們也是的合法的。因為假證書中的公鑰簽名不可能被合法的上級證書中公鑰解密 。

這段稍微有點繞,慢慢看多看幾次就理解了。

參考

https://www.jianshu.com/p/691b8ba3a70f

https://blog.csdn.net/u010144805/article/details/80803059

https://blog.csdn.net/caofengtao1314/article/details/87912078

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

SpringBoot整合Flyway(數據庫版本遷移工具)_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

簡介

在團隊開發當中,有可能每個人都是使用自己本地的數據庫。當數據庫的表或者字段更新時,往往需要告知團隊的其他同事進行更新。
Flyway數據庫版本遷移工具,目的就是解決該問題而誕生的(我自己想的)。每當我們更新數據庫的時候,只需要添加SQL文件到指定目錄中。Flyway會在數據庫創建一個表,專門記錄已更新的SQL文件。當我們下次執行時則不會執行已記錄並且執行成功的SQL文件。

整合

maven

現在的Flyway的最新版本已經到了6.4.2。我用的是6.3.3

<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.3.3</version>
</dependency>

application配置

搞定了Flyway的依賴后,修改一下SpringBoot的application.ymlapplication.xml配置。

spring:
  flyway:
    url: jdbc:mysql://192.168.138.132:3306/hotel-server?useUnicode=true&characterEncoding=UTF-8 
    user: johnson 
    password: 123456 
    table: flyway_schema_history
    enabled: true
    locations: classpath:db/migration
    clean-disabled: false

flyway配置詳解

url:連接數據庫的Url 默認為spring.datasource.url
user:連接數據庫的賬號 默認為spring.datasource.username
password:連接數據庫的密碼 默認為spring.datasource.password
table:自定義數據庫版本管理表 默認為 flyway_schema_history
enabled:是否開啟 默認為開啟
locations:SQL文件存放路徑 默認 classpath:db/migration

SQL文件

上面的locations參數配置的SQL文件存放路徑為 classpath:db/migrationclasspath對應的目錄就是resources目錄,創建后的目錄如下圖:

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

SQL文件如上圖,SQL文件名必須為V1.0.x__xxx.sql注意:這裏的下劃線為兩個_,我也是掉坑了才知道),這樣可以對應SQL更新的版本號。啟動了SpringBoot項目后,就會自動幫你執行SQL文件,可以看到數據庫版本控製表中生成的數據:

clean操作

Flyway的clean操作:徹底清除已配置的架構,它將有效地為您提供一個全新的起點。所有對象(表,視圖,過程等)都將被刪除。

spring:
  flyway:
    clean-on-validation-error: true
    clean-disabled: false

clean-on-validation-error:發生驗證的錯誤時是否執行clean操作(如SQL執行失敗),默認false,生產中必須使用false。
clean-disabled:是否禁用clean操作,默認false,生產中必須使用true

如果我們設置 clean-on-validation-error = trueclean-disabled = false
當我們的SQL文件執行失敗,在數據庫版本控製表flyway_schema_history會添加一條失敗的記錄,success字段為0,此時並不會執行clean操作。
當把SQL文件修改正確並執行完后,此時flyway_schema_history會把失敗記錄的success字段由0改為1。並且會執行clean操作!!!!!整個數據庫的表裡面的數據都被清空了!(除非你在SQL文件中添加了insert操作)
其實在開發環境我也是不建議使用clean,畢竟填數據也是要時間的。。。

總結

團隊開發當中的必備工具啊!不過生產環境當中記得把clean-disabled改為true

個人博客網址: https://colablog.cn/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家