docker之入門——安裝及基本命令

Docker簡介

Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,聽從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。html

Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。linux

(背景),雲計算興起後,服務器硬件擴展很是便利,軟件服務部署成爲了瓶頸,docker趁勢而興。nginx

爲何用 Docker 

容器的啓動能夠在秒級實現,比傳統的虛擬機方式要快得多git

對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器github

docker的出現,讓開發/測試/線上的環境部署,成爲便利一條龍。docker

 

更快速的交付和部署

對開發和運維(devop)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。ubuntu

開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。centos

更高效的虛擬化

Docker 容器的運行不須要額外的 hypervisor 支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。數組

更輕鬆的遷移和擴展

Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。安全

更簡單的管理

使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。

對比傳統虛擬機總結

特性

容器

虛擬機

啓動

秒級

分鐘級

硬盤使用

通常爲 MB

通常爲 GB

性能

接近原生

弱於

系統支持量

單機支持上千個容器

通常幾十個

Docker基本概念

Docker架構

 

 

host --- 主機載體 == docker安裝的地方

繼承類比:

Class2   extents     Class1    ---------------------- Object o = new Class2

--------------------------------------此時,o對象的結構中,有Class1的成員結構

    image2 extents     image1   ----------------------Container c = new image2

-------------------------------------此時,c容器中,有image1的文件

Docker 鏡像

Docker 鏡像就是一個只讀的模板。

例如:一個鏡像能夠包含一個完整的 ubuntu 操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。

鏡像能夠用來建立 Docker 容器。

Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。

Docker 容器

Docker 利用容器來運行應用。

容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。

能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

Docker 倉庫

倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。

固然,用戶也能夠在本地網絡內建立一個私有倉庫。

當用戶建立了本身的鏡像以後就可使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上 pull 下來就能夠了。

容器、鏡像的運行關係

 

 

 

安裝 Docker

 Docker 支持 CentOS6 及之後的版本。

卸載

1.查詢安裝過的包

yum list installed | grep docker

docker-engine.x86_64                 17.03.0.ce-1.el7.centos         @dockerrepo

 2.刪除安裝的軟件包

yum -y remove docker-engine.x86_64 

3.刪除鏡像/容器等

rm -rf /var/lib/docker

 

CentOS6

對於 CentOS6,可使用 EPEL 庫安裝 Docker,命令以下

$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

$ sudo yum install docker-io

CentOS7

CentOS7 系統 CentOS-Extras 庫中已帶 Docker,能夠直接安裝:

$ sudo yum install docker     ##不是最新版本

 

 

#最新版安裝

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

sudo yum install docker-ce

 

查看docker版本

docker version

docker info

啓動docker

sudo service docker start

設置隨系統啓動

sudo chkconfig docker on

Docker初體驗

docker run hello-world  ##進入docker世界

 

Docker基本操做

容器操做

docker [run|start|stop|restart|kill|rm|pause|unpause]

  • run/create[鏡像名]  建立一個新的容器並運行一個命令
  • start/stop/restart[容器名]:啓動/中止/重啓一個容器
  • kill [容器名]: 直接殺掉容器,不給進程響應時間
  • rm[容器名]:刪除已經中止的容器
  • pause/unpause[容器名]:暫停/恢復容器中的進程
  • ps:查看容器列表(默認查看正在運行的容器,-a查看全部容器
  • inspect[容器名]:查看容器配置元數據
  • exec -it [容器名] /bin/bash:進入容器環境中交互操做
  • logs --since="2019-02-01" -f --tail=10 [容器名]:查看容器日誌 
  • cp path1 [容器名]:path 容器與主機之間的數據拷貝
  • export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系統做爲一個tar歸檔文件
  • import test.tar [鏡像名:版本號]:導入歸檔文件,成爲一個鏡像

docker [ps|inspect|exec|logs|export|import]

 

 

鏡像操做

docker images|rmi|tag|build|history|save|load]

  • images列出本地鏡像列表
  • rmi [鏡像名:版本]:刪除鏡像
  • tag [鏡像名:版本] [倉庫]/[鏡像名:版本]標記本地鏡像,將其納入某一倉庫
  • build -t [鏡像名:版本] [path]:Dockerfile 建立鏡像
  • history [鏡像名:版本]查看指定鏡像的建立歷史
  • save -o xxx.tar [鏡像名:版本] /  save [鏡像名:版本]>xxx.tar : 鏡像保存成 tar 歸檔文件
  • load --input  xx.tar / docker load<xxx.tar : 從歸檔文件加載鏡像

鏡像與容器原理及用法探究

history命令查看鏡像層

例:docker history hello-world

 

 顯示鏡像hello-world分三層,其中兩個空層

查看鏡像文件

鏡像存放在imagedb

通常在image/overlay2/imagedb/content/sha256

 

打開一個鏡像文件查看其內容:

cat f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80

{
"architecture": "amd64",
"config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/hello"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"container": "8e2caa5a514bb6d8b4f2a2553e9067498d261a0fd83a96aeaaf303943dff6ff9",
"container_config": {
"Hostname": "8e2caa5a514b",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"/hello\"]"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"created": "2019-01-01T01:29:27.650294696Z",
"docker_version": "18.06.1-ce",
"history": [{
"created": "2019-01-01T01:29:27.416803627Z",
"created_by": "/bin/sh -c #(nop) COPY file:f77490f70ce51da25bd21bfc30cb5e1a24b2b65eb37d4af0c327ddc24f0986a6 in / "
}, {
"created": "2019-01-01T01:29:27.650294696Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/hello\"]",
"empty_layer": true
}],
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": ["sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3"]
}
}

 

----其中,history數組內,標識了鏡像的歷史記錄(與history命令內容對應)

----rootfsdiff_ids中,對應了依賴使用中鏡像層文件(history命令中size大於0的層)

 

查看鏡像層文件

層文件在layerdb

ll /var/lib/docker/image/overlay2/layerdb/sha256

 

#鏡像層文件內結構:

 

 

鏡像與容器總結

一個鏡像就是一層層的layer層文件,蓋樓而成,上層文件疊於下層文件上,若上層文件有與下層文件重複的,則覆蓋掉下層文件重複的部分,以下圖:

 

---------初始掛載時讀寫層爲空。

---------當須要修改鏡像內的某個文件時,只對處於最上方的讀寫層進行了變更,不復寫下層已有文件系統的內容,已有文件在只讀層中的原始版本仍然存在,但會被讀寫層中的新版本文件所隱藏,當 docker commit 這個修改過的容器文件系統爲一個新的鏡像時,保存的內容僅爲最上層讀寫文件系統中被更新過的文件。

---------聯合掛載是用於將多個鏡像層的文件系統掛載到一個掛載點來實現一個統一文件系統視圖的途徑,是下層存儲驅動(aufsoverlay) 實現分層合併的方式。

 

容器建立詳解

交互式建立容器並進入:

docker run -it --name centos centos /bin/bash(前臺進程)

------------------------exit退出也關閉容器; Ctrl+P+Q退出不關閉容器

 

 

後臺啓動容器:

 

 

docker run -d --name nginx nginx

進入已運行的容器:

docker exec -it nginx /bin/bash

查看容器的元數據: docker inspect nginx  

綁定容器端口到主機:

docker run -d -p 8080:80 --name nginx nginx:latest

掛載主機文件目錄到容器內:

 docker run -dit -v /root/peter_dir/:/pdir --name cent centos

複製主機文件到容器內:

docker cp anaconda-ks.cfg cent:/var

相關文章
相關標籤/搜索