一篇文章弄懂Docker鏡像的制作、上傳、拉取和部署
一、鏡像(images)
1. 什么是鏡像?
(1)按照百度百科的解釋?zhuān)虹R像(Mirroring)是一種文件存儲(chǔ)形式,是冗余的一種類(lèi)型,一個(gè)磁盤(pán)上的數(shù)據(jù)在另一個(gè)磁盤(pán)上存在一個(gè)完全相同的副本即為鏡像。
(2)可以把許多文件做成一個(gè)鏡像文件,與GHOST等程序放在一個(gè)盤(pán)里用GHOST等軟件打開(kāi)后,又恢復(fù)成許多文件,RAID 1和RAID 10使用的就是鏡像。
(3)常見(jiàn)的鏡像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。
看完之后是不是更暈了?
其實(shí)簡(jiǎn)單來(lái)說(shuō),鏡像就是是一個(gè)app的封裝,里面有程序代碼,基礎(chǔ)系統(tǒng),依賴庫(kù),工具。
再通俗地講,有點(diǎn)類(lèi)似APP 的安裝包。
2. 鏡像的組成和用途
(1)Dockerfile
: 是制作鏡像的文件的配方
就像一種祖?zhèn)髅胤剑?云南白藥: 林芝,人參,鹿茸,三七等
(2)scratch
: 是最基礎(chǔ)的docker鏡像,相當(dāng)于一個(gè)地基—》空白的鏡像,什么都沒(méi)有 --》白手起家
用別的鏡像做基礎(chǔ)鏡像: 其他鏡像可以之為基礎(chǔ)進(jìn)行擴(kuò)展–就像站在巨人的肩膀上。
但是我們需要,萬(wàn)丈高樓平地起,一步一個(gè)腳印👣去制作鏡像
(3)一個(gè)完整的操作系統(tǒng)需要:
1.kernel
2.系統(tǒng)調(diào)用
3.應(yīng)用程序、庫(kù)
4.shell等
bootfs --》容器啟動(dòng)的時(shí)候需要的內(nèi)容
rootfs --》容器內(nèi)部的操作系統(tǒng)
docker save
docker export
原理:
容器啟動(dòng)的時(shí)候,內(nèi)核啟動(dòng)bootfs后直接將基礎(chǔ)鏡像加載,然后一層一層的加載–》自下而上
容器運(yùn)行后訪問(wèn)文件的時(shí)候,從上而下,從可寫(xiě)層,一層一層往下訪問(wèn)。
3. 為什么要自己制作鏡像?
以前在Linux 中下載mysql,Centos 系統(tǒng)中需要使用yum 命令,在學(xué)習(xí)完doker技術(shù)以后,需要什么軟件,只需要在docker 上面pull 就可以得到,docker 就像是一個(gè)巨大的資源庫(kù),只有你想不到的東西,沒(méi)有它沒(méi)有的東西。
有些同學(xué)說(shuō):是技術(shù)限制了我對(duì) docker 的想象,流下了悔恨的淚水。
哪有些同學(xué)就說(shuō)了,那既然docker 這么方便,上面有那么多的鏡像文件,為什么還需要我們自己去制作呢?需要啥 pull 啥不就可以了嘛?
但是,在公司中往往需要自己制作鏡像文件,因?yàn)閯e人制作的東西往往會(huì)不放心,或者某些特定的需求不能滿足。就像你去買(mǎi)茅臺(tái)酒,商家說(shuō)這是十年的茅臺(tái),你就信他?這就是十年的茅臺(tái)?不去鑒定一下?如果是土豪,就當(dāng)我沒(méi)說(shuō),哈哈啊哈
二、鏡像制作的步驟(10步法)
第1步:編輯Dockerfile
[root@sc-docker-server ~]# mkdir /mydocker/ [root@sc-docker-server ~]# cd /mydocker/ [root@sc-docker-server mydocker]# [root@sc-docker-server mydocker]# vim Dockerfile FROM python:2.7-slim WORKDIR /app ADD . /app RUN pip install --trusted-host pypi.python.org -r requirements.txt EXPOSE 80 ENV NAME World ENV AUTHOR cali CMD ["python","app.py"]
第2步:編輯requirements.txt文件
[root@sc-docker-server mydocker]# vim requirements.txt Flask Redis
第3步:編輯app.py文件,我們的程序文件
[root@sc-docker-server mydocker]# vim app.py from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
第4步:生成鏡像文件
[root@sc-docker-server mydocker]#docker build -t sc_friendlyhello_1 . docker build -t sc_friendlyhello_1 . Sending build context to Docker daemon 4.608kB Step 1/9 : FROM python:2.7-slim ---> eeb27ee6b893 Step 2/9 : WORKDIR /app ---> Using cache ---> 81aa71984f63 Step 3/9 : ADD . /app ---> Using cache ---> a5c7c6ed471c Step 4/9 : VOLUME ["/data_flask"] ---> Using cache ---> d4db66a741db Step 5/9 : RUN pip install --trusted-host pypi.python.org -r requirements.txt ---> Using cache ---> bcdee009e5f7 Step 6/9 : EXPOSE 80 ---> Using cache ---> 475474ce55ff Step 7/9 : ENV NAME World ---> Using cache ---> 0f03ead6c99b Step 8/9 : ENV AUTHOR cali ---> Using cache ---> f844eb0f1a78 Step 9/9 : CMD ["python","app.py"] ---> Using cache ---> ab30484b56b8 Successfully built ab30484b56b8 Successfully tagged sc_friendlyhello_1:latest [root@sc-docker-server mydocker]#
第5步:檢查鏡像是否成功
[root@sc-docker-server mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE sc_friendlyhello_1 latest ab30484b56b8 32 minutes ago 159MB
第6步:使用鏡像,啟動(dòng)容器
docker run -d -p 5080:80 --name sc-hello-1 sc_friendlyhello_1
第7步:訪問(wèn)容器的web服務(wù)
curl或者chrome瀏覽器訪問(wèn) 宿主機(jī)ip:5080
Hello World! Hostname: f4aeb5d5305a Visits: cannot connect to Redis, counter disabled
因?yàn)閞edis數(shù)據(jù)庫(kù)容器沒(méi)有啟動(dòng),flask web服務(wù)不能連接到redis數(shù)據(jù)庫(kù)
第8步:?jiǎn)?dòng)redis容器
docker run -d -p 6379:6379 --name sc-redis-1 redis
第9步:再次啟動(dòng)一個(gè)自己制作鏡像的容器,鏈接到redis容器
docker run -d --name sc-hello-2 -p 5081:80 --link sc-redis-1:redis sc_friendlyhello_1
第10步:訪問(wèn)容器的web服務(wù)
curl或者chrome瀏覽器訪問(wèn) 宿主機(jī)ip:5081
Hello World! Hostname: aad7da1892b5 Visits: 15
三. 鏡像制作的作業(yè)
作業(yè)
1.升級(jí) sc_friendlyhello_1的鏡像里的基礎(chǔ)鏡像為python:3.9
自己的鏡像更名為sc_friendlyhello_2
2.啟動(dòng)容器和redis容器,測(cè)試訪問(wèn)**
作業(yè)步驟:
安裝上傳的文件
root@sc-docker-server ~]# yum install lrzsz -y 安裝上傳的軟件 上次元數(shù)據(jù)過(guò)期檢查:0:25:32 前,執(zhí)行于 2021年08月18日 星期三 09時(shí)52分02秒。 軟件包 lrzsz-0.12.20-43.el8.x86_64 已安裝。 依賴關(guān)系解決。 無(wú)需任何處理。 完畢! [root@sc-docker-server ~]#
第1步:下載app源代碼
https://github.com/docker/getting-started 在windows里下載,然后上傳到linux里 yum install git -y linux里: git clone https://github.com/califeng/getting-started.git
第2步:解壓app源代碼壓縮包
[root@sc-docker-server ~]# yum install zip unzip -y [root@sc-docker-1 ~]# unzip getting-started-master.zip
第3步:進(jìn)入app目錄,去新建一個(gè)Dockerfile
[root@sc-docker-1 getting-started-master]# cd app/ [root@sc-docker-1 app]# vim Dockerfile FROM node:12-alpine WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"]
第4步:制作鏡像
[root@sc-docker-1 app]# docker build -t getting-started . -t getting-started 是指定制作的鏡像的名字,名字可以自己定義 [root@sc-docker-1 app]# docker images 查看制作的鏡像 REPOSITORY TAG IMAGE ID CREATED SIZE getting-started latest 5b903e857b8c 25 seconds ago 179MB redis latest cc69ae189a1a 2 days ago 105MB nginx 1.19.7 35c43ace9216 7 days ago 133MB nginx latest 35c43ace9216 7 days ago 133MB mysql 5.7.33 5f47254ca581 2 weeks ago 449MB nginx 1.19.6 f6d0b4767a6c 6 weeks ago 133MB node 12-alpine 0206ff8a5f9e 7 weeks ago 88.9MB richarvey/nginx-php-fpm latest 5c3ad1891297 5 months ago 506MB hello-world latest bf756fb1ae65 13 months ago 13.3kB jcdemo/flaskapp latest 4f7a2cc79052 2 years ago 88.7MB [root@sc-docker-1 app]#
第5步:?jiǎn)?dòng)自己制作的鏡像的容器
[root@sc-docker-1 app]# docker run -dp 3000:3000 getting-started 8f150a72e7d2d1650685b00a18d237469fa07c8cd56977773dd266b281a3b4ad [root@sc-docker-1 app]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8f150a72e7d2 getting-started "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 0.0.0.0:3000->3000/tcp strange_benz deabb58e01b0 nginx "/docker-entrypoint.…" 26 hours ago Up 2 hours 0.0.0.0:6655->80/tcp chenpeng [root@sc-docker-1 app]#
第6步:打開(kāi)瀏覽器去訪問(wèn)容器里的網(wǎng)站
容器里的網(wǎng)站:http://192.168.0.161:3000/
總結(jié)
1.鏡像的制作是作為docker 技術(shù)中必備的技能,你說(shuō)你會(huì)docker ,別人一定會(huì)問(wèn)你鏡像的制作嗎?你說(shuō)制作那玩意干啥,別人就會(huì)會(huì)心一笑,心里一想這個(gè)人的技術(shù)一定很low,連這個(gè)都不會(huì),還說(shuō)自己會(huì)docker,呵呵。
2.后面有關(guān)鏡像制作有詳細(xì)的步驟,鏡像制作十步法會(huì)教你怎么去做的,慢慢來(lái),一步一步來(lái)做。
到此這篇關(guān)于Docker鏡像制作、上傳、拉取和部署的文章就介紹到這了,更多相關(guān)Docker鏡像制作、上傳、拉取和部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NETCore Docker實(shí)現(xiàn)容器化與私有鏡像倉(cāng)庫(kù)管理
Docker是用Go語(yǔ)言編寫(xiě)基于Linux操作系統(tǒng)的一些特性開(kāi)發(fā)的,其提供了操作系統(tǒng)級(jí)別的抽象,是一種容器管理技術(shù),它隔離了應(yīng)用程序?qū)A(chǔ)架構(gòu)(操作系統(tǒng)等)的依賴。這篇文章主要介紹了.NETCore Docker實(shí)現(xiàn)容器化與私有鏡像倉(cāng)庫(kù)管理,需要的朋友可以參考下2019-08-08Docker安裝部署分布式數(shù)據(jù)庫(kù)?OceanBase的詳細(xì)過(guò)程
這篇文章主要介紹了Docker安裝部署分布式數(shù)據(jù)庫(kù)?OceanBase,快速的體驗(yàn) OceanBase 的自動(dòng)化部署過(guò)程,及了解 OceanBase 集群安裝成功后的目錄特點(diǎn)和使用方法,需要的朋友可以參考下2022-06-06Docker 創(chuàng)建容器后再修改 hostname的詳細(xì)過(guò)程
這篇文章主要介紹了Docker 創(chuàng)建容器后再修改 hostname的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10Docker Buildx 簡(jiǎn)介與安裝指南(最新推薦)
Docker Buildx 是 Docker 官方推出的一款增強(qiáng)型構(gòu)建工具,旨在簡(jiǎn)化和優(yōu)化多架構(gòu)容器映像的構(gòu)建流程,這篇文章主要介紹了Docker Buildx 簡(jiǎn)介與安裝指南,需要的朋友可以參考下2024-08-08分享Ubuntu19無(wú)法安裝docker源問(wèn)題
這篇文章主要介紹了Ubuntu19無(wú)法安裝docker源問(wèn)題,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11更改Docker默認(rèn)數(shù)據(jù)目錄解決部署空間不足問(wèn)題
隨著使用 Docker 的時(shí)間增加,存儲(chǔ)在默認(rèn)數(shù)據(jù)目錄(通常是 /var/lib/docker)中的數(shù)據(jù)量也會(huì)不斷增大,最終可能導(dǎo)致服務(wù)器上的存儲(chǔ)空間不足,這篇文章將詳細(xì)介紹如何更改 Docker 的默認(rèn)數(shù)據(jù)目錄,以便在服務(wù)器上釋放存儲(chǔ)空間并優(yōu)化資源利用,需要的朋友可以參考下2024-06-06Docker快速搭建PHP+Nginx+Mysql環(huán)境及踩坑
本文主要介紹了Docker快速搭建PHP+Nginx+Mysql環(huán)境及踩坑 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Docker創(chuàng)建鏡像、怎么修改、上傳鏡像等詳細(xì)介紹
這篇文章主要介紹了Docker創(chuàng)建鏡像、怎么修改、上傳鏡像等詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12Docker安裝logstash的詳細(xì)過(guò)程
這篇文章主要介紹了Docker安裝logstash的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09docker容器環(huán)境安裝及鏡像基礎(chǔ)操作
容器是一種輕量級(jí)虛擬化技術(shù),能夠快速構(gòu)建業(yè)務(wù)環(huán)境并便于業(yè)務(wù)遷移,解決兼容性問(wèn)題,這篇文章主要介紹了docker容器環(huán)境安裝及鏡像基礎(chǔ)操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09