Docker入門(1)——安裝,使用,和鏡像基礎

在這裏插入圖片描述
關於什麼是docker,爲什麼要使用docker,這個文章裏面就不提了。這裏主要是以實際操作爲例,在一臺服務器上操練如何安裝使用docker的過程。

Docker的基礎

Docker環境需要安裝在一臺Linux服務器上,我們這裏用一臺CentOS爲例,實際上其他發行版也沒有問題。
Docker的運行環境一般在線安裝比較方便,所以這臺服務器最好能聯網。
Docker運行環境安裝完畢之後,我們就可以在這個環境裏面拉取鏡像,運行容器了。

Docker安裝和基本操作

安裝環境

一般用各種docker相關的廠商提供的腳本安裝就可以了
rancher提供的腳本
curl https://releases.rancher.com/install-docker/1.12.sh | sh
或者
curl -sSL https://github.com/gitlawr/install-docker/blob/1.0/1.12.6.sh?raw=true | sh
Rancher提供的腳本里面可以指定安裝的Docker環境版本,如果要安裝最新的版本,也可以用下面的DaoCloud提供的腳本
curl -sSL https://get.daocloud.io/docker | sh

修改鏡像庫的mirror

安裝完Docker環境之後,運行docker version,如果成功安裝,應該就可以看到docker的版本號。
然後如果不經過特殊的配置,docker相關的命令拉取鏡像的目的地是docker.com的官方鏡像庫。因爲各種網絡原因,從Docker官方鏡像庫拉取鏡像會很慢。好在同樣很多docker相關的廠商提供了鏡像庫的mirror。
下面是我用的mirror,以及修改mirror的腳本
配置mirror:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://13111af8.m.daocloud.io

運行第一個容器

我們可以去docker的官方鏡像庫瀏覽頁面裏面去查找鏡像,學習使用方法。
https://hub.docker.com/explore/

這裏我們先實現一個小目標,希望用一條語句跑一個mongodb起來。
docker run --name=“ykbmongodb” -p 27017:27017 -v /data/mongo/db:/data/db -v /data/mongo/dbconfig:/data/configdb -d mongo:3.2

我們來分別解析這條語句。

  • 首先docker run就是運行容器,容器是鏡像的運行中的實例。也就是說運行一個容器,docker運行環境會先下載對應的鏡像。所以docker run的意思就是先檢查對應的鏡像是否存在,不存在就開始下載鏡像,下載好了之後,再運行對應的容器。
  • 最後面的mongo:3.2,mongo表示鏡像的名字,這是mongodb的鏡像名。3.2表示標籤(可以理解爲版本號)。如果不寫標籤,默認會拉取標籤爲latest的鏡像。注意,latest也只是一個標籤,不一定保證它真的就是最新的。也就是說,如果你維護一個工具的鏡像,每次發佈一個新的鏡像版本,你需要把latest這個標籤賦給這個最新的版本。
  • name參數表示運行起來的容器的名字,最好是一個有意義的可以理解的名字。如果沒有這個參數,系統會默認給一串數字字符組合作爲名字。
  • p這個參數比較關鍵了,是把容器裏面的端口和宿主機(也就是你當前用的這個服務器)的端口做一個映射。比如說,mongodb是需要佔用27017作爲服務的端口的。容器可以近似的看作是宿主機內部一個類似虛擬機的存在,這就意味着,容器裏面的27017和宿主機是不通的,如果需要實現訪問宿主機的27017端口就訪問到容器的27017,那麼就需要實現這樣的一個端口映射。
  • v這個參數在理解了p參數之後就好理解了,就是爲了能映射文件和文件夾。注意冒號前面是宿主機,後面是容器內部。v參數通常用於把容器裏面的數據或者配置文件暴露到宿主機可以輕易訪問的路徑下面,便於修改,維護,備份。
  • 其他的各種參數,可以參考docker的文檔了。

mongodb的容器運行起來之後,可以用mongodb的客戶端嘗試連接並寫入數據了。

換個姿勢再運行一個容器

先看一下現在系統裏面有哪些鏡像吧,用這個方法
docker images
如果沒有意外,現在應該只有一個之前我們拉下來的mongodb 3.2的鏡像。

我們再嘗試拉取一個nginx的鏡像。
docker pull nginx

再看一下現在有哪些鏡像,是不是多了一個?

現在用docker run 運行nginx的容器,就會發現不用再拉取鏡像,直接運行了,不過我們可以加大一點難度。

我們準備一個叫做index.html的文件,裏面的內容隨便寫,我寫的就一句話:
hello world!
把這個文件放在宿主機/data/testnginx文件夾下面。然後執行下面的語句運行nginx容器:
docker run --name mynginx -d -p 80:80 -v /data/testnginx:/usr/share/nginx/html nginx

解析一下這條語句,和前面運行mongodb的相比,最大的區別就是
-v /data/testnginx:/usr/share/nginx/html
實際上就是把本機的/data/testnginx目錄和容器裏面的/usr/share/nginx/html關聯了起來。
注意我們之前已經在宿主機的這個文件夾下面放置了index.html文件,也就是說當容器運行起來的時候,容器裏面的/usr/share/nginx/html裏面也有了這個index.html文件。
然後我們用瀏覽器訪問一下宿主機的ip,默認80端口,可以看到,實際上我們訪問了容器的80端口,並打開了index.html這個頁面。

文件(夾)映射,端口映射是運行一個鏡像的容器時最重要的參數,需要特別注意鏡像的使用說明裏面關於這部分的內容。

Docker鏡像的基礎

經過上面的操作,我們都理解了,在我們操作的這臺服務器上,安裝了docker運行環境之後,就可以拉取鏡像,運行容器。
拉取下來的鏡像,也是以專門的數據格式保存在docker運行環境裏面的。也就是說,在現在操作的服務器上,找不到一個叫做mongo的鏡像文件,或者nginx的鏡像文件,可以由用戶來複制,編輯。
除去一些特殊的操作,正常情況下,想要在一個docker環境裏面添加一個鏡像,有兩個辦法:

  1. 和我們上面操作的一樣,docker pull
  2. 用docker build命令,編譯自己的鏡像

編譯自己的鏡像

我們先嚐試着編譯一個自己的鏡像,不要擔心,看起來很複雜,其實很簡單。
docker build --rm -f Dockerfile -t testbuildnginx:0.1 .
t參數是指定編譯之後的鏡像名字和標籤
f參數指定了一個叫做dockerfile的文件,這個文件告訴了build命令如何編譯生成一個新的鏡像。
所以可以看到,編譯鏡像的命令沒什麼好解釋的。關鍵點都在如何編寫這個dockerfile上面。

Dockerfile

Dockerfile就是一個文本文件,以我這個文件爲例:
FROM nginx
copy bin/index.html /usr/share/nginx/html
這個dockerfile就包含上面這兩行內容。
FROM nginx表示,當前要編譯的鏡像,以nginx鏡像爲基礎。
copy bin/index.html /usr/share/nginx/html就更好理解了,就是把宿主機上的bin文件夾下面的index.html複製到鏡像裏面的/usr/share/nginx/html文件夾下面。
所以,在絕大多數情況下,編譯一個鏡像,都是在某一個鏡像的基礎上,做一些改動,增加或者刪除某些文件,或者安裝卸載某個應用,修改某個配置文件。
一般來說,鏡像追溯到最後,都是基於某個Linux的發行版本。
對於我們來說,我們一般會基於某個比較穩定的成熟的應用鏡像來做自己的鏡像。比如說基於nginx,tomcat,jetty。當然也可以基於centos的鏡像,再在dockerfile裏面寫上安裝nginx,tomcat,jetty等操作,理論上當然可以,但是沒有必要。

運行自己的鏡像

像運行別的鏡像一樣,一旦編譯完成,這個鏡像就存在在本機的docker環境中了,可以通過docker run的命令運行。
docker run --name mytestbuildnginx -d -p 80:80 --restart=always testbuildnginx:0.1
假設我們當前的產品就是一個簡單的html頁面,那麼完全可以通過Jenkins做一個持續集成的流程,類似這樣:

拉取代碼
發佈編譯後的文件
基於nginx的基礎鏡像生成新的鏡像 例如release0.1
運行新版鏡像
代碼庫
編譯服務器
dockerbuild服務器
鏡像庫服務器
線上生產服務器

當然,這只是思路之一。是否可以在線上生產服務器上一直運行一個nginx的鏡像,通過文件夾映射出來一個文件夾,然後持續集成不停的更新這個文件夾裏面的html?當然可以。但這又涉及到是否可以通過鏡像發佈來做版本管理和控制了。

基礎鏡像

前面說過,編譯鏡像的時候,一定是基於某個基礎鏡像,這個基礎鏡像可以是官方或者私有鏡像庫的某個鏡像,也可以是自己之前編譯出來的某個鏡像。也就是說基於A編譯出B,再基於B編譯C,這樣是沒有問題的。
通常工作中也會維護自己的基礎鏡像,在這個基礎上編譯其他鏡像版本。這個情況類似我們有時候會維護一套代碼模板,新項目基於代碼模板來創建項目。

Docker鏡像進階

通過上面的討論和實踐,我們應該明確瞭如何安裝docker環境,如何運行容器,如何創建一個簡單的鏡像。
在後面文章裏我們會進一步討論下面幾個在前面的文章中尚未明確的問題:

  1. 鏡像在宿主機上的存儲結構
  2. 除了pull和build之外,有別的辦法操作鏡像嗎
  3. 私有鏡像庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章