Docker:入門(mén)和使用和制作鏡像(Dockerfile)

摘要: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)行檢索,檢索其中NAMEDESCRIPTION相關(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伴榔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庄萎,更是在濱河造成了極大的恐慌踪少,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨恭,死亡現(xiàn)場(chǎng)離奇詭異秉馏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脱羡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)免都,“玉大人锉罐,你說(shuō)我怎么就攤上這事∪颇铮” “怎么了脓规?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)险领。 經(jīng)常有香客問(wèn)我侨舆,道長(zhǎng)秒紧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任挨下,我火速辦了婚禮熔恢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臭笆。我一直安慰自己叙淌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布愁铺。 她就那樣靜靜地躺著鹰霍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茵乱。 梳的紋絲不亂的頭發(fā)上茂洒,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瓶竭,去河邊找鬼获黔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛在验,可吹牛的內(nèi)容都是我干的玷氏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腋舌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盏触!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起块饺,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赞辩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后授艰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辨嗽,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年淮腾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糟需。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谷朝,死狀恐怖洲押,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圆凰,我是刑警寧澤杈帐,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響挑童,放射性物質(zhì)發(fā)生泄漏累铅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一站叼、第九天 我趴在偏房一處隱蔽的房頂上張望娃兽。 院中可真熱鬧,春花似錦大年、人聲如沸换薄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轻要。三九已至,卻和暖如春垦缅,著一層夾襖步出監(jiān)牢的瞬間冲泥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工壁涎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凡恍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓怔球,卻偏偏與公主長(zhǎng)得像嚼酝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竟坛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容