[Docker] 入門教程

一.前言

最近玩了玩Docker, 從剛聽說它到下載使用時間相隔了3年 - -, 因為最近剛剛學習完SpringCloud全家桶, 而網上的教程都比較混雜, 所以我準備寫一篇Docker的教程, 提供給大家學習.

二.開始

1.下載Docker

https://www.docker.com/get-started
這個頁面向下拉 就可以看到下載的按鈕了

安裝需要先注冊賬號 - 極大可能需要搬梯子.

本文使用MacOS作為教程系統(tǒng) , Windows請參考使用, 原理大致相同

2.部署之前的準備
1.啟動docker

docker安裝完成之后 我們要如何啟動docker呢? 很簡單, 我們安裝docker后在LaunchPad中會出現(xiàn)一個Docker的應用, 點擊會自動啟動

看到圖上的顯示Docker Desktop is running說明啟動成功了!!!

如果是centos系統(tǒng), 需要輸入命令安裝

yum install docker

然后啟動

systemctl start docker

之后如果不出什么意外Docker就會啟動.

2.Docker的基礎概念

這一節(jié)單獨拿出來說, 可見重要性, 理論知識是你學好Docker的基礎, 下面我說的話并不一定是最準確的, 但都是我最真實的理解.

1.Docker是什么

Docker 是一個開源的應用容器引擎,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中讥耗,然后發(fā)布到任何流行的 Linux 機器上爵赵,也可以實現(xiàn)虛擬化硫痰。容器是完全使用沙箱機制七蜘,相互之間不會有任何接口肪笋。 [1] - 摘自百度百科

你可以把Docker理解成一個輕量化的虛擬機, 在上面我們可以部署我們的后臺項目, 而且部署后的項目可移植性非常強, 我們可以把他們導出為Docker鏡像, 這個鏡像可以運行在任何裝有Docker的環(huán)境中, 幾分鐘就可以在別的系統(tǒng)上構建出一套一模一樣的后臺, 此處應有掌聲 - -

2.鏡像和容器的概念

鏡像和容器是Docker中最重要的概念, 我把它們理解成對象, 一個鏡像可以創(chuàng)建出無數(shù)的容器, 而每一個容器都是獨立運行的一套系統(tǒng)環(huán)境, 鏡像需要在Docker官網上下載(https://hub.docker.com/explore/), 容器需要依靠鏡像創(chuàng)建出來, 然后我們就可以在容器上面部署jar包了 - -

3.開始部署
1.下載官方的java鏡像

我們直接用命令行來下載官方為我們提供的鏡像

docker pull java

之后請耐心等待

出現(xiàn)圖上樣子說明安裝成功了 我們來查看一下java鏡像

docker images

我們可以看到 java鏡像在里面 其中包含了一下屬性

REPOSITORY 名字
TAG 鏡像的版本號 latest就是"最新版"
IMAGE ID ID號

然后是創(chuàng)建時間和大小就不多加贅述了

2.一行代碼部署

等了這么久, 大家也累了, 我們直接來一行命令部署爽一下

docker run -itd -p 8082:8082 -v /Users/sam/Desktop/service-a.jar:/usr/service-a.jar --name service-a d23bdf5b1b1b java -jar /usr/service-a.jar

先把下巴合上, 口水擦一擦, 然后我們訪問一下

好的配置成功!!!

3.原理剖析

我知道上面那一大坨你根本沒明白 這里我就來剖析一下

想要配置上面的命令 你首先你要有一個jar包 如果沒有我也不給你 - - 算了 你拿去吧 記得點贊
https://github.com/objcat/demo-jar-for-docker
如果想學你可以去看一下我的上一篇文章 如何打包
http://www.reibang.com/p/935868c9141e

之后我們來解釋一下命令:

docker run
這是docker固有的命令 意思是運行一個鏡像 鏡像啟動后就會自動生成一個容器 容器就是我們運行jar的環(huán)境

-itd

-i, --interactive                    Keep STDIN open even if not attached
-t, --tty                            Allocate a pseudo-TTY
-d, --detach                         Run container in background and print container ID

i保持進程打開
t提供交互命令支持
d在后臺開啟進程 不加這個參數(shù)我們會在當前控制臺運行jar

-p 8082:8082
配置映射端口 我的端口:虛擬機端口 即把虛擬機中的8082端口映射到我的電腦上的8082上, 所以我們才能夠訪問

-v /Users/sam/Desktop/service-a.jar:/usr/service-a.jar
將jar文件掛載到虛擬機中的目錄, 冒號前后分別是自己的jar文件路徑和掛載到虛擬機中的路徑, 掛載你可以理解成快捷方式 讓虛擬機能運行你本地電腦里的jar

--name service-a
給容器起個名叫service-a

d23bdf5b1b1b java -jar /usr/service-a.jar
d23bdf5b1b1b 是java鏡像的ID號 使用docker images 命令可以查看
java -jar /usr/service-a.jar 是運行jar文件的命令 因為jar文件中包含tomcat所以直接運行就可以開啟你的微服務了

好的 以上請認真閱讀 我們繼續(xù)

我剛才已經提到過了 啟動鏡像會自動創(chuàng)建出一個容器 這個容器中跑著我們的微服務接口 我們來查看一下容器

docker ps

我么可以在圖中看到 里面包含著我們的容器ID, 鏡像ID, 映射端口容器名字

好 我覺得它已經跑了很長時間了 我想關閉掉這個服務 我們直接關閉容器

docker stop 5a1cd11440eb

上面的字符串是容器ID, 千萬別寫成鏡像ID了

看到上圖上顯示的文字 就說明容器已經關閉了 我們使用docker ps來查看一下 發(fā)現(xiàn)什么都沒有了

我們來訪問一下剛才的接口


發(fā)現(xiàn)它果然已經關閉了

之后我大發(fā)慈悲 還想讓剛才的那個服務再跑一會 所以我們來重新啟動一下剛才的容器 首先我們查看所有的容器

docker ps -a

這時你可能有疑問 我不是把它停止了嗎 它怎么還在?

看仔細了 我們使用的是docker ps -a查看所有運行過的容器, 即使關閉了也會顯示出來, 你也可以把它當做歷史記錄來看

之后我們重新啟動容器 恢復服務

docker start 5a1cd11440eb

5a1cd11440eb 為容器的ID

我們再次訪問接口 發(fā)現(xiàn)服務可以正常訪問了!

這就是最基本的啟動與停止容器了.

4.自定義鏡像
4.1 手動制作

如果我有這么一個需求, 就是我這套微服務接口,想拿到windows上部署運行, 要怎么做呢?

你可能會覺得這并不麻煩, 無非就是安裝一個java環(huán)境然后配置環(huán)境變量, 然后運行jar包就可以了, 那么如果再算上mysql和redis呢? 這些你都能夠那么快的配置好嗎

以上這些問題, 我們使用自定義鏡像的方式就都可以解決了, 我們可以把一整套環(huán)境直接搬到pc端去運行 不過這里只做簡單配置

我們自定義鏡像也可以比喻成是一個, 你在實例化對象前, 都要先定義一個類, 然后再new出來一個對象, docker也如此, 先做一個鏡像, 之后用這個鏡像直接去運行你的服務即可

下面我們就從本文開始時下載那個java鏡像說起了, 我們都知道java是一個環(huán)境, 它運行是依賴于操作系統(tǒng)的, 所以我覺得那個java可以更貼切的比喻成一個帶linux的java環(huán)境, 而不僅僅是一個jre

接下來我們啟動鏡像

docker run -itd d23bdf5b1b1b

d23bdf5b1b1b 是java鏡像ID

我們發(fā)現(xiàn)啟動這個鏡像會重新創(chuàng)建一個容器, 我們看容器id可以知道, 這是一個全新的跟其他容器都不發(fā)生關系.

之后我們使用attach命令來進入容器

docker attach b72ad733f605

之后請點兩次回車 否則出不來...

我們使用ls看一下目錄結構

我們發(fā)現(xiàn)這就是我們熟悉的linux目錄結構 我們使用uname -a查看一下系統(tǒng)信息

到這里可以證明 我們拉取的java鏡像并不是一個簡簡單單的java, 而是一個安裝了java的linux環(huán)境, 我們在外面執(zhí)行的docker命令, 其實都被里面這位linux接收了, 也就是它幫助我們運行了項目, 并且你會發(fā)現(xiàn)這個linux啟動是如此的快, 所以我們說它是一個輕量化的虛擬機.

好的接下來我們就知道怎么做了, 就是把service-a.jar這個包 放在linux系統(tǒng)里, 然后把這個系統(tǒng)做成Docker鏡像, 在其他平臺的Docker中運行就可以了.

我們現(xiàn)在在虛擬機里面 想回到自己本地的計算機 這里有幾種方法
1.exit - 關閉容器并退出
2.ctrl + q + p 不關閉容器 從新定位到本地目錄

現(xiàn)在的情況下 我們當然會選擇第二種 因為我們要把jar包復制到虛擬機 所以虛擬機必須保持打開的狀態(tài)

回到本地目錄后 我們用docker cp命令來拷貝jar包到容器中

docker cp /Users/sam/Desktop/service-a.jar b72ad733f605:/usr/service-a.jar

id 為容器id

之后我們再進入容器中查看一下

文件已經在容器中了 我們再退出容器

然后把我們的 容器 打包成 鏡像

docker commit b72ad733f605 java/service-a

docker commit容器打包成鏡像
b72ad733f605 容器id
java/service-a 打包后鏡像的名稱

之后查看所有鏡像

發(fā)現(xiàn)多了一個java/service-a
你現(xiàn)在使用它來跑你的服務是完全沒問題的 不過我們?yōu)榱苏f明docker的可移植性 還需要經歷接下來的步驟

我們把它導出成tar文件, tar文件可以直接被Docker安裝

docker save -o service-a.tar 90f80f6279ff

導出之后我們就可以在任意Docker上安裝了!!! 默認導出路徑就是你所在目錄.

我們這里在本地安裝一下 試試 首先我們把本地的java/service-a這個鏡像刪除

docker rmi 90f80f6279ff
image.png

刪除之后我們查看一下


之后我們使用docker load命令來導入我們自定義的鏡像

docker load -i /Users/sam/service-a.tar

好的 我們發(fā)現(xiàn)導入成功了 但是導入的名字為none 這里我也不知道為什么 但是我們可以給它改個名字

 docker tag 90f80f6279ff java/service-a-daoru

我們查看一下命令發(fā)現(xiàn)名字已經改過來了!!!

先別睡覺 我們還差最后一步了 就是把服務service-a重新啟動起來 這次命令要簡潔不少 因為不需要進行掛載了

docker run -idt -p 80:8082 --name service-a 90f80f6279ff java -jar /usr/service-a.jar

我們出了一個錯誤 說是我的service-a已經在使用了

我們把這個占用的容器移除 然后再次啟動就可以了

docker rm 5a1cd11440eb9da17f34f6bffe71add9a80b1ab504d35b6e2cdbb53e4ed0be3c

我們來訪問一下試試吧

因為我這次映射的是80端口 所以不用輸入端口號 直接就可以訪問了

4.2 Dockerfile

經過上面的學習 我們已經可以使用容器生成images再打包成tar導入到其他平臺了, 你或許覺得手動操作起來有些不便, 畢竟如果很多命令的話, 每條都要自己記錄, 復制黏貼也很消耗時間, 所以這里來介紹一種腳本生成鏡像的方式Dockerfile

同樣也很簡單 我們一起來看一下吧 首先在你桌面上創(chuàng)建個文件夾 然后創(chuàng)建一個叫Dockerfile的文件, 需要一字不差

mkdir test
touch Dockerfile

之后我們吧service-a.jar拷貝到當前目錄

如圖所示 那么接下來我們就要寫腳本了 我們打開Dockerfile 寫入下面的腳本

# 基于哪個鏡像源構建
FROM java
# 輸入你的大名
MAINTAINER objcat
# 復制jar到鏡像/usr目錄
COPY service-a.jar /usr/service-a.jar

然后運行

docker build -t java/test .

注意千萬不要忘了 .(點) 表示當前目錄的Dockerfile

如上圖所示 鏡像制作成功了 使用docker images可以查看剛剛生成的鏡像

之后我們來啟動一下吧 因為service-a.jar已經包含在鏡像里面了, 所以我們并不需要掛載

docker run -idt -p 80:8082 --name service-a 90f80f6279ff java -jar /usr/service-a.jar

好的 訪問成功 這就是最基本的Dockerfile的使用方法了

未完待續(xù)...

finally enjoy it.

by objcat 2018.11.29

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末犬庇,一起剝皮案震驚了整個濱河市思劳,隨后出現(xiàn)的幾起案子馍忽,更是在濱河造成了極大的恐慌棒坏,老刑警劉巖燕差,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坝冕,居然都是意外死亡徒探,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門喂窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來测暗,“玉大人,你說我怎么就攤上這事磨澡⊥胱模” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵稳摄,是天一觀的道長稚字。 經常有香客問我,道長厦酬,這世上最難降的妖魔是什么胆描? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮弃锐,結果婚禮上袄友,老公的妹妹穿的比我還像新娘。我一直安慰自己霹菊,他們只是感情好剧蚣,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旋廷,像睡著了一般鸠按。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶碘,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天目尖,我揣著相機與錄音,去河邊找鬼扎运。 笑死瑟曲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的豪治。 我是一名探鬼主播洞拨,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼负拟!你這毒婦竟也來了烦衣?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎花吟,沒想到半個月后秸歧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡衅澈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年键菱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾麻。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡纱耻,死狀恐怖,靈堂內的尸體忽然破棺而出险耀,到底是詐尸還是另有隱情弄喘,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布甩牺,位于F島的核電站蘑志,受9級特大地震影響,放射性物質發(fā)生泄漏贬派。R本人自食惡果不足惜急但,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搞乏。 院中可真熱鬧波桩,春花似錦、人聲如沸请敦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侍筛。三九已至萤皂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匣椰,已是汗流浹背裆熙。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禽笑,地道東北人入录。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像佳镜,于是被迫代替她去往敵國和親僚稿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容