Docker
是使用 GoLang
開發(fā)的開源容器引擎谤饭,可以方便的打包開發(fā)好的應(yīng)用标捺,然后分發(fā)到任意 linux
主機(jī)上。
與傳統(tǒng)的虛擬機(jī)相比擁有以下優(yōu)勢(shì):
-
高效的系統(tǒng)資源利用率
由于不需要進(jìn)行硬件虛擬和運(yùn)行完整的操作系統(tǒng)等額外開銷揉抵,無論是應(yīng)用執(zhí)行速度亡容、內(nèi)存損耗或者文件存儲(chǔ)速度,
Docker
都更加高效 -
更快的啟動(dòng)速度
Docker
容器應(yīng)用直接運(yùn)行與宿主內(nèi)核冤今,無需啟動(dòng)完整的操作系統(tǒng)闺兢,可以做到秒級(jí)啟動(dòng) -
一致的運(yùn)行環(huán)境
Docker
鏡像提供了除內(nèi)核外的完整運(yùn)行環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境的一致性 -
持續(xù)交付和部署
可以通過
Docker
鏡像來實(shí)現(xiàn)服務(wù)的持續(xù)交付戏罢、部署屋谭。使用Dockerfile
來構(gòu)建鏡像,使用持續(xù)集成系統(tǒng)進(jìn)行集成測(cè)試龟糕;使用鏡像結(jié)合持續(xù)部署系統(tǒng)進(jìn)行自動(dòng)部署 -
遷移輕松
只需要遷移鏡像及鏡像運(yùn)行的數(shù)據(jù)就可在其他主機(jī)或平臺(tái)運(yùn)行
-
易于維護(hù)和擴(kuò)展
由于使用鏡像進(jìn)行部署桐磁,使維護(hù)更為容易。由于支持在鏡像的基礎(chǔ)上進(jìn)行定制讲岁,使得擴(kuò)展變得更簡(jiǎn)單我擂。而官方也維護(hù)了一大批高質(zhì)量的鏡像,大大降低了鏡像的制作成本
基本概念
倉庫
Docker
提供了倉庫(Repository
)用于存放制作好的鏡像缓艳,方便使用者獲取校摩,在本地可通知配置多個(gè) Repository
。
-
拉取
可以使用命令來拉取鏡像:
docker pull [repo url>/]image name>
默認(rèn)的
repo url
是hub.docker.com
阶淘,拉取默認(rèn)倉庫中的鏡像時(shí)是不需要url
的衙吩。
如拉取debian
:docker pull debian
。 -
推送
我們也可將自己制作好的鏡像推送到倉庫溪窒,以便分發(fā)坤塞,使用命令:
docker push [<repo url>/]<image name>[:<image tag>>
-
搜索
使用
docker search
命令則可搜索默認(rèn)repo url
內(nèi)的鏡像。 -
鏡像加速
由于默認(rèn)
repo url
在國(guó)外霉猛,為了加快拉取速度尺锚,需要指定其為國(guó)內(nèi)的,向/etc/docker/daemon.json
中添加:{ "registry-mirrors": ["https://registry.docker-cn.com"] }
便可使用
Docker
在中國(guó)的鏡像加速站惜浅。對(duì)于企業(yè)用戶還可搭建自己的私有鏡像倉庫瘫辩,方便管理內(nèi)部鏡像。
鏡像
鏡像是經(jīng)過 Dockerfile
規(guī)則打包生成的, Dockerfile
文件了指明了鏡像的生成及運(yùn)行方式伐厌。
Dockerfile
這里簡(jiǎn)單介紹下 Dockerfile
中常用的命令:
-
FROM
指明基于那個(gè)鏡像承绸,通常是一個(gè)系統(tǒng)環(huán)境,如
debian
挣轨。在多階段(stage
)構(gòu)建中可使用FROM ... AS ...
來命令階段军熏,供后面的階段使用 -
ENV
設(shè)置鏡像的環(huán)境變量
-
EXPOSE
導(dǎo)出端口,語法:
EXPOSE port/protocol
-
RUN
執(zhí)行一條命令
-
COPY
復(fù)制鏡像內(nèi)部的文件卷扮,也可從指定
stage
中復(fù)制文件荡澎,使用--from=<stage name>
來實(shí)現(xiàn) -
ADD
復(fù)制本地文件到鏡像中,并做了一些額外工作晤锹,如自動(dòng)解壓文件摩幔、保持文件屬性等
-
WORKDIR
切換工作目錄
-
CMD
執(zhí)行命令,極容易在
docker run
時(shí)被覆蓋鞭铆。主要用于指定鏡像的默認(rèn)啟動(dòng)命令或衡,有以下三種語法:-
CMD ["executable", "param1", "param2"]
Exec
模式,首先 -
CMD ["param1", "param2"]
設(shè)置ENTRYPOINT
的默認(rèn)參數(shù) -
CMD command param1 param2
Shell
模式
-
-
ENTRYPOINT
指定鏡像默認(rèn)的運(yùn)行命令车遂,可以使用
--entrypoint
參數(shù)在docker run
時(shí)覆蓋Dockerfile
內(nèi)的ENTRYPOINT
有
Exec
和Shell
兩種模式通常使用這個(gè)命令來指定鏡像的啟動(dòng)命令封断,因?yàn)?
CMD
稍不注意就被覆蓋了
更多關(guān)于 Dockerfile
內(nèi)容請(qǐng)參見: Dockerfile reference
這里給出一個(gè)簡(jiǎn)單的 Dockerfile=, 是 =debian sid
的:
FROM scratch
ADD rootfs.tar.xz /
CMD ["bash"]
創(chuàng)建
使用 docker build -f <Dockerfile path> [-t <image name>[:<tag>]] .
創(chuàng)建鏡像和標(biāo)記 Tag
Tag
可用來標(biāo)記不同的鏡像版本舶担,就像版本號(hào)坡疼。
列出
使用 docker image ls
可以列出下載下來的鏡像
運(yùn)行
使用 docker run
命令運(yùn)行鏡像,可使用參數(shù)配置柄沮,下面給出一個(gè)例子:
docker run -it -d -p <local port>:<container port> -v <local path>:<container path> <image>
-
-i
是交互式操作 -
-t
是終端 -
-p
指定端口映射 -
-v
指定volume
映射 -
-d
后臺(tái)模式
刪除
使用 docker image rm <image id>
刪除鏡像
導(dǎo)入和導(dǎo)出
- 導(dǎo)出:
docker save <image id> > <image save>.tar
- 導(dǎo)入:
docker load < <image save>.tar
容器
容器是鏡像運(yùn)行后的實(shí)體回梧,運(yùn)行與屬于自己的獨(dú)立的命名空間废岂。
創(chuàng)建
使用 docker run
命令啟動(dòng)鏡像就可以創(chuàng)建一個(gè)容器
列出
使用 docker ps
可列出正在運(yùn)行的容器祖搓,加上 -a
參數(shù)可列出所以存在的容器
控制
-
啟動(dòng)
使用
docker container start <containe id>
啟動(dòng)容器 -
終止
使用
docker container stop <containe id>
終止容器 -
暫停
dcoker container pause <containe id>
-
重啟
dcoker container restart <containe id>
-
日志
dcoker container logs <containe id>
刪除
docker container rm <container id>
命令可刪除容器
進(jìn)入容器
使用 docker exec -it <container id> /bin/sh
命令可進(jìn)入容器的執(zhí)行環(huán)境
導(dǎo)入和導(dǎo)出
- 導(dǎo)入:
docker import <container export>.tar <container name>
- 導(dǎo)出:
docker export <container id> > <container export>.tar
部署
直接運(yùn)行鏡像不便于部署服務(wù),因而官方推出了 Docker Compose
來負(fù)責(zé)應(yīng)用部署湖苞。
使用 docker-compose.yml
文件將應(yīng)用需要的鏡像都定義在一起拯欧,然后使用 docker-compose
命令來部署。
docker-compose.yml
的語法詳見: Compose file version 3 reference财骨,這里給出一份部署 wordpress
的文件:
version: "3.7"
services:
wordpress:
image: wordpress
ports:
- "8080:80"
networks:
- backend
mysql:
image: mysql
volumes:
- db-data:/var/lib/mysql/data
networks:
- backend
volumes:
db-data:
networks:
backend:
常用命令
-
up
啟動(dòng)服務(wù)镐作,加上
-d
表示在后端運(yùn)行 -
down
終止服務(wù)
-
build
構(gòu)建服務(wù)中的容器
-
config
驗(yàn)證文件格式是否有誤
-
exec
進(jìn)入指定的容器,如進(jìn)入上面
wordpress
中的mysql
則是:docker-compose exec mysql
-
logs
顯示日志隆箩,可指定容器
-
restart
重啟服務(wù)
更多命令請(qǐng)見: Overview of docker-compose CLI