Docker入門教程之本地打包docker鏡像教程
什么是Docker?
Dockers是基于Go語言開發(fā)的虛擬容器技術(shù)。以前我們部署應(yīng)用通常是將源代碼打包成一個(gè)jar包運(yùn)行,這樣就會(huì)受到運(yùn)行環(huán)境、配置環(huán)境的限制,而且程序也不能跨服務(wù)器運(yùn)行。Docker基于Linux容器技術(shù),將Java源代碼、運(yùn)行環(huán)境像MySQL、redis、jdk等通通打包成一個(gè)鏡像,實(shí)現(xiàn)“一次鏡像,處處運(yùn)行”。極大的提高的應(yīng)用的移植性以及部署的效率。
簡單來說,docker是一個(gè)解決了運(yùn)行環(huán)境和配置問題的軟件容器,方便做持續(xù)集成并有助于整體發(fā)布的容器虛擬化技術(shù)。
容器與虛擬機(jī)的區(qū)別
- 傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后,在其上運(yùn)行的一個(gè)完整的操作系統(tǒng),在該系統(tǒng)上在運(yùn)行所需應(yīng)用進(jìn)程。而Docker不需要捆綁一整套的操作系統(tǒng),它只需要軟件工作所需的庫資源和設(shè)置。
- Docker容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)虛擬機(jī)則是在硬件層面實(shí)現(xiàn)虛擬化;Docker依賴于Linux內(nèi)核環(huán)境,其實(shí)本質(zhì)上是在已經(jīng)運(yùn)行的Linux下制造一個(gè)隔離的文件環(huán)境。
優(yōu)點(diǎn):
- 更輕量:基于容器的虛擬化,僅包含業(yè)務(wù)運(yùn)行所需的runtime環(huán)境。
- 更高效:無操作系統(tǒng)虛擬化開銷。
- 更靈活:容器隔離,devoops理念。
Docker的組成
docker中有三個(gè)基本概念:
- 鏡像(image):一個(gè)只讀的模板,可以用來創(chuàng)建Docker容器。類似于Student類
- 容器(Container):容器是鏡像創(chuàng)建的運(yùn)行實(shí)例。容器是鏡像運(yùn)行時(shí)的實(shí)體,為鏡像提供了一個(gè)標(biāo)準(zhǔn)的和隔離的運(yùn)行環(huán)境。它可以被啟動(dòng)、停止、刪除,每個(gè)容器之間都是隔離的。類似于stu實(shí)例對象
- 倉庫(repository):存放鏡像文件的地方。比如maven倉庫是存放jar包的地方。
類比于--》Student stu = new Student();
docker安裝
Linux上安裝:
# 首先安裝 Docker yum -y install docker # 然后啟動(dòng) Docker 服務(wù) service docker start # 測試安裝是否成功 docker -v # 配置阿里云鏡像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://******.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
Windows上安裝:下載Docker Desktop,配置WSL
docker run 的執(zhí)行流程及原理
執(zhí)行流程:
docker是一個(gè)client-server結(jié)構(gòu)的系統(tǒng),docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上。dockerServer接收到docker-client的命令,就會(huì)執(zhí)行這個(gè)命令。
容器基本操作
docker 中的容器就是一個(gè)輕量級(jí)的虛擬機(jī),是鏡像運(yùn)行起來的一個(gè)狀態(tài),本文就先來看看容器的基本操作。
鏡像就像是一個(gè)安裝程序,而容器則是程序運(yùn)行時(shí)的一個(gè)狀態(tài)。
查看容器
#查看正在運(yùn)行容器 docker ps #查看所有容器 docker ps -a #查看最新創(chuàng)建的容器 docker ps -l
創(chuàng)建容器
#創(chuàng)建容器 docker create 鏡像 --創(chuàng)建一個(gè) nginx 容器:docker create nginx --指定容器的name為nginx:docker create --name=nginx nginx #創(chuàng)建并啟動(dòng)一個(gè)容器 docker run 鏡像 --docker run --name nginx1 -d -p 8080:80 nginx --name 含義和上文一樣,表示創(chuàng)建的容器的名字,-d 表示容器在后臺(tái)運(yùn)行,-p 表示將容器的 80 端口映射到宿主機(jī)的 8080 端口
啟動(dòng)關(guān)閉容器
#啟動(dòng)容器 docker start id|name #重啟容器 docker restart id|name #關(guān)閉容器 docker stop id|name
刪除容器
#單個(gè)刪除 docker rm id|name #批量刪除 docker rm $(docker ps -a -q)
查看容器信息、日記
#容器詳情 docker inspect id|name #查看容器進(jìn)程 docker top #查看你容器日記 docker logs id|name -f :實(shí)時(shí)日記 -t : 顯示時(shí)間 -tail: 控制輸出行數(shù)
容器導(dǎo)入導(dǎo)出
#導(dǎo)出一個(gè)已經(jīng)創(chuàng)建的容器導(dǎo)到一個(gè)文件 docker export -o 文件名.tar 容器id #將文件導(dǎo)入為鏡像 docker import 文件名.tar 鏡像名:鏡像標(biāo)簽
docker export -o image-test.tar 1ffcd3e4a201
鏡像的基本操作
鏡像是容器運(yùn)行的基礎(chǔ),容器是鏡像運(yùn)行后的形態(tài)。鏡像是一個(gè)包含程序運(yùn)行必要以來環(huán)境和代碼的只讀文件,它采用分層的文件系統(tǒng),將每一層的改變以讀寫層的形式增加到原來的只讀文件上。
查看所有鏡像
docker images
- TAG: TAG用于區(qū)分同一倉庫中的不同鏡像,默認(rèn)為latest。
- IMAGE ID: IMAGE ID是鏡像的一個(gè)唯一標(biāo)識(shí)符。
- CREATED: CREATED表示鏡像的創(chuàng)建時(shí)間。
- SIZE: SIZE表示鏡像的大小。
- REPOSITORY:倉庫名稱,倉庫一般用來存放同一類型的鏡像。倉庫的名稱由其創(chuàng)建者指定。如果沒有指定則為
<none>
。
搜索鏡像
docker search name
下載鏡像
docker pull name:版本
版本可以在Docker hub上查看
刪除鏡像
docker rmi id|name
Dockerfile
Dockerfile是用來構(gòu)建docker鏡像的構(gòu)建文件。
其實(shí)Dockerfile就是一個(gè)普通的文本文件,其中包含了一條條的指令,每一條指令都會(huì)構(gòu)建一層。
dockerfile指令
FROM #基礎(chǔ)鏡像,一切從這里開始構(gòu)建 MAINTAINER #鏡像是誰寫的,姓名+郵箱 RUN #鏡像構(gòu)建時(shí)需要運(yùn)行的命令 ADD #步驟,tomcat鏡像,這個(gè)tomcat壓縮包;添加內(nèi)容 WORKDIR #鏡像工作目錄 VOLUME #掛載的目錄 EXPOSE #暴露端口配置 CMD #指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效,可被替代 ENTRYPOINT #指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,可以追加命令 ONBUILD #當(dāng)構(gòu)建一個(gè)被繼承DockerFile 這個(gè)時(shí)候就會(huì)運(yùn)行 ONBUILD 的指令,觸發(fā)指令 COPY #類似ADD,將我們的文件拷貝至鏡像中 ENV #構(gòu)建的時(shí)候設(shè)置環(huán)境變量
- FROM nginx 表示該鏡像的構(gòu)建,以已有的 nginx 鏡像為基礎(chǔ),在該鏡像的基礎(chǔ)上構(gòu)建。
- MAINTAINER 指令用來聲明創(chuàng)建鏡像的作者信息以及郵箱信息,這個(gè)命令不是必須的。
- RUN 指令用來修改鏡像,算是使用比較頻繁的一個(gè)指令了,該指令可以用來安裝程序、安裝庫以及配置應(yīng)用程序等,一個(gè) RUN 指令執(zhí)行會(huì)在當(dāng)前鏡像的基礎(chǔ)上創(chuàng)建一個(gè)新的鏡像層,接下來的指令將在這個(gè)新的鏡像層上執(zhí)行,RUN 語句有兩種不同的形式:shell 格式和 exec 格式。本案例采用的 shell 格式,shell 格式就像 linux 命令一樣,exec 格式則是一個(gè) JSON 數(shù)組,將命令放到數(shù)組中即可。在使用 RUN 命令時(shí),適當(dāng)?shù)臅r(shí)候可以將多個(gè) RUN 命令合并成一個(gè),這樣可以避免在創(chuàng)建鏡像時(shí)創(chuàng)建過多的層。
- COPY 語句則是將鏡像上下文中的
hello.html
文件拷貝到鏡像中。
命令解釋:
- -t 參數(shù)用來指定鏡像的命名空間,倉庫名以及 TAG 等信息。
- 最后面的
.
是指鏡像構(gòu)建上下文。
本地打包docker鏡像
下載安裝Docker Desktop,配置完成后即可在windows CMD上操作docker命令
編寫一個(gè)簡單的springboot項(xiàng)目,提供一個(gè)helloworld接口
@RestController public class HelloWorld { @GetMapping("/hello") public String helloImages() { return "hello images!"; } }
使用maven插件打包--install--,在target包下可以看得到生成的jar包。
編寫Dockerfile文件
# 基礎(chǔ)鏡像使用java FROM java:8 #作者 MAINTAINER CJC #將jar包添加到容器中并更名為: hello-docker-image.jar ADD docker-image-test-0.0.1-SNAPSHOT.jar hello-docker-image.jar #運(yùn)行jar包 RUN bash -c 'touch hello-docker-image.jar' ENTRYPOINT ["java","-jar","hello-docker-image.jar"] #暴露端口 EXPOSE 8080
將jar包和dockerfile文件置于同一目錄下執(zhí)行命令,構(gòu)建鏡像:
docker build -t Name:TagName . > build -t hello-docker-image:V1.0 . -t參數(shù)指定構(gòu)建成后,鏡像的倉庫、標(biāo)簽等, Name 給鏡像取的名字 TagName 給鏡像取的標(biāo)簽 最后的 . 表示 Dockerfile 文件在當(dāng)前目錄下
查看鏡像:docker images
創(chuàng)建并啟動(dòng)容器:docker run -d -p 8080:8080 6e7772b68332
docker desktop上可以看到容器正在運(yùn)行:
docker數(shù)據(jù)卷操作
一般情況下,當(dāng)我們需要將數(shù)據(jù)從宿主機(jī)拷貝到容器中使用的都是docker的拷貝命令。數(shù)據(jù)卷可以避免這種麻煩的操作。
數(shù)據(jù)卷可以實(shí)現(xiàn)容器和宿主機(jī)之間的數(shù)據(jù)共享,簡單來說數(shù)據(jù)卷就是在宿主機(jī)和容器之間搭建的一個(gè)映射的工作區(qū),兩者可以同步修改。
docker run -itd --name nginx -v /Users/sang/blog/docker/docker/:/usr/share/nginx/html/ -p 80:80 bc26f1ed35cf
這樣便是將宿主機(jī)中的 /Users/sang/blog/docker/docker/
目錄掛載到容器的 /usr/share/nginx/html/
目錄下。接下來讀者只需要在 /Users/sang/blog/docker/docker/
目錄下添加 html 文件,或者修改 html 文件,都能在 nginx 訪問中立馬看到效果。
查看所有的數(shù)據(jù)卷:
docker volume ls
查看數(shù)據(jù)卷詳情
docker volume inspect
刪除數(shù)據(jù)卷
docker volume rm
總結(jié)
到此這篇關(guān)于Docker入門教程之本地打包docker鏡像教程的文章就介紹到這了,更多相關(guān)本地打包docker鏡像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker部署Apollo的實(shí)現(xiàn)步驟
眾所周知分布式配置中心在目前也可以說是企業(yè)中項(xiàng)目的標(biāo)配了,本文主要介紹了Docker 部署Apollo的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02詳解從 0 開始使用 Docker 快速搭建 Hadoop 集群環(huán)境
這篇文章主要介紹了詳解從 0 開始使用 Docker 快速搭建 Hadoop 集群環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Docker拉取ubuntu鏡像并建立環(huán)境的詳細(xì)過程
在Docker實(shí)戰(zhàn)中Ubuntu是一個(gè)常見的基礎(chǔ)鏡像,用于構(gòu)建其他應(yīng)用服務(wù)的容器,這篇文章主要給大家介紹了關(guān)于Docker拉取ubuntu鏡像并建立環(huán)境的詳細(xì)過程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07docker容器中布置靜態(tài)網(wǎng)站的實(shí)現(xiàn)
這篇文章主要介紹了docker容器中布置靜態(tài)網(wǎng)站的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01