什么是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)用的移植性以及部署的效率。
?簡(jiǎn)單來說,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),它只需要軟件工作所需的庫(kù)資源和設(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í)例對(duì)象
-
倉(cāng)庫(kù)(repository):存放鏡像文件的地方。比如maven倉(cāng)庫(kù)是存放jar包的地方。
類比于--》Student stu = new Student();
docker安裝
Linux上安裝:
# 首先安裝 Docker
yum -y install docker
# 然后啟動(dòng) Docker 服務(wù)
service docker start
# 測(cè)試安裝是否成功
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ū)分同一倉(cāng)庫(kù)中的不同鏡像,默認(rèn)為latest。
-
IMAGE ID: IMAGE ID是鏡像的一個(gè)唯一標(biāo)識(shí)符。
-
CREATED: CREATED表示鏡像的創(chuàng)建時(shí)間。
-
SIZE: SIZE表示鏡像的大小。
-
REPOSITORY:倉(cāng)庫(kù)名稱,倉(cāng)庫(kù)一般用來存放同一類型的鏡像。倉(cāng)庫(kù)的名稱由其創(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è)指令了,該指令可以用來安裝程序、安裝庫(kù)以及配置應(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ù)用來指定鏡像的命名空間,倉(cāng)庫(kù)名以及 TAG 等信息。
-
最后面的
.
是指鏡像構(gòu)建上下文。
本地打包docker鏡像
下載安裝Docker Desktop,配置完成后即可在windows CMD上操作docker命令
編寫一個(gè)簡(jiǎn)單的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)建成后,鏡像的倉(cāng)庫(kù)、標(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ù)共享,簡(jiǎn)單來說數(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ù)卷詳情文章來源:http://www.zghlxwxcb.cn/news/detail-779266.html
docker volume inspect
刪除數(shù)據(jù)卷文章來源地址http://www.zghlxwxcb.cn/news/detail-779266.html
docker volume rm
到了這里,關(guān)于Docker入門教程:本地打包docker鏡像的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!