摘要:Docker
認(rèn)識(shí)Docker
(1)虛擬化技術(shù)
虛擬化技術(shù)是一種將服務(wù)器硬件資源進(jìn)行共享的手段,隨著計(jì)算機(jī)各種硬件資源如磁盤(pán)蔑祟,內(nèi)存趁耗,CPU,網(wǎng)卡速率等長(zhǎng)足發(fā)展疆虚,某臺(tái)計(jì)算機(jī)的計(jì)算資源可能得不到充分的利用造成浪費(fèi)苛败,虛擬化技術(shù)就是將這些資源當(dāng)作資源池進(jìn)行重新分配满葛,提供給其他虛擬計(jì)算機(jī)。
傳統(tǒng)的虛擬化技術(shù)會(huì)虛擬出一套完整的硬件基礎(chǔ)設(shè)施罢屈,包括CPU嘀韧,內(nèi)存,顯卡缠捌,磁盤(pán)等锄贷,所有虛擬機(jī)是互相隔離的,如同多臺(tái)物理機(jī)一樣曼月。
(2)容器技術(shù)
容器技術(shù)屬于虛擬化的方式之一谊却,他是一種輕量級(jí)的虛擬化方案,可以讓用戶(hù)在一個(gè)資源隔離的進(jìn)程中允許程序哑芹。
容器和虛擬機(jī)都是虛擬化技術(shù)炎辨,兩者都能提供應(yīng)用封裝和資源隔離,主要區(qū)別如下
虛擬機(jī) | 容器 | |
---|---|---|
隔離方式 | 進(jìn)程級(jí)別隔離聪姿,輕度隔離 | 操作系統(tǒng)級(jí)別隔離碴萧,完全隔離 |
空間占用 | GB | MB |
啟動(dòng)速度 | 分鐘 | 秒 |
遷移速度 | 困難 | 容易 |
docker是一種容器技術(shù)
鏡像和容器
- 鏡像是類(lèi)class,容器是實(shí)例化的類(lèi)末购,鏡像是文件破喻,容器是進(jìn)程
- 先有鏡像后有容器,一個(gè)鏡像可以啟動(dòng)多個(gè)容器
- 一旦容器從鏡像被啟動(dòng)招盲,二者編程互相依賴(lài)的關(guān)系低缩,在鏡像上啟動(dòng)的容器沒(méi)有停止之前嘉冒,鏡像無(wú)法被刪除
- 鏡像采用分層結(jié)構(gòu)曹货,最底層是base層操作系統(tǒng)層,層層疊加形成完成的鏡像讳推,目的是實(shí)現(xiàn)層和資源共享
鏡像搜索
Docker鏡像存儲(chǔ)在鏡像倉(cāng)庫(kù)服務(wù)中顶籽,默認(rèn)使用Docker Hub,Docker Hub分為官方倉(cāng)庫(kù)和非官方倉(cāng)庫(kù)银觅,官方倉(cāng)庫(kù)會(huì)經(jīng)過(guò)Docker公司的審核并且及時(shí)更新礼饱,安全質(zhì)量高,非官方的倉(cāng)庫(kù)來(lái)自于江湖俠客究驴,其中也不乏優(yōu)秀的鏡像镊绪,使用docker search
來(lái)搜索鏡像
root@ubuntu:/var/lib/docker# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10995 [OK]
mariadb MariaDB Server is a high performing open sou… 4164 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 815 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 88
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 86
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
bitnami/mysql Bitnami MySQL Docker Image 52 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 44
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
prom/mysqld-exporter 39 [OK]
tutum/mysql Base docker image to run a MySQL database se… 35
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 30
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 29 [OK]
centos/mysql-56-centos7 MySQL 5.6 SQL database server 20
circleci/mysql MySQL is a widely used, open-source relation… 20
mysql/mysql-router MySQL Router provides transparent routing be… 19
arey/mysql-client Run a MySQL client from a docker container 17 [OK]
fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 13 [OK]
yloeffler/mysql-backup This image runs mysqldump to backup data usi… 7 [OK]
genschsa/mysql-employees MySQL Employee Sample Database 7 [OK]
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici… 3
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK]
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 1 [OK]
jelastic/mysql An image of the MySQL database server mainta… 1
對(duì)以上命令和返回結(jié)果做幾點(diǎn)說(shuō)明
-
search
:會(huì)對(duì)Docker倉(cāng)庫(kù)服務(wù)進(jìn)行檢索,檢索其中NAME
和DESCRIPTION
相關(guān)含有mysql內(nèi)容的鏡像 -
NAME
:倉(cāng)庫(kù)名稱(chēng)洒忧,如果是官方倉(cāng)庫(kù)就直接是倉(cāng)庫(kù)名稱(chēng)蝴韭,如果是非官方倉(cāng)庫(kù),倉(cāng)庫(kù)名稱(chēng)帶有/
熙侍,代表機(jī)構(gòu)名或者組織機(jī)構(gòu)名/倉(cāng)庫(kù)名
-
DESCRIPTION
:鏡像描述 -
STARS
:用戶(hù)喜歡程度 -
OFFICIAL
:是否是官方倉(cāng)庫(kù)榄鉴,OK的話就是官方倉(cāng)庫(kù)履磨,和NAME中是否帶有/
是一致的 -
AUTOMATED
:Dockerfile是否是公開(kāi)的可供自由查看
docker默認(rèn)輸出25行,使用--limit
參數(shù)可以指定輸出的行數(shù)庆尘,可以給search命令增加過(guò)濾條件剃诅,使用--filter
獲得官方倉(cāng)庫(kù)
root@ubuntu:/var/lib/docker# docker search mysql --filter "is-official=true"
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10995 [OK]
mariadb MariaDB Server is a high performing open sou… 4164 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 240 [OK]
鏡像下載、查看驶忌、刪除
從Docker鏡像倉(cāng)庫(kù)服務(wù)中拉取鏡像使用命令docker pull
矛辕,指定倉(cāng)庫(kù)名稱(chēng)
和標(biāo)簽
即可找到指定的鏡像,命令格式是
docker image pull <repository>:<tag>
如果不指定tag付魔,默認(rèn)拉取latest標(biāo)簽的鏡像如筛,如果要拉取指定tag版本的鏡像,需要登錄docker hub進(jìn)行查找
https://hub.docker.com抒抬,比如查看docker上支持的MySQL版本杨刨,有8.0.25,8.0等
- 非官方的鏡像鏡像倉(cāng)庫(kù)需要指定機(jī)構(gòu)組織名/倉(cāng)庫(kù)名擦剑,比如
tiangolo/uvicorn-gunicorn-fastapi
以mysql為例妖胀,分別指定tag鏡像標(biāo)簽和不指定,使用docker images
查看本地倉(cāng)庫(kù)存儲(chǔ)的鏡像
root@ubuntu:/var/lib/docker# docker pull mysql
root@ubuntu:/var/lib/docker# docker pull mysql:5.7
root@ubuntu:/var/lib/docker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 2c9028880e58 4 weeks ago 447MB
mysql latest c0cdc95609f1 4 weeks ago 556MB
刪除鏡像使用docker rmi
惠勒,指定鏡像名稱(chēng)或者鏡像ID赚抡,當(dāng)存在此鏡像啟動(dòng)的容器正在運(yùn)行或者此鏡像是其他鏡像所依賴(lài)的鏡像時(shí),不能直接刪除
root@ubuntu:/var/lib/docker# docker rmi 2c9028880e58
Untagged: mysql:5.7
Untagged: mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Deleted: sha256:2c9028880e5814e8923c278d7e2059f9066d56608a21cd3f83a01e3337bacd68
Deleted: sha256:c49c5c776f1bc87cdfff451ef39ce16a1ef45829e10203f4d9a153a6889ec15e
Deleted: sha256:8345316eca77700e62470611446529113579712a787d356e5c8656a41c244aee
Deleted: sha256:8ae51b87111404bd3e3bde4115ea2fe3fd2bb2cf67158460423c361a24df156b
Deleted: sha256:9d5afda6f6dcf8dd59aef5c02099f1d3b3b0c9ae4f2bb7a61627613e8cdfe562
鏡像命令整理
-
docker search
:去鏡像倉(cāng)庫(kù)服務(wù)搜索鏡像 -
docker images
:顯示本地倉(cāng)庫(kù)已有的鏡像 -
docker pull
:從鏡像倉(cāng)庫(kù)服務(wù)拉取鏡像到本地倉(cāng)庫(kù) -
docker rmi
:從本地鏡像服務(wù)刪除鏡像
Dockerfile基礎(chǔ)
Dockerfile是一個(gè)Docker鏡像的描述文件
纠屋,包含了若干個(gè)命令行涂臣,支持以#
進(jìn)行注釋?zhuān)慕Y(jié)構(gòu)分為基礎(chǔ)鏡像層
,維護(hù)者
售担,操作指令
和容器啟動(dòng)后指令
赁遗,以一個(gè)簡(jiǎn)單的Dockerfile為例
# 基礎(chǔ)鏡像
FROM python:3.7
# 維護(hù)者
MAINTAINER gp
# 指定環(huán)境變量
ENV PIPURL "https://pypi.tuna.tsinghua.edu.cn/simple"
# 操作命令
ADD ./requirements.txt /home/
WORKDIR /home
RUN pip install --no-cache-dir -i ${PIPURL} --default-timeout=1000 -r requirements.txt
# 容器啟動(dòng)后指令
CMD gunicorn -c gun.conf.py manage:app
下面對(duì)Dockerfile的常用關(guān)鍵字進(jìn)行總結(jié):
-
FROM
:礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的 -
MAINTAINER
:鏡像維護(hù)者的姓名和郵箱地址 -
RUN
:容器構(gòu)建時(shí)
需要運(yùn)行的命令族铆,可以執(zhí)行多個(gè)命令岩四,多個(gè)命令用&&
隔開(kāi) -
EXPOSE
:當(dāng)前容器對(duì)外暴露的端口號(hào),實(shí)際沒(méi)什么用 -
WORKDIR
:指定在容器創(chuàng)建后哥攘,終端默認(rèn)登錄進(jìn)來(lái)工作目錄
剖煌,一個(gè)落腳點(diǎn),可以多次指定逝淹,相當(dāng)于cd
命令 -
ENV
:用來(lái)在構(gòu)建鏡像過(guò)程中設(shè)置環(huán)境變量耕姊,在下文中使用${profile}
調(diào)用 -
ADD
:將宿主機(jī)目錄下的文件拷貝到鏡像里面,宿主機(jī)路徑->鏡像路徑
栅葡,在構(gòu)建鏡像的過(guò)程中完成的茉兰,ADD指令還支持通過(guò)URL從遠(yuǎn)程服務(wù)器讀取資源并復(fù)制到鏡像中 -
COPY
:將宿主機(jī)目錄下的文件拷貝到鏡像里面,宿主機(jī)路徑->鏡像路徑
妥畏,它只是拷貝邦邦,不會(huì)自動(dòng)處理URL和解壓tar壓縮包安吁,在構(gòu)建鏡像的過(guò)程中完成的,滿足同等功能的情況下燃辖,推薦使用COPY指令 -
CMD
:指定一個(gè)容器啟動(dòng)時(shí)
要運(yùn)行的命令鬼店。dockerfile中可以有多個(gè)CMD指令,但只有最后一個(gè)生效黔龟,是容器啟動(dòng)后的命令妇智,如果docker run指定了運(yùn)行命令會(huì)被覆蓋,支持Shell和exec模式 -
ENTRYPOINT
:指定一個(gè)容器啟動(dòng)時(shí)
要運(yùn)行的命令氏身,容器啟動(dòng)后的命令巍棱,如果docker run指定了運(yùn)行命令不會(huì)被覆蓋,支持Shell和exec模式
其中CMD和ENTRYPOINT支持shell和exec模式蛋欣,在Dockerfile中可以做如下改寫(xiě)
CMD ["gunicorn", "-c", "gun.conf.py", "manage:app"]
RUN中多個(gè)命令用&&隔開(kāi)航徙,可以在Dockerfile中做如下改寫(xiě)
RUN pip install flask==1.1.1 \
&& pip install Flask-SQLAlchemy==2.4.4 \
&& pip install gevent==20.9.0 \
&& pip install gunicorn==20.0.4 \
&& pip install numpy==1.19.5 \
&& pip install pymysql==1.0.0 \
&& pip install SQLAlchemy==1.3.13 \
&& pip install python-dotenv==0.15.0 \
&& pip install Flask-Caching==1.9.0
使用Dockerfile構(gòu)建鏡像
使用Dockerfile構(gòu)建鏡像使用docker build
命令,啟動(dòng)如下
root@ubuntu:~/myproject/pira_score_web_application# docker build -t gp/pira_score:v1 .
docker build中最后的.
代表當(dāng)前目錄陷虎,通常把Dockerfile放在執(zhí)行docker build的當(dāng)前目錄下到踏,其他主要參數(shù)如下
-
-t
:--tag, -t: 鏡像的名字及標(biāo)簽,本例中設(shè)置了gp/pira_score名稱(chēng)和v1標(biāo)簽 -
-f
:指定要使用的Dockerfile路徑
構(gòu)建完成后查看docker本地鏡像倉(cāng)庫(kù)
root@ubuntu:~/myproject/pira_score_web_application# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gp/pira_score v1 d3f18f8689fb 14 minutes ago 976MB
鏡像的導(dǎo)入導(dǎo)出
鏡像的導(dǎo)出使用docker save
命令尚猿,例如
root@ubuntu:~# docker save echo_test:v1 > echo_test_v1.tar
注意save指定的鏡像指定為鏡像名+標(biāo)簽窝稿,否則load導(dǎo)入時(shí)鏡像名為<none>,下一步在當(dāng)下目錄下生成鏡像tar文件凿掂,scp到另一臺(tái)機(jī)器上的docker服務(wù)上再load進(jìn)去則會(huì)自動(dòng)導(dǎo)入一個(gè)名稱(chēng)和標(biāo)簽一樣的鏡像
root@ubuntu:~# scp echo_test_v1.tar root@cloudera01:/home/gp
[root@cloudera01]# docker load < echo_test_v1.tar
Loaded image: echo_test:v1