目錄
- 一、鏡像(images)
- 1. 什么是鏡像?
- 2. 鏡像的組成和用途
- (1)Dockerfile
- (2)scratch
- (3)一個完整的操作系統(tǒng)需要:
- 3. 為什么要自己制作鏡像?
- 二、鏡像制作的步驟(10步法)
- 第1步:編輯Dockerfile
- 第2步:編輯requirements.txt文件
- 第3步:編輯app.py文件,我們的程序文件
- 第4步:生成鏡像文件
- 第5步:檢查鏡像是否成功
- 第6步:使用鏡像,啟動容器
- 第7步:訪問容器的web服務
- 第8步:啟動redis容器
- 第9步:再次啟動一個自己制作鏡像的容器,鏈接到redis容器
- 第10步:訪問容器的web服務
- 三. 鏡像制作的作業(yè)
- 總結
一、鏡像(images)
1. 什么是鏡像?
(1)按照百度百科的解釋:鏡像(Mirroring)是一種文件存儲形式,是冗余的一種類型,一個磁盤上的數(shù)據(jù)在另一個磁盤上存在一個完全相同的副本即為鏡像。
(2)可以把許多文件做成一個鏡像文件,與GHOST等程序放在一個盤里用GHOST等軟件打開后,又恢復成許多文件,RAID 1和RAID 10使用的就是鏡像。
(3)常見的鏡像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。
看完之后是不是更暈了?
其實簡單來說,鏡像就是是一個app的封裝,里面有程序代碼,基礎系統(tǒng),依賴庫,工具。
再通俗地講,有點類似APP 的安裝包。
2. 鏡像的組成和用途
(1)Dockerfile
: 是制作鏡像的文件的配方
就像一種祖?zhèn)髅胤剑?云南白藥: 林芝,人參,鹿茸,三七等
(2)scratch
: 是最基礎的docker鏡像,相當于一個地基—》空白的鏡像,什么都沒有 --》白手起家
用別的鏡像做基礎鏡像: 其他鏡像可以之為基礎進行擴展–就像站在巨人的肩膀上。
但是我們需要,萬丈高樓平地起,一步一個腳印👣去制作鏡像
(3)一個完整的操作系統(tǒng)需要:
1.kernel
2.系統(tǒng)調用
3.應用程序、庫
4.shell等
bootfs --》容器啟動的時候需要的內容
rootfs --》容器內部的操作系統(tǒng)
docker save
docker export
原理:
容器啟動的時候,內核啟動bootfs后直接將基礎鏡像加載,然后一層一層的加載–》自下而上
容器運行后訪問文件的時候,從上而下,從可寫層,一層一層往下訪問。
3. 為什么要自己制作鏡像?
以前在Linux 中下載mysql,Centos 系統(tǒng)中需要使用yum 命令,在學習完doker技術以后,需要什么軟件,只需要在docker 上面pull 就可以得到,docker 就像是一個巨大的資源庫,只有你想不到的東西,沒有它沒有的東西。
有些同學說:是技術限制了我對 docker 的想象,流下了悔恨的淚水。
哪有些同學就說了,那既然docker 這么方便,上面有那么多的鏡像文件,為什么還需要我們自己去制作呢?需要啥 pull 啥不就可以了嘛?
但是,在公司中往往需要自己制作鏡像文件,因為別人制作的東西往往會不放心,或者某些特定的需求不能滿足。就像你去買茅臺酒,商家說這是十年的茅臺,你就信他?這就是十年的茅臺?不去鑒定一下?如果是土豪,就當我沒說,哈哈啊哈
二、鏡像制作的步驟(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步:使用鏡像,啟動容器
docker run -d -p 5080:80 --name sc-hello-1 sc_friendlyhello_1
第7步:訪問容器的web服務
curl或者chrome瀏覽器訪問
宿主機ip:5080
Hello World!
Hostname: f4aeb5d5305a
Visits: cannot connect to Redis, counter disabled
因為redis數(shù)據(jù)庫容器沒有啟動,flask web服務不能連接到redis數(shù)據(jù)庫
第8步:啟動redis容器
docker run -d -p 6379:6379 --name sc-redis-1 redis
第9步:再次啟動一個自己制作鏡像的容器,鏈接到redis容器
docker run -d --name sc-hello-2 -p 5081:80 --link sc-redis-1:redis sc_friendlyhello_1
第10步:訪問容器的web服務
curl或者chrome瀏覽器訪問
宿主機ip:5081
Hello World!
Hostname: aad7da1892b5
Visits: 15
三. 鏡像制作的作業(yè)
作業(yè)
1.升級 sc_friendlyhello_1的鏡像里的基礎鏡像為python:3.9
自己的鏡像更名為sc_friendlyhello_2
2.啟動容器和redis容器,測試訪問**
作業(yè)步驟:
安裝上傳的文件
root@sc-docker-server ~]# yum install lrzsz -y 安裝上傳的軟件
上次元數(shù)據(jù)過期檢查:0:25:32 前,執(zhí)行于 2021年08月18日 星期三 09時52分02秒。
軟件包 lrzsz-0.12.20-43.el8.x86_64 已安裝。
依賴關系解決。
無需任何處理。
完畢!
[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步:進入app目錄,去新建一個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步:啟動自己制作的鏡像的容器
[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步:打開瀏覽器去訪問容器里的網(wǎng)站
容器里的網(wǎng)站:http://192.168.0.161:3000/
總結
1.鏡像的制作是作為docker 技術中必備的技能,你說你會docker ,別人一定會問你鏡像的制作嗎?你說制作那玩意干啥,別人就會會心一笑,心里一想這個人的技術一定很low,連這個都不會,還說自己會docker,呵呵。
2.后面有關鏡像制作有詳細的步驟,鏡像制作十步法會教你怎么去做的,慢慢來,一步一步來做。
到此這篇關于Docker鏡像制作、上傳、拉取和部署的文章就介紹到這了,更多相關Docker鏡像制作、上傳、拉取和部署內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!