1. 程式人生 > 其它 >Docker (一)

Docker (一)

技術標籤:Docker

熟悉docker 是高階java必備的技術素質。在面試中,經常會有公司問到:你會打dockerfile嗎?。面試中很少問及docker的其他知識點,那是因為docker是運維範圍內的事。如果你的公司擁有強大的運維平臺的話,基本上打dockerfile就不需要你動手,比如:百度、滴滴,他們都有自研的一套部署釋出流水線。但實際中並不是所有公司都有這個實力,所以學習docker並會打dockerfile勢在必行。

下面記錄一下我在學習docker過程中的一些筆記。

1、使用背景簡單介紹

docker是基於linux容器技術的,所以官方推薦的是使用cenos7作為docker的作業系統(還因為cenos7本身已經包含了docker)。

我使用的是mac os,其實和cenos7是一樣的,直接下載,解壓安裝。

2、docker的幾個基本命令

$ sudo service docker start  // 命令列方式啟動docker服務
$ docker -v/--version        // 檢視docker版本/或驗證本地是否已安裝好docker
$ docker pull 映象名稱      // 拉取映象(預設是從你的registry mirrors配置的地址中拉取映象)
$ docker push              // 上傳映象
$ docker ps [-a|-all]  // 檢視docker中[已停止的]/執行中的容器 
$ docker images    // 檢視所有的映象
$ docker run -it ubuntu /bin/bash  // 從映象啟動一個容器,i t分別表示以終端互動式啟動容器
$ docker start 容器id      // 直接根據容器的id啟動容器,結合docker ps -a命令使用
$ docker stop 容器id      // 停止一個容器
$ docker rm -f 容器id     // 刪除一個容器
$ docker container prune  // 清理掉所有已停止的容器
$ docker export 容器id > 匯出的檔名 // 匯出容器
example: $ docker export 123456cx > ubuntu.rar

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ docker search 映象名稱   // (從registry mirror地址中)搜尋映象
$ docker rmi 映象名稱      // 刪除映象

思考一下:docker如何啟動一個web容器後,有無埠號?若有的話是多少?瀏覽器訪問web容器時可以直接使用docker容器的埠嗎?docker容器的埠號該如何使用?

思路:docker web容器啟動後,外界(作業系統的瀏覽器)是不能直接訪問docker容器的埠的,需要將docker容器埠與本地埠做一個對映,然後才能訪問。

3、介紹dockerfile

Dockerfile 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。

指令可以是這樣的:每一行都是一個指令
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]
" RUN /bin/echo 'root:123456' |chpasswd RUN useradd xiaobuisme RUN /bin/echo 'xiaobuisme:123456' |chpasswd RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D

FROM 和 RUN 指令的作用

FROM:定製的映象都是基於 FROM 的映象,這裡的 nginx 就是定製需要的基礎映象。後續的操作都是基於 nginx。

RUN:用於執行後面跟著的命令列命令。有以下倆種格式

shell格式:

RUN <命令列命令>
# <命令列命令> 等同於,在終端操作的 shell 命令。

exec 格式:

RUN ["可執行檔案", "引數1", "引數2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline

注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成映象膨脹過大。

4、打dockerfile

建立映象也就是我們常說的打dockerfile。

有兩種方式:

  • 從已經建立的容器中更新映象,並且提交這個映象
  • 使用Dockerfile指令來建立一個新的映象

第一種方式:從已有的容器中更新後提交

$ docker run -t -i ubuntu /bin/bash // 建立一個ubuntu映象的容器
$ apt-get update ...         // 進入容器後,使用apt-get update進行更新
$ exit 
$ docker commit -m="提交的message" -a="作者名字" 容器id 映象新名稱 // 提交到倉庫(這裡我直接提交到本地的私有倉庫)
example: $docker commit -m="update" -a="xiaobusime" ed1e33der xiaobuisme/ubuntu:v2

第二種方式:使用dockerfile命令建立一個全新的映象

在 Dockerfile 檔案的存放目錄下,執行構建動作。(注意:打dockerfile必須是先建立一個名為Dockerfile的檔案,檔案中寫上相關的指令)

$ vi Dockerfile // 先建立一個dockerfile檔案,檔案內容如下,copy進去:
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

$ docker build -t xiaobuisme/centos:6.7 . // docker build建立一個叫centos TAG為6.7的檔案
引數說明:
-t :指定要建立的目標映象名
. :Dockerfile 檔案所在目錄,可以指定Dockerfile 的絕對路徑,就是上下文路徑

建立成功,如圖所示:

到此為止,dockerfile僅僅是打了一個空殼,那麼如何在這個自己打的docker檔案中配置需要的環境(例如:redis、nginx)呢?看第5節.

5、dockerfile中配置環境,讓它更豐滿

需要安裝docker compose 元件。(因為我的是mac os版的docker桌面版,所以已經包含了該元件,有需要安裝的請參考https://www.runoob.com/docker/docker-compose.html

思考:如何將多個元件安裝在一個dockerfile中?

7、打的dockerfile具體在宿主機的什麼位置?什麼形式?

通過百度查資料發現,dockerfile在宿主機上並不存在,既然不存在那該如何使用和管理呢?

參考https://www.cnblogs.com/robinunix/p/12795456.html,此處不再贅述。