title: Docker教程
Build,Ship & Run anywhere
Origins
早在十多年前國內外的一些大廠就開始投入研發和使用容器技術,比如Google,對他們來說,使用容器能夠充分利用計算資源節省硬件成本,而這幾年,真正把容器技術發揚光大的是Docker。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口
Docker的slogan“Build,Ship & Run anywhere”定位非常清晰,Docker的出現打破了傳統運維模式里從打包到部署的過程中環境、語言、平台不一致的亂象,將這一整套開發運維模式標准化了,從而真正幫助企業實踐了DevOps和微服務化。
但是,國內的大型企業面臨技術轉型的的時候,歷史包袱太沉重,對Docker的接受和部署非常緩慢。同樣地,多數的中小型企業也並未把Docker作為生產環境上部署和管理服務的標配,而選擇繼續使用傳統的運維方案。
造成這種現象的原因是什么呢?可能原因之一是企業從業人員對Docker的學習認知並不夠。之二是目前市面上Docker的容器編排系統很多,常見的就有K8s、Mesos、Swarm、Rancher、Newben,編排系統的學習和認知成本也進一步提升了企業應用Docker的難度
本文作者同大家一起開始步入docker的鏡像世界,一步一步,深入docker,從入門到精通,從使用到理解掌握
quick-start
安裝
Mac
Docker基本安裝
mac安裝了homebrew的話
直接brew cask install docker(我的沒有成功,就去官網下載了)
官網下載需要登錄帳號 下載的是ce版本
安裝完后
啟動終端后,通過命令可以是否安裝成功
docker info
以及查看docker版本
docker --version
Docker中配置國內鏡像
在正常情況下,docker有一個默認連接的國外官方鏡像,在國外的網友訪問該官方鏡像自然不成問題,但是國內畢竟不是國外,由於國情不同,中國的網絡訪問國外官方鏡像網速一向很慢,而且往往還會遭遇斷網的窘境,所以說我們要想正常使用docker的鏡像,那么我們就不得不配置相應的國內鏡像。
Docker可以配置的國內鏡像有很多可供選擇,比如說:阿里雲,網易蜂巢,DaoCloud,Docker中國區官方鏡像等,這些都是可以提供給大家隨意選擇的不錯的鏡像倉庫。
在任務欄點擊
Docker for mac 應用圖標(右上方) -> Perferences... -> Daemon -> Registry mirrors
在列表中填寫加速器地址即可。用的是網易的http://hub-mirror.c.163.com 修改完成之后,點擊 Apply & Restart 按鈕,Docker 就會重啟並應用配置的鏡像地址了。
RedHat
Docker基本安裝
使用yum包管理工具安裝
yum install -y docker
啟動docker服務
systemctl start docker
查看是否安裝成功
docker --version
Docker中配置國內鏡像
使用vi修改 /etc/docker/daemon.json 文件
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
配置完之后執行下面的命令,以使docker的配置文件生效
systemctl daemon-reload
systemctl restart docker
docker info可以查看到修改過的配置
Registry Mirrors:
http://hub-mirror.c.163.com
Win10
Docker基本安裝
Docker中配置國內鏡像
使用
構建基本環境
安裝成功之后,打開終端
確定你想要的操作系統,如果是centos
docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 4773 [OK]
復制這個名字centos
docker seach會在dockerhub,dockerhub(dockerhub類似於github,github大部分用於提交同步代碼,dockerhub用於鏡像同步與存儲)中尋找name和docker search str的這個str相接近的字符串
鏡像:這里可以理解為一個壓縮包,這有助於理解
然后我們將這個遠程庫中的鏡像下拉到本地,在前期,你可以將鏡像理解為一個壓縮包,這里,就是centos系統的壓縮包
docker pull centos
即可獲取到最新的centos版本的鏡像
如果需要指明版本
docker pull centos:版本號
即可獲取到相應版本
docker image ls
命令簡化:docker images
查看可以使用的所有image的列表
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5182e96772bf 8 weeks ago 200MB
可以看到我們剛剛pull下來的鏡像
TAG表示的版本號,latest表示是最新版,IMAGE ID唯一確定這個鏡像,以后都是用這個序列號表示這個鏡像
CREATED表示這個鏡像是什么時候被創建出來的
SIZE表示這個鏡像的大小
接下來我們需要'解壓'這個鏡像(先不要執行這個命令)
docker run -it --name mycentos centos /bin/bash
解釋:
Docker run 命令用來創建一個新的容器並運行,相當於 docker create和docker start的組合。
用 docker run --help可以顯示命令的使用說明。
-i, --interactive Keep STDIN open even if not attached(如果沒有打開交互界面,則打開)
-t, --tty=false 分配tty設備,該可以支持終端登錄,默認為false
帶着-it參數會打開一個命令行窗口,退出這個窗口就相當於是'關機',不過還可以通過docker start的方式'開機',這也就是docker的前台運行方式,后台運行之后會提到
參數-t讓Docker分配一個偽終端並綁定在容器的標准輸入上,-i讓容器的標准輸入保持打開。
既然我們要解壓這個鏡像,就一定得知道這個鏡像('壓縮包')是誰,centos參數就可以唯一的確定這個'壓縮包',可以唯一標識的只有name:tag或者id,如果像這樣只寫了name,沒有注明tag,一律表示最新版latest,而這里我們正好是latest
--name mycentos --name參數后跟我們解壓后的東西的名字mycentos是名字,這樣mycentos就能唯一的確定這個解壓后的東西,實際上我們之前說了,'壓縮包'里壓縮的就是一個centos操作系統,所以解壓后的東西就是一個centos操作系統
/bin/bash
這是表示載入容器后運行bash ,docker中必須要保持一個進程的運行,要不然整個容器就會退出。
這個就表示啟動容器后啟動bash。
好的,介紹完了,讓我們實際操作試試看
再次確認我們上一步push下來的image
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5182e96772bf 2 months ago 200MB
docker run -it --name mycentos centos /bin/bash
如果運行成功,就會變成這樣
zyfselton@MacBook-Pro-6:docker run -it --name mycentos centos /bin/bash
[root@9f733e598d67 /]#
這就表示我們已經成功的創建並啟動和進入了這個centos操作系統
9f733e598d67這個比我們給這個系統起得名字更能唯一標識,但是不容易記憶,需要每次自己查看
保存自己的環境
然后我們新建一個文件夾
mkdir myapp
cd myapp
mkdir work1
這里的新建文件夾是簡單工作,主要是表示我們在這個系統里面做了一些事,我們需要測試我們做的這個事(這里是新建文件夾)能不能被保存到'壓縮包'中去,當然你可以在里面安裝環境,寫筆記,運行程序等等,但是某些需要暴露端口給外部使用的這種服務的安裝,后面會詳細介紹
然后我們關閉這個窗口,或者輸入exit也可以退出這個窗口
也就相當於關閉了剛才的操作系統
那我們的修改,或者說是工作內容會被清除嗎
doker ps
會顯示所有正在運行的os(Operation System操作系統)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
發現沒有
docker ps -a
會顯示所有os(不管有沒有在啟動着)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 9 minutes ago Exited (0) 2 minutes ago
發現這個id 9f733e598d67和我們之前啟動os的id一樣,恩,也算是確認過眼神了
這個時候我們要啟動它
輸入docker start后接 CONTAINER ID就會啟動那個os
docker start 9f733e598d67
此時docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 45 minutes ago Up 30 minutes mycentos
就會發現我們的系統啟動了
可是我們還沒有進入到這個系統
進入系統
docker exec -it 9f733e598d67 /bin/bash
[root@9f733e598d67 /]#
這里的-it和/bin/bash和之前docker run的那個代表的意思類似
cd myapp
cd work1
進入容器后的目錄為workdir,默認workdir為自己的home(~)下,我們創建的時候在home下,所以地址是沒有問題的
發現我們之前的工作內容都在
這個時候即便exit或者關閉窗口,之后再次進入安裝docker環境的機器(就是宿主機,比如我的就是mac環境)的窗口時,我們docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 4 hours ago Up About an hour mycentos
然后我們可以將這個帶有工作內容的os'壓縮'成鏡像,這樣相當於有了一個壓縮包,每次我們解壓這個壓縮包都會的到一個相應內容的os
docker commit 9f733e598d67 selton/mycentos:1
記得這兒的selton/mycentos:1可以標識這個由9f733e598d67壓縮包解壓后得到的完整的os
/之前的selton一定要是你的用戶名,就是你去docker官網注冊的帳號的用戶名,沒有注冊一定要注冊一個,不然之后我們無法將壓縮包像git提交代碼到倉庫一樣提交我們的壓縮包到我們的庫
docker image ls就會發現一個新的壓縮包
REPOSITORY TAG IMAGE ID CREATED SIZE
selton/mycentos 1 81bc6c9c1684 5 seconds ago 200MB
關閉掉剛才的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 4 hours ago Up About an hour mycentos
docker stop 9f733e598d67
將新的壓縮包解壓,看看里面有沒有我們的工作內容
docker run -it --name mycentos2 selton/mycentos:1 /bin/bash
--name后面的mycentos2是我們解壓后的os的名字,selton/mycentos:1的selton/mycentos是name,1是tag,表示的是具體的某個壓縮包
cd myapp
cd work1
發現工作內容都在,至此,我們就明白了docker的主要作用
那么,我們的壓縮包是在本地機器上的(這里是mac),但是開發環境和測試環境一定是不一樣的,我們如何做到將我們的壓縮包讓開發環境獲取,這就和代碼一樣,記得我們起初是怎么獲得centos的嗎
沒錯,回頭看你會發現這個命令docker pull,這和git pull不光長得像,作用也是類似的,用於從遠程庫中獲取到我們的壓縮包,不過git中需要先建立本地庫和特定遠程庫的關系,但是我們的docker的鏡像庫的遠程庫只有一個,就是dockerhub庫
將自己的環境提交到遠程
官方下載docker是需要帳號的,此時我們已經有了帳號,如果沒有,請前往官網注冊一個帳號
注意! docker的帳號注冊坑有點多,如果你是進入到docker官網,請找到下載頁面(我知道你是要注冊帳號),下載docker,會需要登錄,這時候你就能找到登錄頁,找到注冊按鈕:),或者是直接進入dockerhub,首頁有注冊按鈕,注冊或者登錄的時候有時候會不成功,加載不出來驗證你是不是機器人的組件,可能需要翻牆
docker login
會提示讓輸入用戶名:selton
然后就是輸入密碼
登錄需要大概十秒的時間
之后會顯示Login Succeeded
如果需要退出,輸入docker logout
顯示如下表示成功退出
Removing login credentials for https://index.docker.io/v1/
如果你和我一樣使用了統一密碼管理工具,請記得粘貼使用窗口上的編輯->paste,而不是cv
登錄成功之后推送我們的鏡像到自己的庫中
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos/mycentos 1 81bc6c9c1684 19 hours ago 200MB
查看到了我們制作的鏡像('壓縮包')
然后輸入docker push myos/mycentos:1
登錄dockerhub就可以看到多了一個你提交的這個鏡像(''壓縮包'')
也就是現在只要有一台機器安裝了docker,就可以得到這個鏡像('壓縮包'),里面除了一個現成的os還有我們可能安裝部署完的環境
同步遠程庫環境到本地
先嘗試一下本地下載遠程的我們提交的鏡像
先刪除掉本地的
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selton/mycentos 1 e732a1e5c865 About an hour ago 200MB
docker rmi e732a1e5c865
顯示
Untagged: selton/mycentos:1
Untagged: selton/mycentos@sha256:8d264bbac07545d8933dcbab286bf343a52bf5a63426b5c4b9d944f4b9acc558
Deleted: sha256:e732a1e5c8652bbb8a48e2ffed6dee7c52df5dfc74f19b0c433b01f2a814417d
Deleted: sha256:3f45206b758eae4a3864432e0e0fda23991d3956a779d4831c1f95dcb4d7191b
docker images查看,ok
docker pull selton/mycentos:1
就在下載了
同步遠程庫環境到linux上(開發,測試,生產)
我用的是一台阿里雲的雲服務器,1核2g內存,40g硬盤,centos7
安裝docker
yum install -y docker
ok
啟動docker服務
systemctl start docker
docker --version
由於我們剛剛的庫就和git的庫道理一樣,是公開的
無須登錄
docker pull selton/mycentos:1
docker images可以查看到
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/selton/mycentos 1 e732a1e5c865 6 hours ago 200 MB
之后就和之前的操作一樣了
我們再次重復一下以加深印象
現將這個image('壓縮包')解壓
docker run -it --name mycentos e732a1e5c865 /bin/bash
ok,成功進入這個解壓出來的container(os)中
cd myapp
cd work1
ok,至此完成docker的入門使用