Docker基礎

Docker

一. 什麼是Docker

​ 在docker的官方之什麼是docker中提到了一句話:“當今各大組織或者團體的創新都源於軟件(例如OA、ERP等),其實很多公司都是軟件公司"。用戶量的激增導致了併發、指數級增加的數據、應用的可靠性等問題,單體應用已經應對不了這些問題,於是誕生了分佈式、集羣、微服務、邊緣計算等各種名詞、架構風格和滿足這種架構風格的各種框架,那我們接下來跟大家談談這些技術名詞。

​ 分佈式:將一個複雜的應用按照模塊進行拆分,每個拆分的模塊做成一個應用,分開部署,分開運行,各個模塊之間通過webservice、http rest、rpc的方式進行調用。但是分佈式系統中面臨着很多棘手的問題:1. 如果某一個應用crash掉了,會導致調用該模塊的其他模塊也無法正常工作;2. 因爲網絡抖動或者硬件的問題導致數據的一致性問題(即分佈式事務問題);3. 運維和硬件成本的急劇上升。

​ 集羣:集羣是指將某一個應用或者某個模塊部署在多臺機器上(這些機器上跑的代碼是相同的),然後通過負載均衡的方式讓每個應用都能處理請求,即使某一個應用宕掉了,其他的應用一樣可以處理請求,集羣是爲了解決我們上面提到的分佈式應用中的第一個問題,但是集羣也面臨着諸多的問題:1. 運維和硬件成本的急劇增加;2. 實現集羣勢必會引入第三方的插件,那麼第三方插件如何去保障其穩定運行;

​ 微服務:微服務只是一種架構風格,最早是由Martin Fowler(博客點擊這裏)提出,他對微服務的解釋是:In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies(簡而言之,微服務是一種架構的風格,將每一個單獨的應用來作爲一個服務套件,每一個服務套件運行在其獨立的進程當中,使用輕量級的方式相互調用,通常採用HTTP的方式。這些個服務是要建立在業務能力和自動化獨立部署的基礎上的。這些服務間應該以一種去中心化的方式運行,而且這些服務可以使用不同的語言、不同的存儲機制來實現)。我用自己的話來表達一下,所謂的微服務就是將一個可以獨立部署、業務能力獨立的應用,應用之間耦合度儘量降低(只能儘量降低,不可能實現絕對的解耦),儘可能的去中心化。微服務也同樣的面臨着諸多的問題:1. 分佈式事務問題;2. 運維和硬件成本急劇上升。

​ 邊緣計算:首先跟大家說一下,爲什麼要在這裏提到邊緣計算呢?因爲本文講的是docker, docker中提到了邊緣計算。所謂的邊緣計算是指在接近數據源的地方進行數據的處理,而不是將數據集中到一起進行處理,邊緣計算可以實現數據的實時分析,將有價值的數據過濾後丟給雲端。下面給一張圖方便大家的理解:

在這裏插入圖片描述

​ 我們在回到本節標題“什麼是docker”,我們在介紹完上面這些名詞後,會發現無論當今所流行的不論是分佈式、集羣還是微服務都面臨着一個問題:運維和硬件成本的急劇上升。那麼docker的出現就是爲了解決這個問題:解決運維和硬件成本的問題。

提到這裏結合自己的工作經歷跟大家講解一下我以前在某家公司是如何解決這個問題的,我們公司購買一臺服務器,然後在服務器上虛擬出多個計算機,然後在虛擬的機器上部署我們的應用,所謂虛擬機是藉助於一些軟件虛擬出一臺和我們的物理機一樣的機器,也有CPU、內存、硬盤、光驅等。雖然我們可以在一臺真實的物理機上虛擬出多臺機器,但是每個機器上其實都是有一套完整的操作系統,那麼多臺虛擬機上就有多套操作系統,這些操作系統也是要消耗物理機的資源的,那麼如何解決這個問題呢?這同樣回到我們該節的主題“什麼是docker”。

在這裏插入圖片描述

二. Docker的優點

其實這個問題,我們在第一節“什麼是docker”這個章節已經給出了答案。在本節我們會給出系統的總結:

2.1 資源的複用

​ 上節筆者說到我們公司在解決運維和機器成本問題的時候說到,通過傳統的虛擬機的方式每一臺虛擬機都有一套完整的操作系統,那麼我們能不能就使用一個操作系統,每個隔離的進程只運行我們的應用和所依賴的第三方軟件,docker恰恰可以解決這個問題。

2.2 一致的環境

​ 我相信做過開發的朋友都有這樣的經歷,我們在本地開發一個應用,尤其是分佈式應用,我們需要在本地安裝多臺虛擬機,在本地測試各種功能完好。接着修改各種參數后辛辛苦苦部署到測試機上後,測試的同事經過緊張、嚴謹的測試,一切都那麼的prefect。當我們高高興興的修改完各種參數後部署到生產環境,我嘞個擦,各種問題都出現。開發人員經常掛在嘴邊的幾句話“昨天我跑着還是好好的呀”,“測試的時候還是好好的呀”,導致開發人員說這些話的原因是因爲開發、測試、生產環境的不一致所導致的。docker也可以解決這個問題,docker的鏡像提供了除內核以外完整運行環境,確保的環境的一致性。

2.3 啓動速度更快

​ 以往的虛擬機的方式啓動的時候需要的時間會很長,因爲要啓動操作系統,可能需要幾分鐘甚至更長。但是docker啓動只需要幾秒、幾毫秒。

2.4 應用的遷移

​ 給朋友舉個例子,以前你的應用部署在阿里雲上,那麼那天你的領導需要將應用簽署到騰訊雲上,使用docker的話,會變得非常的簡單。

三. Docker的安裝

​ Docker安裝步驟的官網地址:https://docs.docker.com/install/linux/docker-ce/ubuntu/

3.1配置倉庫

apt-get update
apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD883

3.2 開始安裝

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

3.3 驗證docker是否安裝成功

docker -v       #查看docker的版本信息
docker info     #查看docker的基本信息,例如多少鏡像,多少個容器等
docker help    #查看docker命令

四. docker鏡像與容器

​ docker的鏡像於容器是docker中兩個至關重要的概念,首先給各位讀者解釋一下筆者對於這兩個概念的理解。鏡像,我們從字面意思上看,鏡子裏成像,我們人站在鏡子面前,在鏡子中會呈現一個完整的我們(包括我們的着裝、表情、髮型等等)。那麼在軟件領域的鏡像是指對數據按照一定的格式的一個完整的拷貝;容器是鏡像運行時的實體,比如說鏡像是個類,當沒有被加載的時候,它是存放在我們的硬盤上的,而容器是對象,對象只有在程序運行的時候纔會被創建,並且一個類可以創建N多個對象,對應到我們的鏡像與容器,一個鏡像可以用於創建多個容器,每個容器運行在各自的namespace中間。

​ 鏡像就是對一些文件或者文件的一種特定格式拷貝。

​ 在本節我們粗略的說一下鏡像,重點在於講解容器,因爲容器一定要用到鏡像,所有我們又不得不提,會有專門的篇章來介紹鏡像。

4.1 鏡像倉庫的配置

​ 所謂的鏡像倉庫就是鏡像集中存放的位置,docker默認的鏡像倉庫地址是 https://hub.docker.com,由於該地址服務器不在內地,訪問的速度可能會有一定的影響。所以我們會經常將docker默認的鏡像倉庫換成阿里巴巴或者163的鏡像倉庫地址,以便加快我們的訪問速度,本小節我們以阿里巴巴的鏡像倉庫爲例爲大家講解。

​ A. 註冊阿里雲賬戶,地址爲:https://account.aliyun.com/login/login.htm

​ B.進入到阿里雲控制檯,選擇“容器鏡像服務”

​ C.進入到“鏡像加速器”,在右側會出現“加速器地址”以及如何配置加速器地址

​ D. 在 /etc/docker/目錄下是沒有 daemon.json文件的,所有你要進入到 /etc/docker/ 目錄下執行 touch daemon.json 命令創建 daemon.json文件,如下圖所示:

​ E.在新創建的daemon.json文件中加入如下內容

{
  "registry-mirrors": ["https://zbhswmwr.mirror.aliyuncs.com"]
}

​ F.執行如下命令

sudo systemctl daemon-reload                  #重新加載守護進程
sudo systemctl restart docker                 #重啓docker

4.2 docker鏡像的基本命令

​ A.查看docker本地有多少鏡像:docker images 或者 docker image ls

在這裏插入圖片描述

B.拉取鏡像倉庫的某個鏡像:docker pull 鏡像名:tag,例如:docker pull hello-world:linux

在這裏插入圖片描述

​ C.只查看鏡像的ID: docker images -aq

在這裏插入圖片描述

​ D.刪除一個鏡像: docker rmi 鏡像名[:tag] 或者 docker rmi 鏡像ID

在這裏插入圖片描述

五. 容器的基本命令

A. 容器的啓動:docker run 鏡像名:tag

在這裏插入圖片描述

B.查看正在運行的容器:docker container ls 或者 docker ps 或者 docker ps -n 2

在這裏插入圖片描述

注:docker ps -n 2表示查看最近運行或者運行過的兩個容器。

C.查看所有的容器,包括已經停止了的容器:docker container ls -a 或者 docker ps -a

在這裏插入圖片描述

D.以交互的方式啓動容器,例如啓動一個centos容器:docker run -i -t centos

在這裏插入圖片描述

注意:-t的是宿主機分配一個終端,並將該終端綁定到標準的輸入上;-i讓容器的標準輸入保持打開狀態。二者都是聯合在一起使用的。

如果以上述的方式啓動centos容器,那麼如何回到我的宿主機呢?有兩種方式:

1). 執行 exit 命令,該命令會關閉容器,然後退出。

​ 2).按住ctrl + p + q, 容器不關閉,只是退出。

E.以後臺進程的方式啓動容器:docker run -d centos

在這裏插入圖片描述

​ 細心的你一定會發現,我們以守護進程的方式啓動容器後,容器卻已經退出了(status爲Exited)。原因是因爲docker容器啓動後必須要有一個前臺進程,說白了就是一直要有事情幹,那麼怎麼能讓他有事幹了,我們可以開啓一個一直掛起的命令,例如:top tail,否則就會自動退出。那麼有什麼解決方法呢?其實這個問題解決的方法筆者蒐集到三種(都是在網上查找的):

​ 1).以交互的方式啓動容器,然後通過ctrl + p + q 不關閉容器退出容器,這種方式在上面已經給大家提到過:

docker run -it centos 

2).通過一個死循環間歇性的不停的輸出一個字符串 :

docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 2;done"

​ 3).通過我們上面提到過的top命令的方式開啓一個前臺進程,讓容器有事情幹:

docker run -d centos /usr/bin/top -b

F.容器的停止,容器的停止有兩種方式:1.docker stop 容器ID;2.docker kill 容器ID。方式一是一種平滑、優雅的方式關閉容器;方式二是暴力的方式關閉容器。

在這裏插入圖片描述

G.刪除容器:docker rm [-f] 容器ID。-f表示強制刪除,正在運行的容器用該命令。

在這裏插入圖片描述

H.查看容器的日誌:docker logs -t -f 容器ID。-t是顯示日誌的時間,-f是監視日誌的增長。

在這裏插入圖片描述
I.重新進入已經退出的容器:docker attach 容器ID

在這裏插入圖片描述

J.不進入到容器,直接通過命令操作容器:docker exec 容器ID ls -l /

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章