Docker使用教程

■ 簡介

Docker 是一個開源的應(yīng)用容器引擎,基于 Go 語言并遵從 Apache2.0 協(xié)議開源。

Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級链蕊、可移植的容器中您机,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化脖祈。

容器是完全使用沙箱機制肆捕,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低盖高。

Docker 從 17.03 版本之后分為 CE(Community Edition:社區(qū)版) 和 EE(Enterprise Edition:企業(yè)版)慎陵,我們用社區(qū)版就可以了。

■ 基礎(chǔ)概念

鏡像(Image):Docker 鏡像(Image)就相當(dāng)于是一個 root 文件系統(tǒng)喻奥。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)席纽。

容器(Container):鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類和實例一樣撞蚕,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體甥厦。容器可以被創(chuàng)建、啟動舶赔、停止竟纳、刪除、暫停等征懈。

倉庫(Repository):倉庫可看成一個代碼控制中心卖哎,用來保存鏡像删性。

■ 相關(guān)地址

官方hub倉庫:https://hub.docker.com

菜鳥教程:https://www.runoob.com/docker/docker-tutorial.html

官方安裝:https://docs.docker.com/engine/install/centos/

■ 注意事項

如果使用的賬號不是root賬號蹬挺,需要使用 sudo 前綴巴帮,使用root相關(guān)權(quán)限執(zhí)行命令,后續(xù)命令中省略 sudo 命令垃沦,如果權(quán)限不足肢簿,請自行加上該前綴池充。

yum install xxx

sudoyum install xxx

■ 卸載docker

# 刪除相關(guān)組件

# 如果使用種方式的話缎讼,需要羅列全部使安裝過的組件血崭;

yum remove docker \

? docker-client \

? docker-client-latest \

? docker-common \

? docker-latest \

? docker-latest-logrotate \

? docker-logrotate \

? docker-selinux \

? docker-engine-selinux \

? docker-engine


# 第二種方式功氨,使用匹配符直接刪除全部

# 推薦使用第二種方式,無需羅列所有的安裝組件

yum remove docker docker-*

?

# 刪除注冊的服務(wù)

rm-rf/etc/systemd/system/docker.service.d

?

# 刪除docker工作目錄

rm-rf/var/lib/docker*

rm-rf/var/run/docker*

?

# 刪除配置文件

# 直接清空這個文件夾忱详,下面所有配置都將被清空

rm-rf/etc/docker

#----------------------------#

# /etc/docker/daemon.json ?? #

# /ect/docker/key.json ? ? ? #

#----------------------------#

?

# 查找殘留的docker

rpm-qa|grep docker

■ 安裝docker

# 第一步匈睁,需要安裝一些依賴組件

# 安裝所需的軟件包航唆。yum-utils 提供了 yum-config-manager,

# 并且 device mapper 存儲驅(qū)動程序需要 device-mapper-persistent-data 和 lvm2粪狼。

yum install-yyum-utils \

? device-mapper-persistent-data \

? lvm2

?

# 使用以下命令來獲得穩(wěn)定的倉庫

# 阿里云源地址速度相對比較快再榄,這里是設(shè)置源地址為阿里云的鏡像倉庫地址困鸥。

yum-config-manager \

--add-repo\

?? http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 安裝 Docker Engine-Community

yum install-ydocker-ce docker-ce-cli containerd.io

?

# 將當(dāng)前用戶添加到docker用戶組

usermod-aGdocker${USER}

?

# Docker默認未啟動疾就,需要手動重啟docker服務(wù)

systemctlrestartdocker

systemctlstartdocker

systemctlstopdocker

?

# 切換當(dāng)前會話到docker組

newgrp-docker

■ docker鏡像加速

sudomkdir-p/etc/docker

sudotee/etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://fpr97nhz.mirror.aliyuncs.com"]

}

EOF

sudosystemctl daemon-reload

sudosystemctlrestartdocker

■ docker常用命令

基礎(chǔ)命令

# 查看docker基礎(chǔ)信息

docker info

?

# 拉取鏡像

docker pull <image>:<tag>

?

# 移除容器

dockerrm

?

# 移除鏡像

docker rmi <imageId>

?

# 啟動猬腰、停止漆诽、重啟容器

dockerstop

dockerstart

dockerrestart

docker run-itd--name-P/-p: /bin/bash

?

# 查看docker容器

dockerps<-a>

?

# 打包鏡像

docker tag <path>/<name> <remotePath>/<name>

docker push <remotePath>/<name>

?

# 登錄docker

docker login <remoteIp>

?

# 進入容器內(nèi)部

docker exec-it /bin/bash

?

# 從倉庫搜索鏡像

docker search <imageName>

批量操作

# 殺死所有正在運行的容器

dockerkill$(docker ps -a -q)

?

# 刪除所有的容器

dockerrm$(docker ps -a -q)

?

# 刪除所有未打 dangling 標(biāo)簽的鏡

docker rmi$(docker images -q -f dangling=true)

?

# 刪除所有鏡像

docker rmi$(docker images -q)

docker rmi$(docker images -q)

?

# 強制刪除無法刪除的鏡像

docker rmi-f

docker rmi-f$(docker images -q)

■ Dockerfile

Dockerfile是一個包含用于組合鏡像的命令的文本文檔±加ⅲ可以使用在命令行中調(diào)用任何命令。 Docker通過讀取文件中的指令自動生成鏡像陨闹。

腳本結(jié)構(gòu)

基礎(chǔ)鏡像信息

維護者信息

鏡像操作指令

容器啟動時執(zhí)行指令

’#’ 為 Dockerfile 中的注釋

"&&" 符號連接命令趋厉,這樣執(zhí)行后君账,只會創(chuàng)建 1 層鏡像

Docker以從上到下的順序運行Dockerfile的指令乡数。為了指定基本鏡像,第一條指令必須是FROM净赴。一個聲明以#字符開頭則被視為注釋玖翅。可以在Docker文件中使用RUN写妥,CMD珍特,F(xiàn)ROM魔吐,EXPOSE,ENV等指令嗜桌。

# 基礎(chǔ)鏡像

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

FROM nginx:latest

?

# 維護者信息

MAINTAINER <author>

MAINTAINER tangxbai@hotmail.com

?

# ENV × N ...

# 設(shè)置鏡像環(huán)境變量骨宠,僅在 Dockerfile 內(nèi)有效

ENV <key> <value>

ENV = ...

ENVLANG=C.UTF-8

?

# ARG × N ...

# 用于指定傳遞給構(gòu)建運行時的變量

ARG [=]

ARG site

ARGargName=defaultArgValue

?

# USER × N ...

# 指定運行容器時的用戶名或 UID层亿,后續(xù)的 RUN 也會使用指定用戶立美。使用USER指定用戶時,可以使用用戶名碌更、UID或GID洞慎,或是兩者的組合劲腿。當(dāng)服務(wù)不需要管理員權(quán)限時,可以通過該命令指定運行用戶快压。并且可以在之前創(chuàng)建所需要的用戶

USER <user>

USER <user>:<gid>

USER <user>:<group>

USER <uid>

USER <uid>:<gid>

USER <uid>:<group>

USER root

?

# 用于為鏡像添加元數(shù)據(jù)

LABEL = ...

LABELversion="1.0"description="Dockerfile"

?

# ONBUILD × N ...

# 當(dāng)所構(gòu)建的鏡像被用做其它鏡像的基礎(chǔ)鏡像蔫劣,該鏡像中的觸發(fā)器將會被觸發(fā)

ONBUILD [INSTRUCTION]

ONBUILD RUN /usr/local/bin/python-build--dir/app/src

?

# RUN × N ...

# 構(gòu)建鏡像執(zhí)行的命令

RUN <command>

RUN ["executable","param1","param2"]

RUNmkdir/path/to/workdir

?

# WORKDIR × N ...

# 設(shè)置工作目錄脉幢,類似于cd命令,后續(xù)所有操作都會基于此目錄進行操作

WORKDIR <path>

WORKDIR /path/to/workdir

?

# ADD × N ...

# 將本地文件添加到容器中沪曙,tar類型文件會自動解壓(網(wǎng)絡(luò)壓縮資源不會被解壓)液走,可以訪問網(wǎng)絡(luò)資源贾陷,類似wget

ADD <src>... <dest>

ADD ["<src>",..."<dest>"]# 用于支持包含空格的路徑

ADD target/project.jar /path/to/workdir

?

# COPY × N ...

# 功能類似ADD髓废,但是是不會自動解壓文件,也不能訪問網(wǎng)絡(luò)資源

COPY <src>... <dest>

COPY ["<src>",..."<dest>"]# 用于支持包含空格的路徑

COPY target/project.jar /path/to/workdir

?

# 用于將容器內(nèi)的目錄掛載到宿主機上

# 一個卷可以存在于一個或多個容器的指定目錄顶燕,該目錄可以繞過聯(lián)合文件系統(tǒng)涌攻,并具有以下功能:

# 1犯助、卷可以容器間共享和重用

# 2、容器并不一定要和其它容器共享卷

# 3、修改卷后會立即生效

# 4瞬哼、對卷的修改不會對鏡像產(chǎn)生影響

# 5坐慰、卷會一直存在结胀,直到?jīng)]有任何容器在使用它

VOLUME <path>

VOLUME /var/www /var/log/log1 /var/log/log2

?

# 指定于外界交互的端口

# 注:EXPOSE并不會讓容器的端口訪問到主機赞咙。要使其可訪問攀操,需要在docker run運行容器時通過-p來發(fā)布這些端口速和,或通過-P參數(shù)來發(fā)布EXPOSE導(dǎo)出的所有端口剥汤。

EXPOSE <port>/<protocol> ...

EXPOSE804438080

EXPOSE80/tcp8080/udp

?

# 配置容器吭敢,使其可執(zhí)行化,配合CMD可省去"application"痒留,只使用參數(shù)蠢沿。

# ENTRYPOINT與CMD非常類似,不同的是通過docker run執(zhí)行的命令不會覆蓋ENTRYPOINT恤磷,而docker run命令中指定的任何參數(shù)扫步,都會被當(dāng)做參數(shù)再次傳遞給ENTRYPOINT河胎。Dockerfile中只允許有一個ENTRYPOINT命令虎敦,多指定時會覆蓋前面的設(shè)置,而只執(zhí)行最后的ENTRYPOINT指令胚迫。

ENTRYPOINT ["executable","param1","param2"]

ENTRYPOINT command param1 param2

ENTRYPOINT java-jarproject.jar-Dspring.profiles.active=dev

?

# CMD × N ...

# 構(gòu)建容器后調(diào)用访锻,也就是在容器啟動時才進行執(zhí)行

# CMD不同于RUN期犬,CMD用于指定在容器啟動時所要執(zhí)行的命令龟虎,而RUN用于指定鏡像構(gòu)建時所要執(zhí)行的命令遣总。

CMD <command>

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD java-jarproject.jar

構(gòu)建命令

Dockerfile文件的存放目錄下,執(zhí)行構(gòu)建動作容达。以下示例花盐,通過目錄下的 Dockerfile 構(gòu)建一個 image:tag(鏡像名稱:鏡像標(biāo)簽)算芯。

docker build:用 Dockerfile 構(gòu)建鏡像的命令關(guān)鍵詞凳宙。

-t(target):指定鏡像名字

-f(file):顯示指定構(gòu)建鏡像的 Dockerfile 文件(Dockerfile 可不在當(dāng)前路徑下)

如果不使用 -f氏涩,則默認將上下文路徑下的名為 Dockerfile 的文件認為是構(gòu)建鏡像的 "Dockerfile"

".":當(dāng)前上下文路徑

上下文路徑,是指 docker 在構(gòu)建鏡像意系,有時候想要使用到本機的文件(比如復(fù)制)蛔添,docker build 命令得知這個路徑后兜辞,會將路徑下的所有內(nèi)容打包弦疮。

解析:由于 docker 的運行模式是 C/S胁塞。我們本機是 C编检,docker 引擎是 S扰才。實際的構(gòu)建過程是在 docker 引擎下完成的衩匣,所以這個時候無法用到我們本機的文件琅捏。這就需要把我們本機的指定目錄下的文件一起打包提供給 docker 引擎使用。

如果未說明最后一個參數(shù)蚀浆,那么默認上下文路徑就是 Dockerfile 所在的位置市俊。

注意:上下文路徑下不要放無用的文件摆昧,因為會一起打包發(fā)送給 docker 引擎绅你,如果文件過多會造成過程緩慢勇吊。

最后找了一張很形象的圖

■ docker-compose

Compose 是用于定義和運行多容器 Docker 應(yīng)用程序的工具。通過 Compose驹吮,您可以使用 YML 文件來配置應(yīng)用程序需要的所有服務(wù)碟狞。然后族沃,使用一個命令就可以從 YML 文件配置中創(chuàng)建并啟動所有服務(wù)。

Compose 使用的三個步驟:

使用 Dockerfile 定義應(yīng)用程序的環(huán)境沽一。

使用 docker-compose.yml 定義構(gòu)成應(yīng)用程序的服務(wù)铣缠,這樣它們可以在隔離環(huán)境中一起運行昆禽。

最后蝗蛙,執(zhí)行 docker-compose up 命令來啟動并運行整個應(yīng)用程序。

安裝插件

# 下載docker-compose插件

sudocurl-L"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)"-o/usr/local/bin/docker-compose

?

# 增加文件可執(zhí)行權(quán)限

sudochmod+x /usr/local/bin/docker-compose

?

# 創(chuàng)建軟連接醉鳖,以至于可以直接使用在任何目錄使用docker-compose命令

sudoln-s/usr/local/bin/docker-compose /usr/bin/docker-compose

?

# 測試是否安裝成功

docker-compose--version

基礎(chǔ)命令

docker-compose version

docker-compose-f/start

?

# 顯示正在運行的進程

docker-composetop

?

docker-composestart

docker-composerestart

docker-composestop

docker-compose up-d

docker-compose down-v

注意:docker-compose.yaml必須和命令在同一目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捡硅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辐棒,更是在濱河造成了極大的恐慌病曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾根,死亡現(xiàn)場離奇詭異泰涂,居然都是意外死亡,警方通過查閱死者的電腦和手機辐怕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門逼蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人是牢,你說我怎么就攤上這事农曲⌒卧幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缘屹。 經(jīng)常有香客問我逻炊,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任敢茁,我火速辦了婚禮,結(jié)果婚禮上捧颅,老公的妹妹穿的比我還像新娘谭梗。我一直安慰自己,他們只是感情好闰蛔,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布蚤吹。 她就那樣靜靜地躺著,像睡著了一般扔罪。 火紅的嫁衣襯著肌膚如雪矗积。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天禁熏,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛甜橱,可吹牛的內(nèi)容都是我干的子檀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溢谤,失蹤者是張志新(化名)和其女友劉穎瞻坝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡斩祭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姐刁。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痘昌,死狀恐怖菲驴,靈堂內(nèi)的尸體忽然破棺而出巧涧,到底是詐尸還是另有隱情,我是刑警寧澤粮呢,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赶撰,受9級特大地震影響豪娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜健提,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一私痹、第九天 我趴在偏房一處隱蔽的房頂上張望暗膜。 院中可真熱鬧论衍,春花似錦炬丸、人聲如沸栽惶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膀估,卻和暖如春幔亥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背察纯。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工帕棉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饼记。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓香伴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親具则。 傳聞我的和親對象是個殘疾皇子即纲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355