一.前言
最近玩了玩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
刪除之后我們查看一下
之后我們使用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
的使用方法了