最近系統(tǒng)的學(xué)習(xí)docker柑蛇,參考資料Docker-從入門到實(shí)踐,docker官網(wǎng)
docker是什么
Docker 使用 Google 公司推出的 Go 語言 進(jìn)行開發(fā)實(shí)現(xiàn)剧包,基于 Linux 內(nèi)核的 cgroup肿嘲,namespace,以及 AUFS 類的 Union FS 等技術(shù)次乓,對進(jìn)程進(jìn)行封裝隔離吓歇,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程票腰,因此也稱其為容器照瘾。最初實(shí)現(xiàn)是基于 LXC,從 0.7 以后開始去除 LXC丧慈,轉(zhuǎn)而使用自行開發(fā)的 libcontainer析命,從 1.11 開始,則進(jìn)一步演進(jìn)為使用 runC 和 containerd逃默。
Docker 在容器的基礎(chǔ)上鹃愤,進(jìn)行了進(jìn)一步的封裝,從文件系統(tǒng)完域、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等软吐,極大的簡化了容器的創(chuàng)建和維護(hù)。使得 Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便吟税、快捷凹耙。
傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后姿现,在其上運(yùn)行一個(gè)完整操作系統(tǒng),在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程肖抱;而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核备典,容器內(nèi)沒有自己的內(nèi)核,而且也沒有進(jìn)行硬件虛擬意述。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便提佣。
mac下安裝docker
下載docker.dmg文件,然后點(diǎn)擊荤崇,一步步操作
檢測Docker Engine, Docker Compose, 和Docker Machine的版本
? docker version
Client:
Version: 17.03.1-ce
API version: 1.27
Go version: go1.7.5
Git commit: c6d412e
Built: Tue Mar 28 00:40:02 2017
OS/Arch: darwin/amd64
Server:
Version: 17.03.1-ce
API version: 1.27 (minimum version 1.12)
Go version: go1.7.5
Git commit: c6d412e
Built: Fri Mar 24 00:00:50 2017
OS/Arch: linux/amd64
Experimental: true
? docker-compose --version
docker-compose version 1.11.2, build dfed245
? docker-machine --version
docker-machine version 0.10.0, build 76ed2a6
配置加速器:
Docker 加速器是什么拌屏,我需要使用嗎?
使用 Docker 的時(shí)候术荤,需要經(jīng)常從官方獲取鏡像倚喂,但是由于顯而易見的網(wǎng)絡(luò)原因,拉取鏡像的過程非常耗時(shí)瓣戚,嚴(yán)重影響使用 Docker 的體驗(yàn)务唐。因此 DaoCloud 推出了加速器工具解決這個(gè)難題,通過智能路由和緩存機(jī)制带兜,極大提升了國內(nèi)網(wǎng)絡(luò)訪問 Docker Hub 的速度枫笛,目前已經(jīng)擁有了廣泛的用戶群體,并得到了 Docker 官方的大力推薦刚照。如果您是在國內(nèi)的網(wǎng)絡(luò)環(huán)境使用 Docker刑巧,那么 Docker 加速器一定能幫助到您。
注冊daocloud无畔,然后在mac標(biāo)簽頁復(fù)制加速器url啊楚。
運(yùn)行官網(wǎng)提供的二個(gè)簡單列子
拉取hello-world鏡像
docker pull hello-world
查看hello-world鏡像信息:
? docker images hello-world
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1815c82652c0 5 days ago 1.84 kB
根據(jù)鏡像生成對應(yīng)容器
? docker run hello-world
ps不加參數(shù)只會把當(dāng)前運(yùn)行的Community打印出來,查看當(dāng)前所有的Community浑彰,加上-a參數(shù)恭理。
? docker ps -a
當(dāng)然也可以根據(jù)鏡像生成一個(gè)具體名稱的鏡像,先刪除當(dāng)前容器
docker rm 60
當(dāng)然如果當(dāng)前容器正在運(yùn)行郭变,要刪除這個(gè)容器颜价,則使用命令
docker rm -f 60
使用鏡像生成具體名稱的容器:
docker run --name miaozhihao hello-world
關(guān)于更多的docker run的命令可以使用來查看
docker run --help
第二個(gè)examples,啟動docker的web服務(wù)
docker pull nginx
docker run -d -p 80:80 --name webserver nginx
-p參數(shù)是使用宿主機(jī)的80映射容器的80端口
? curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a >nginx.org</a>.<br/>
Commercial support is available at
<a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
交互式終端方式進(jìn)入 webserver容器诉濒,
? docker exec -it webserver bash
修改nginx的顯示頁面:
root@41b6804c716e:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@41b6804c716e:/# exit
exit
修改了容器的文件周伦,也就是改動了容器的存儲層。我們可以通過 docker diff
? docker diff webserver
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
C /usr/share/nginx/html/index.html
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
使用docker commit生成鏡像
? docker commit --author "zhihao.miao <1026145686@qq.com>" --message "修改了默認(rèn)網(wǎng)頁" webserver nginx:v2
sha256:0a34c054b8a826d85dddf4d1dbdd3028ab890feff4c8a0844e9b98dd146c2e07
--autho 指定作者 --message表示容器的一些信息
查看當(dāng)前nginx鏡像:
docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 0a34c054b8a8 11 seconds ago 109 MB
nginx latest 958a7ae9e569 4 weeks ago 109 MB
查看當(dāng)前所有的容器未荒,包括運(yùn)行的和停止的
? docker ps -a
\CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41b6804c716e nginx "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp webserver
85612b405cda miaozhihao001dockerhub/commit_test1 "nginx -g 'daemon ..." 20 hours ago Exited (0) 3 hours ago nginx_web
9ef1fb35d7aa ubuntu:14.04 "/bin/bash" 20 hours ago Exited (0) 20 hours ago commit_test
bf8320b9e445 ubuntu:14.04 "/bin/bash" 24 hours ago Exited (0) 24 hours ago sharp_curie
9f9767eb8aaf hello-world "/hello" 10 days ago Exited (0) 10 days ago miaozhihao
啟動新的容器
? docker run --name newwebserver -d -p 80:80 nginx:v2
3619b34ed347cf1ae2ee3ab32c419140871f3084b9a1325ab5d8c6155d43bf06
? curl localhost:80
<h1>Hello, Docker!</h1>
一些docker命令總結(jié)
- docker images :查看當(dāng)前宿主機(jī)的所有鏡像专挪。
- docker images ubuntu:根據(jù)倉庫名列出鏡像
- docker images ubuntu:14.04:指定倉庫名和標(biāo)簽
- docker build -t webservice .:表示使用當(dāng)前目錄下的DockerFile來生成鏡像,-t參數(shù)的值表示鏡像的tagname,如果DockerFile在當(dāng)前路徑下則使用.寨腔,如果不在當(dāng)前路徑下則使用相對路徑速侈。
- docker ps -a: 沒有-a參數(shù)表示顯示當(dāng)前宿主機(jī)的正在運(yùn)行的容器,加上-a表示顯示當(dāng)前宿主機(jī)所有的容器迫卢,包括已經(jīng)退出的容器倚搬。
- docker run -d -p 2222:22 --name base centos:7.1
表示根據(jù)指定的鏡像后臺運(yùn)行容器,容器的名字是base(--name就是指定容器的名字)靖避,centos:7.1表示鏡像的名字潭枣,-p參數(shù)表示當(dāng)前宿主機(jī)的2222端口對應(yīng)容器的22端口比默。
-d參數(shù)表示(Run container in background and print container ID) - docker exec -it base /bin/bash
以交互式命令進(jìn)入base容器并且執(zhí)行/bin/bash命令 - docker rmi webservice:刪除webservice鏡像
- docker rm base: 刪除base容器幻捏,如果base正在運(yùn)行,則可以使用docker rm -f base進(jìn)行強(qiáng)行刪除
Docker 三個(gè)基本概念
- 鏡像(Image)
Docker 鏡像是一個(gè)特殊的文件系統(tǒng)命咐,除了提供容器運(yùn)行時(shí)所需的程序篡九、庫、資源醋奠、配置等文件外榛臼,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量窜司、用戶等)沛善。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變塞祈。
- 容器(Container)
鏡像(Image)和容器(Container)的關(guān)系金刁,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類和實(shí)例一樣,鏡像是靜態(tài)的定義议薪,容器是鏡像運(yùn)行時(shí)的實(shí)體尤蛮。容器可以被創(chuàng)建、啟動斯议、停止产捞、刪除、暫停等哼御。
容器的實(shí)質(zhì)是進(jìn)程坯临,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的 命名空間恋昼。因此容器可以擁有自己的 root文件系統(tǒng)尿扯、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間焰雕,甚至自己的用戶 ID 空間衷笋。容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來,就好像是在一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣辟宗。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全爵赵。 - 倉庫(Repository)
鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主上運(yùn)行泊脐,但是空幻,如果需要在其它服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲容客、分發(fā)鏡像的服務(wù)秕铛,Docker Registry 就是這樣的服務(wù)。
一個(gè) Docker Registry 中可以包含多個(gè)倉庫(Repository)缩挑;每個(gè)倉庫可以包含多個(gè)標(biāo)簽(Tag)但两;每個(gè)標(biāo)簽對應(yīng)一個(gè)鏡像。
通常供置,一個(gè)倉庫會包含同一個(gè)軟件不同版本的鏡像谨湘,而標(biāo)簽就常用于對應(yīng)該軟件的各個(gè)版本。我們可以通過 <倉庫名>:<標(biāo)簽>的格式來指定具體是這個(gè)軟件哪個(gè)版本的鏡像芥丧。如果不給出標(biāo)簽紧阔,將以 latest作為默認(rèn)標(biāo)簽。