docker入門
Docker教程
Build,Ship & Run anywhere.
Origin
早在十多年前國內外的一些大廠就開始投入研發和使用容器技術,比如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的前臺執行方式,後臺執行之後會提到
既然我們要解壓這個映象,就一定得知道這個映象('壓縮包')是誰,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 login
會提示讓輸入使用者名稱:selton
然後就是輸入密碼
登入需要大概十秒的時間
之後會顯示Login Succeeded
如果需要退出,docker logout
Removing login credentials for ofollow,noindex" target="_blank">https://index.docker.io/v1/
如果你和我一樣使用了統一密碼管理工具,請記得貼上使用視窗上的編輯->paste,而不是cv
登入成功之後推送我們的映象到自己的庫中
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos/mycentos 1 81bc6c9c1684 19 hours ago 200MB
檢視到了我們製作的映象('壓縮包')
登入docker官網就可以看到多了一個你提交的這個映象(''壓縮包'')
也就是現在只要有一臺機器安裝了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的入門使用