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在宿主機上並不存在,既然不存在那該如何使用和管理呢?