1. 程式人生 > >Docker總結(配合阿里雲容器映象服務)

Docker總結(配合阿里雲容器映象服務)

Docker是個很好的工具,剛開始用覺得還沒虛擬環境好用,隨著深入瞭解,越發覺得Docker好用,今天就來總結一下使用心得。

一、Docker基礎

1、背景知識

1)docker是什麼?

Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。

Docker 將應用程式與該程式的依賴,打包在一個檔案裡面。執行這個檔案,就會生成一個虛擬容器。程式在這個虛擬容器裡執行,就好像在真實的物理機上執行一樣。有了 Docker,就不用擔心環境問題。總體來說,Docker 的介面相當簡單,使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。

註冊伺服器(repository),倉庫(registry),映象(image),容器(container)之間的關係:註冊伺服器主要是用來存放倉庫的伺服器,在一個伺服器上有多個倉庫,而倉庫又可以分為公共倉庫和私有倉庫,一個倉庫裡面有可以有多個映象,而容器則是映象的一個例項

    下圖是docker元件:

wKiom1fkFJOgOSgNAAD3ZVxFxAk716.png

      Docker之所以火的很快,原因之一就是它的倉庫。倉庫類似於github,很多現成的映象供各位下載,直接用docker pull redis-server(這個名字是瞎起的)就可以拉下來一個redis伺服器的映象,放到自己的docker裡就能用了,不用自己解決依賴、安裝redis。好多開源工具都有docker映象,這就使得使用者只需要下載使用就行,完全省去了處理軟體依賴、缺少庫檔案、安裝部署等環節。

2) docker用途,目前有三大類

(1)提供一次性的環境。比如,本地測試他人的軟體、持續整合的時候提供單元測試和構建的環境。

(2)提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。

(3)組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。

2、docker安裝:

3)  Centos安裝

    在centos下,如果有epel源直接yum install docker-io就完成安裝了。

    wKioL1fkFLayj1M9AAAm5fcHiXw718.png

    /etc/init.d/docker start啟動docker。

4)Ubuntu安裝

    sudo apt-get remove debian-keyringdebian-archive-keyring

    sudo apt-get clean

    sudo apt-get update && sudo apt-get-y install debian-keyring debian-archive-keyring

    wget -qO- https://get.Docker.com/ | sh

    注:如果ubuntu啟用了ufw,要配置使其能轉發請求,並允許2375埠訪問外網。

3、docker命令

在知道docker命令之前,有必要弄清楚映象和容器的差別,簡單來說,映象是靜止的,容器是動態的,映象執行起來就是容器,下邊是我認為比較好的一篇部落格---docker容器和映象區別

以下命令最好使用管理員許可權執行,避免出錯。

1、映象

1)獲取映象:docker pull  images-name

2)檢視所有映象:docker images 

3)刪除映象:docker rmi image-id

4)儲存映象:docker commit -m="description about images" --author="author" {container_id}  {repository/images_name:tag}

5)推送映象到程式碼倉庫(可以後面的閱讀完在看這個),以阿里雲docker平臺為例:

①  docker login --username=your_username registry.cn-beijing.aliyuncs.com
②  docker tag [ImageId] registry.cn-beijing.aliyuncs.com/[名稱空間]/[倉庫名稱]:[映象版本號]
③  docker push registry.cn-beijing.aliyuncs.com/[名稱空間]/[倉庫名稱]:[映象版本號]

6)使用Dockerfile建立新的映象(注意:末尾有一個點,表示當前路徑):docker build -t "repository/images_name:tag" .    

2、容器

wKioL1fkFRPyV9cRAAGgdghVzUg932.png

docker start 容器id
docker stop 容器id
docker exec -it 容器id /bin/bash  # 進入容器
docker cp 宿主機絕對路徑  容器id:路徑   # 宿主機和docker容器之間複製檔案 

# 關於刪除容器:

方法一:

#顯示所有的容器,過濾出Exited狀態的容器,取出這些容器的ID,

sudo docker ps -a|grep Exited|awk '{print $1}'

#查詢所有的容器,過濾出Exited狀態的容器,列出容器ID,刪除這些容器

sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`

方法二: 

#刪除所有未執行的容器(已經執行的刪除不了,未執行的就一起被刪除了)

sudo docker rm $(sudo docker ps -a -q)

方法三:

#根據容器的狀態,刪除Exited狀態的容器

sudo docker rm $(sudo docker ps -qf status=exited)

方法四:

#Docker 1.13版本以後,可以使用 docker containers prune 命令,刪除孤立的容器。

sudo docker container prune  (推薦)

wKioL1fkFTGDEMeJAAGYWDVx2bM180.png

指定對映最常用的是第一種,直接指定宿主埠:容器埠;

第二種,假如宿主有多個ip的話,讓容器的埠繫結到宿主的固定一個ip的埠上;

第三種,只繫結宿主ip,埠隨機取;

第四種,它的意思是一條docker run命令可以同時用多次”-p”引數,指定多個埠對映關係,比如,docker run –d –p 99:80 –p 33:443 –name mynginx33 nginx

wKiom1fkFeTjUbJnAAAqMyKJ1JI651.png

啟動容器時用-P(大寫)引數,表示讓容器隨機對應一個宿主機的埠,如上,容器的80埠對應宿主的32768埠,容器的443對應宿主的32769埠。

比如我的宿主ip是192.168.0.55,這時候在宿主機的瀏覽器輸入192.168.0.55:32768就可以訪問到docker容器裡的nginx應用了。

埠隨機對映的好處是:埠不會衝突。難點是,生產中還得用指令碼或者其他方式獲取到這個隨機的埠,由於它是變化的,所以指令碼必須得適應這種變化性。

wKioL1fkFfiCF4ElAAAxf7B-tVM477.png

用小p來手動指定埠對映,如上所示,將容器的80埠對映到宿主的91埠上,而443沒有指定對映關係,所以443不可訪問。

二、製作自己的Docker映象

自己製作的docker我都推送到了阿里雲docker管理平臺了,而不是推送到docker官方的管理平臺。下面首先介紹一下使用阿里雲docker管理平臺建立自己的倉庫。

1、阿里雲docker管理平臺建立倉庫

2)新建倉庫彈窗,一步一步按提示填,注意,設定程式碼源可以使用github,阿里雲code等等,這裡我使用的是阿里雲code,後面可以使用專案裡面的Dockerfile自動生成映象,具體步驟下面會詳細介紹

3)新建完之後,會有映象倉庫列表,顯示映象倉庫資訊

4)點選管理,基本資訊,會有各個命令提示:

登入阿里雲docker registry:

  $ sudo docker login --username=  registry.cn-beijing.aliyuncs.com

登入registry的使用者名稱是您的阿里雲賬號全名,密碼是您開通服務時設定的密碼。

你可以在映象管理首頁點選右上角按鈕修改docker login密碼。

從registry中拉取映象:

  $ sudo docker pull registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[映象版本號]

將映象推送到registry:

  $ sudo docker login --username= registry.cn-beijing.aliyuncs.com
  $ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[映象版本號]
  $ sudo docker push registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[映象版本號]

其中[ImageId],[映象版本號]請你根據自己的映象資訊進行填寫。

2、手動構建Docker映象

這種方法就是根據docker映象為基礎映象來建立容器,然後執行容器,在容器中安裝自己需要的包,然後再提交(commit)一下,推送(push)到自己的映象倉庫就ok了。

下面以一個Ubuntu:16.04為例,更改為自己的python3.6+django2.0映象,由於三個版本(v1,v2,v3)都是使用的原始的Ubuntu:16.04,所以三種生成進行映象方法介紹完之後再以一個版本為例介紹docker環境配置。

1)拉取Ubuntu:16.04官方映象:

2)進入映象,變為容器,隨便安裝一些包

3)退出容器,exit,提交映象(命令可以看本部落格命令部分的映象命令)

如圖,上圖提交命令解釋:

① -m是對提交的描述,author是作者(選填),後面的c28e5976a6ab是修改容器的id,後面的是新映象名字和標籤(tag)。

② 成功之後,會生成新的映象id

③ 輸入docker images 檢視映象,會發現新的名為spencer/django,標籤為v1的映象已經存在。

4)推送到阿里雲docker管理平臺,命令參考上面將映象推送到阿里雲registry

5)開啟阿里雲映象服務控制檯,進入映象倉庫列表-->管理-->映象版本,如下圖,版本,映象id,和本地推送上來的版本,映象id一樣

6)刪除本地images,拉取阿里雲docker映象管理臺映象,如下圖

3、利用Dockerfile構建Docker映象

  由Dockerfile自動構建映象,其實就是把手動構建的命令逐行寫入一個“指令碼”裡,只不過這個指令碼有自己的語法,如下圖

wKioL1fkFjbCb5-DAAMG1r9ceFY874.png

1)現在在本地建立一個Dockerfile檔案,如圖,touch Dickerfile

2)使用Dockerfile生成映象,注意:

     ① 如果是手動建立的話,不要建立txt檔案,不然本地使用Dockerfile生成docker映象的是,會報找不到的錯誤,

     ② 建立命令:docker build -t "repository/images_name:tag" .   

         新建映象最好在Dockerfile當前路徑下面建立,末尾可以用點表示,如果不是在當前路徑,需要使用絕對路徑

3)推送到阿里雲docker管理平臺,如下圖

4、利用阿里雲映象平臺的程式碼源Dockerfile構建docker映象

   可以將Dockerfile檔案放在專案裡面,然後利用阿里雲映象平臺自動生成映象功能,生成映象,生成之後可以直接在本地拉取遠端映象。

  1)可以在阿里雲codegithub,等程式碼管理平臺,建立專案,然後將自己的Dockerfile放大專案,推送到遠端程式碼管理平臺,然後繫結到阿里雲映象倉庫,在建立映象倉庫的時候,設定程式碼源的選項,設定到Dockerfile檔案路徑下面就行,具體專案程式碼不再展示,如下圖

2)進入映象列表-->管理-->構建-->立即構建,注意:構建設定裡面要設定對的Dockefile路徑,不然會構建失敗。

3)構建成功,檢視映象,拉取映象到本地

點選映象版本,如圖,構建成功

本地拉取映象,如圖

注意:建議大家使用dockerfile建立映象,因為啟動映象,在容器內安裝包再commit ,每一次ocmmit都相當於多了一層,這樣會導致映象佔用空間比較大而且臃腫,推薦使用dockerfile建立映象,把多個安裝包的步驟放在一個RUN裡面,使用&&連線,這樣安裝多個包相當於在一層中,詳細可參考《從入門到實踐2》一書,講解的很到位,下面是百度雲盤的連結,有需要的朋友可以拿走。

5、docker環境配置python3.6+django2.0

     其實docker映象包都是可以通過Dockerfile一次性部署的,我在研究的時候分開了弄,走一遍流程,這樣寫到dockerfile中保證不會出錯。接下來就是我研究過程,博友們不必看,就是簡單的安裝一些依賴包的過程

    因為我構建的映象是以ubuntu為基礎,ubuntu原始安裝命令是apt-get install 

1)更新apt-get install 

     命令:apt-get update

2)安裝Python3.6

說明一下:目前通過 apt-get install python3直接安裝的是Python3.5版本,因為python3.6(apt-get install python3.6是無效的)是最新版本,所以只能先安裝Python3.5然後升級到3.6。倘若Python3.6全部完善之後出來Python3.7,3.8,3.9等等,這樣就可以直接通過apt-get install python3安裝3.6了。

①安裝Python3 ,安裝成功之後,輸入python3,會顯示Python3.5的互動環境

命令:

apt-get install python3

②安裝Python3.6的需求包

命令:

apt-get install software-properties-common

③新增Python3.6

命令:

add-apt-repository ppa:jonathonf/python-3.6

④更新apt-get 

命令:

apt-get update

安裝Python3.6,

命令:

apt-get install python3.6

⑥安裝成功之後輸入Python3依舊是Python3.5的互動環境,這樣很不方便,接下來就是實現輸入Python直接進入到Python3.6的互動環境,如下圖:

第一步:which python3 ---檢視Python3.5安裝在何處

第二步:更改軟連結,輸入Python預設啟動Python3.5,命令:ln -s /usr/bin/python3.6 /usr/bin/python

第三步:更改預設啟動為Python3.6,注意第三條命令最後的一個2,這個是排序,只要python3.6的排序比3.5的高就行,命令:

           update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2

3)安裝pip

①安裝pip3

命令:

apt-get install python3-pip

②更新pip3為pip,並升級

命令:

pip3 install --upgrade pip

4)升級python-dev

起初並不知道這個還需要升級,因為他原本的dev是Python3-dev,但是安裝一些包的時候老是報如下錯誤:

Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='........

找了n久,才發現是這個原因,之前安裝原本的dev是Python3-dev,要升級到Python3.6-dev,如下圖

命令:

apt-get install python3.6-dev

5)批量安裝依賴包

     把需要安裝的依賴放到一個名為requerments的檔案中,然後使用命令 pip install -r requerments,批量安裝依賴包

命令:

pip install -r requerments