docker入門



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

  1. 安裝Docker
  2. 使用Docker

安裝

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的入門使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM