參考書籍 Docker —— 從入門到實(shí)踐
本文只記錄重要步驟,更詳細(xì)的內(nèi)容請?jiān)谠瓡胁榭?/p>
安裝
Ubuntu、Debian 系列安裝 Docker
盡量使用最新的發(fā)行版志衍,本文使用的版本為Ubuntu Xenial 16.04 (LTS)
使用腳本自動(dòng)安裝
Docker 官方為了簡化安裝流程崭倘,提供了一套安裝腳本,Ubuntu 和 Debian 系統(tǒng)可以使用這套腳本安裝:
curl -sSL https://get.docker.com/ | sh
執(zhí)行這個(gè)命令后悦析,腳本就會自動(dòng)的將一切準(zhǔn)備工作做好寿桨,并且把 Docker 安裝在系統(tǒng)中。
不過强戴,由于偉大的墻的原因亭螟,在國內(nèi)使用這個(gè)腳本可能會出現(xiàn)下載出錯(cuò)的情況。
本文使用的是 DaoCloud 提供的安裝腳本
DaoCloud 提供的安裝腳本 curl -sSL https://get.daocloud.io/docker | sh
啟動(dòng) Docker 引擎
$ sudo systemctl enable docker
$ sudo systemctl start docker
建立 docker 用戶組
默認(rèn)情況下骑歹,docker命令會使用 Unix socket 與 Docker 引擎通訊预烙。而只有 root 用戶和 docker 組的用戶才可以訪問 Docker 引擎的 Unix socket。出于安全考慮道媚,一般 Linux 系統(tǒng)上不會直接使用 root 用戶扁掸。因此翘县,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組。
建立 docker
組:
$ sudo groupadd docker
將當(dāng)前用戶加入 docker
組:
$ sudo usermod -aG docker $USER
鏡像加速器
國內(nèi)訪問 Docker Hub 有時(shí)會遇到困難谴分,此時(shí)可以配置鏡像加速器锈麸。
本文使用 DaoCloud 提供的加速器
輸入如下命令:
$ sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s 服務(wù)提供商分配給你的地址
例如: http://4e76bd89.m.daocloud.io
然后重啟 docker
服務(wù)即可
$ sudo systemctl restart docker.service
鏡像
獲取鏡像
獲取鏡像的命令是 docker pull
格式為:
$ sudo docker pull [選項(xiàng)] [Docker Registry地址]<倉庫名>:<標(biāo)簽>
- Docker Registry地址:地址的格式一般是 <域名/IP>[:端口號]。默認(rèn)地址是 Docker Hub牺蹄。
- 倉庫名:如之前所說掐隐,這里的倉庫名是兩段式名稱,既 <用戶名>/<軟件名>钞馁。對于 Docker Hub虑省,如果不給出用戶名,則默認(rèn)為 library僧凰,也就是官方鏡像探颈。
例如:
$ sudo docker pull ubuntu:14.04
上面的命令中沒有給出 Docker Registry 地址,因此將會從 Docker Hub 獲取鏡像训措。而鏡像名稱是 ubuntu:14.04伪节,因此將會獲取官方鏡像 library/ubuntu 倉庫中標(biāo)簽為 14.04 的鏡像。
運(yùn)行
有了鏡像后绩鸣,我們就可以以這個(gè)鏡像為基礎(chǔ)啟動(dòng)一個(gè)容器來運(yùn)行怀大。以上面的 ubuntu:14.04
為例,如果我們打算啟動(dòng)里面的 bash
并且進(jìn)行交互式操作的話呀闻,可以執(zhí)行下面的命令化借。
$ sudo docker run -it --rm ubuntu:14.04 bash
root@08ce449494db:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
root@08ce449494db:/# exit
exit
$
docker run
是運(yùn)行容器的命令
-
-it
:這是兩個(gè)參數(shù),一個(gè)是-i
:交互式操作捡多,一個(gè)是-t
終端蓖康。我們這里打算進(jìn)入bash
執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端垒手。 -
--rm
:這個(gè)參數(shù)是說容器退出后隨之將其刪除蒜焊。默認(rèn)情況下,為了排障需求科贬,退出的容器并不會立即刪除泳梆,除非手動(dòng)docker rm
。我們這里只是隨便執(zhí)行個(gè)命令榜掌,看看結(jié)果优妙,不需要排障和保留結(jié)果,因此使用--rm
可以避免浪費(fèi)空間唐责。 -
ubuntu:14.04
:這是指用ubuntu:14.04
鏡像為基礎(chǔ)來啟動(dòng)容器鳞溉。 -
bash
:放在鏡像名后的是命令,這里我們希望有個(gè)交互式Shell
鼠哥,因此用的是bash
熟菲。
進(jìn)入容器后看政,我們可以在 Shell
下操作,執(zhí)行任何所需的命令抄罕。這里允蚣,我們執(zhí)行了 cat /etc/os-release
,這是 Linux
常用的查看當(dāng)前系統(tǒng)版本的命令呆贿,從返回的結(jié)果可以看到容器內(nèi)是 Ubuntu 14.04.5 LTS
系統(tǒng)嚷兔。
最后我們通過 exit
退出了這個(gè)容器。
列出鏡像
要想列出已經(jīng)下載下來的鏡像做入,可以使用 docker images
命令冒晰。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
ubuntu latest f49eec89601e 12 days ago 129 MB
ubuntu 14.04 b969ab9f929b 12 days ago 188 MB
列表包含了倉庫名、標(biāo)簽竟块、鏡像 ID壶运、創(chuàng)建時(shí)間以及所占用的空間。
鏡像 ID 是鏡像的唯一標(biāo)識浪秘,一個(gè)鏡像可以對應(yīng)多個(gè)標(biāo)簽蒋情。因此,在上面的例子中耸携,我們可以看到 ubuntu:16.04
和 ubuntu:latest
擁有相同的 ID棵癣,因?yàn)樗鼈儗?yīng)的是同一個(gè)鏡像。
列出部分鏡像
不加任何參數(shù)的情況下夺衍,docker images
會列出所有頂級鏡像狈谊,但是有時(shí)候我們只希望列出部分鏡像。docker images
有好幾個(gè)參數(shù)可以幫助做到這個(gè)事情刷后。
根據(jù)倉庫名列出鏡像
$ sudo docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
ubuntu latest f49eec89601e 12 days ago 129 MB
ubuntu 14.04 b969ab9f929b 12 days ago 188 MB
列出特定的某個(gè)鏡像的畴,也就是說指定倉庫名和標(biāo)簽
$ sudo docker images ubuntu:16.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
除此以外渊抄,docker images
還支持強(qiáng)大的過濾器參數(shù) --filter
尝胆,或者簡寫 -f
。比如护桦,我們希望看到在 ubuntu:14.04
之后建立的鏡像含衔,可以用下面的命令:
$ sudo docker images -f since=ubuntu:14.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f49eec89601e 12 days ago 129 MB
ubuntu latest f49eec89601e 12 days ago 129 MB
想查看某個(gè)位置之前的鏡像也可以,只需要把 since
換成 before
即可二庵。
以特定格式顯示
默認(rèn)情況下贪染,docker images
會輸出一個(gè)完整的表格,但是我們并非所有時(shí)候都會需要這些內(nèi)容催享。比如杭隙,我們需要利用 docker images
把所有鏡像的 ID 列出來,然后交給 docker rmi
命令作為參數(shù)來刪除指定的這些鏡像因妙,這個(gè)時(shí)候就用到了 -q
參數(shù)痰憎。
$ sudo docker images -q
f49eec89601e
f49eec89601e
b969ab9f929b
利用 commit 理解鏡像構(gòu)成(預(yù)留)
此處先省略一萬字_
............................................................
使用 Dockerfile 定制鏡像
臨時(shí)內(nèi)容:
Dockerfile 中有 CMD 時(shí)票髓,容器啟動(dòng)時(shí)則執(zhí)行該 CMD,如果在啟動(dòng)時(shí)加入?yún)?shù)則會覆蓋掉原來的 CMD铣耘,如果 Dockerfile 中有 ENTRYPOINT洽沟,則 CMD 作為參數(shù)傳遞給 ENTRYPOINT。
Dockerfile:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
CMD [ "curl", "-s", "http://ip.cn" ]
$ docker run myip // 此時(shí)容器內(nèi)執(zhí)行的是命令 curl -s http://ip.cn
$ docker run myip echo "Hello" // 此時(shí)容器內(nèi)執(zhí)行的是命令 echo "Hello"蜗细,CMD 被覆蓋了