■ 簡介
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必須和命令在同一目錄