Docker總結(配合阿里雲容器映象服務)
Docker是個很好的工具,剛開始用覺得還沒虛擬環境好用,隨著深入瞭解,越發覺得Docker好用,今天就來總結一下使用心得。
一、Docker基礎
1、背景知識
1)docker是什麼?
Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。
Docker 將應用程式與該程式的依賴,打包在一個檔案裡面。執行這個檔案,就會生成一個虛擬容器。程式在這個虛擬容器裡執行,就好像在真實的物理機上執行一樣。有了 Docker,就不用擔心環境問題。總體來說,Docker 的介面相當簡單,使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。
註冊伺服器(repository),倉庫(registry),映象(image),容器(container)之間的關係:註冊伺服器主要是用來存放倉庫的伺服器,在一個伺服器上有多個倉庫,而倉庫又可以分為公共倉庫和私有倉庫,一個倉庫裡面有可以有多個映象,而容器則是映象的一個例項
下圖是docker元件:
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就完成安裝了。
/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、容器
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 (推薦)
指定對映最常用的是第一種,直接指定宿主埠:容器埠;
第二種,假如宿主有多個ip的話,讓容器的埠繫結到宿主的固定一個ip的埠上;
第三種,只繫結宿主ip,埠隨機取;
第四種,它的意思是一條docker run命令可以同時用多次”-p”引數,指定多個埠對映關係,比如,docker run –d –p 99:80 –p 33:443 –name mynginx33 nginx
啟動容器時用-P(大寫)引數,表示讓容器隨機對應一個宿主機的埠,如上,容器的80埠對應宿主的32768埠,容器的443對應宿主的32769埠。
比如我的宿主ip是192.168.0.55,這時候在宿主機的瀏覽器輸入192.168.0.55:32768就可以訪問到docker容器裡的nginx應用了。
埠隨機對映的好處是:埠不會衝突。難點是,生產中還得用指令碼或者其他方式獲取到這個隨機的埠,由於它是變化的,所以指令碼必須得適應這種變化性。
用小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自動構建映象,其實就是把手動構建的命令逐行寫入一個“指令碼”裡,只不過這個指令碼有自己的語法,如下圖
1)現在在本地建立一個Dockerfile檔案,如圖,touch Dickerfile
2)使用Dockerfile生成映象,注意:
① 如果是手動建立的話,不要建立txt檔案,不然本地使用Dockerfile生成docker映象的是,會報找不到的錯誤,
② 建立命令:docker build -t "repository/images_name:tag" .
新建映象最好在Dockerfile當前路徑下面建立,末尾可以用點表示,如果不是在當前路徑,需要使用絕對路徑
3)推送到阿里雲docker管理平臺,如下圖
4、利用阿里雲映象平臺的程式碼源Dockerfile構建docker映象
可以將Dockerfile檔案放在專案裡面,然後利用阿里雲映象平臺自動生成映象功能,生成映象,生成之後可以直接在本地拉取遠端映象。
1)可以在阿里雲code,github,等程式碼管理平臺,建立專案,然後將自己的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