什么是Docker?
(1)Docker的架構(gòu)
Docker是一種開(kāi)源平臺(tái),用于開(kāi)發(fā)、部署和運(yùn)行應(yīng)用程序。它利用容器化技術(shù),將應(yīng)用程序及其所有依賴項(xiàng)打包到一個(gè)稱為容器的獨(dú)立的運(yùn)行環(huán)境中。這使得應(yīng)用程序在不同的環(huán)境中能夠以一致的方式運(yùn)行,無(wú)論是在開(kāi)發(fā)人員的筆記本電腦、測(cè)試環(huán)境還是生產(chǎn)服務(wù)器上。
通過(guò)Docker,開(kāi)發(fā)人員可以更容易地構(gòu)建、交付和運(yùn)行應(yīng)用程序,同時(shí)確保應(yīng)用程序的一致性和可移植性。它也使得應(yīng)用程序的部署更加靈活和高效,因?yàn)樗梢钥焖俚貑?dòng)、停止和擴(kuò)展容器,而不會(huì)影響其他容器或主機(jī)系統(tǒng)。
圖1
圖2
基于T113-i平臺(tái)實(shí)現(xiàn)Docker容器技術(shù)
接下來(lái),我們將基于全志T113-i工業(yè)平臺(tái),演示Docker如何安裝、構(gòu)建鏡像以及下載鏡像并運(yùn)行容器。
1?Docker安裝
1.1?安裝方法
(1)安裝依賴包
打開(kāi)Ubuntu,確保Ubuntu可正常訪問(wèn)互聯(lián)網(wǎng),執(zhí)行如下命令安裝Docker依賴包。 ? Host#sudo apt-get update ?
圖3
Host#sudo apt-get install ca-certificates curl gnupg lsb-release
圖4
(2)添加Docker官方GPG密鑰
Host#sudo mkdir -m 0755 -p /etc/apt/keyrings
Host#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
圖5
(3)設(shè)置Docker Stable存儲(chǔ)庫(kù)
Host#echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ?
圖6
(4)安裝Docker
Host#sudo apt-get update
Host#sudo apt-get install docker-ce docker-ce-cli containerd.io
圖7
圖8
(5)驗(yàn)證Docker
執(zhí)行如下命令,通過(guò)運(yùn)行Docker自帶的hello-world鏡像來(lái)驗(yàn)證是否已安裝成功。程序運(yùn)行后,輸出如下內(nèi)容則表示Docker安裝成功。
Host#sudo docker run hello-world
圖9
更多參考信息,請(qǐng)查閱官方手冊(cè):https://docs.docker.com/engine/install/ubuntu。
1.2?搭建本地鏡像倉(cāng)庫(kù)
Docker用Registry來(lái)保存用戶構(gòu)建的鏡像。Registry分為公共和私有兩種。Docker公司運(yùn)營(yíng)的公共Registry叫做Docker Hub,用戶可在Docker Hub注冊(cè)賬號(hào),分享并保存自己的鏡像。Docker公司的公共鏡像倉(cāng)庫(kù)(https://hub.docker.com)提供了龐大的鏡像集合供用戶使用。一個(gè)Docker Registry中可包含多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)可包含多個(gè)標(biāo)簽(Tag),每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。通常,一個(gè)倉(cāng)庫(kù)會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽對(duì)應(yīng)該軟件的各個(gè)版本。用戶可通過(guò)“[<倉(cāng)庫(kù)名>:<標(biāo)簽>]”的格式來(lái)指定具體是某個(gè)軟件某個(gè)版本的鏡像。如未給出標(biāo)簽,將以[latest]作為默認(rèn)標(biāo)簽。
本次使用的鏡像是registry:2,執(zhí)行如下命令自動(dòng)下載并啟動(dòng)。
Host#mkdir -p /home/tronlong/docker/myregistry
Host#sudo docker run -d -p 5000:5000 -v /home/tronlong/docker/myregistry:/var/lib/registry registry:2
參數(shù)說(shuō)明:
-d:后臺(tái)啟動(dòng)容器。
-p:將容器的5000端口映射至Ubuntu的5000端口(5000是registry服務(wù)端口)。
-v:將容器"/var/lib/registry"目錄映射至Ubuntu的"/home/tronlong/docker/myregistry",用于存放鏡像數(shù)據(jù)。 ?
圖10
執(zhí)行如下命令,查看容器是否已啟動(dòng),出現(xiàn)如下內(nèi)容說(shuō)明容器已正常啟動(dòng)。
Host#sudo docker ps
圖11
通過(guò)瀏覽器訪問(wèn)"http://192.168.10.101:5000/v2/_catalog",若返回如下內(nèi)容則說(shuō)明registry已經(jīng)成功啟動(dòng),192.168.10.101為Ubuntu的IP。
圖12
因?yàn)镈ocker剛建立運(yùn)行,所以里面無(wú)任何鏡像內(nèi)容。至此,Docker環(huán)境安裝完成。
2 構(gòu)建鏡像
在Ubuntu上新建工作目錄"/home/tronlong/docker/dockerfile/",并將產(chǎn)品資料“4-軟件資料LinuxFilesystemdocker”目錄下的文件系統(tǒng)壓縮包和產(chǎn)品資料“4-軟件資料Demoase-demosled_flashin”目錄下的可執(zhí)行文件拷貝至Ubuntu共享目錄下,再執(zhí)行如下命令拷貝至Docker工作目錄。
Host#mkdir /home/tronlong/docker/dockerfile
Host#cp /mnt/hgfs/SharedFolders/led_flash /home/tronlong/docker/dockerfile/
Host#cp /mnt/hgfs/SharedFolders/rootfs.tar?/home/tronlong/docker/dockerfile/
圖13
在"/home/tronlong/docker/dockerfile/"目錄下,創(chuàng)建Dockerfile文件,并編寫如下內(nèi)容。
Host#cd /home/tronlong/docker/dockerfile
Host#gedit Dockerfile
圖14
圖15
Dockerfile文件內(nèi)容如下:
FROM scratch#基于空的基礎(chǔ)鏡像構(gòu)建新的鏡像
# Set work directory
WORKDIR /root#為CMD、COPY和AND設(shè)置工作目錄
# Decompress the file system
ADD rootfs.tar /#解壓文件系統(tǒng)
# Copy file to image
COPY led_flash .#拷貝可執(zhí)行文件至鏡像的"/home/root/"目錄下
# Shell command executed when the container is started
# CMD ["executable","param1","param2"]
CMD ["./led_flash", "-n 1"]#容器啟動(dòng)時(shí)執(zhí)行的shell命令,此處為執(zhí)行LED閃爍程序的命令
在Dockerfile文件所在的目錄下執(zhí)行如下命令,進(jìn)行構(gòu)建鏡像。
Host#sudo docker build -t 192.168.10.101:5000/led_flash:v1.0 .//注意命令最后含有"."
Host#sudo docker images //查看已構(gòu)建的鏡像
參數(shù)說(shuō)明:
192.168.10.101:Ubuntu的IP地址;
-t:指定鏡像的名字及標(biāo)簽(name:tag)。
圖16
請(qǐng)執(zhí)行如下命令,將鏡像推送至本地倉(cāng)庫(kù)Registry。
Host#sudo docker push 192.168.10.101:5000/led_flash:v1.0
圖17
Docker版本從1.3.X之后,與Docker Registry交互默認(rèn)使用https,然而前面搭建的私有倉(cāng)庫(kù)僅提供http服務(wù),因此當(dāng)與私有倉(cāng)庫(kù)交互時(shí)將出現(xiàn)上面的錯(cuò)誤提示??赏ㄟ^(guò)修改"/etc/docker/daemon.json"文件來(lái)解決該問(wèn)題,請(qǐng)執(zhí)行如下命令,192.168.10.101為Ubuntu的IP。
Host#sudo?vi?/etc/docker/daemon.json
圖18 ? 請(qǐng)?jiān)赿aemon.json中添加如下配置內(nèi)容:
{
"insecure-registries": ["192.168.10.101:5000"]
}
執(zhí)行如下命令,重新啟動(dòng)Docker、Registry容器(通過(guò)指定ID),并重新推送鏡像至本地Registry。
Host#sudo /etc/init.d/docker restart
Host#sudo docker ps -a
Host#sudo docker start 0833de1304d9//以查詢得到的CONTAINER ID號(hào)為準(zhǔn)
Host#sudo docker push 192.168.10.101:5000/led_flash:v1.0 ?
圖19 ? 通過(guò)瀏覽器訪問(wèn)"http://192.168.10.101:5000/v2/_catalog",即可看到當(dāng)前倉(cāng)庫(kù)里已有的鏡像。
圖20
3 下載鏡像并運(yùn)行容器
(1)使用網(wǎng)線將創(chuàng)龍科技T113-i評(píng)估板ETH0(RGMII)網(wǎng)口連接至路由器,并確保和Ubuntu處于同一網(wǎng)絡(luò)下,評(píng)估板上電啟動(dòng),執(zhí)行如下命令下載鏡像并列舉出下載后的鏡像。下載鏡像過(guò)程中將會(huì)打印警告和錯(cuò)誤信息,不影響功能正常使用,請(qǐng)忽略。
Target#docker pull 192.168.10.101:5000/led_flash:v1.0//下載鏡像
Target#docker images//列舉已下載的鏡像
圖21
若出現(xiàn)如下錯(cuò)誤,請(qǐng)執(zhí)行如下命令,通過(guò)修改"/etc/docker/daemon.json"文件來(lái)解決此問(wèn)題,修改保存后,重新啟動(dòng)dockerd守護(hù)進(jìn)程。
圖22
Target#vi /etc/docker/daemon.json
圖23 ? 請(qǐng)?jiān)赿aemon.json中添加如下配置內(nèi)容:
{
"insecure-registries": ["192.168.10.101:5000"]
}
Target#/etc/init.d/S60dockerd restart ?
圖24 ? (2)創(chuàng)建并啟動(dòng)容器。由于Docker使用VFS存儲(chǔ)驅(qū)動(dòng)程序,當(dāng)創(chuàng)建容器時(shí),需要先創(chuàng)建容器層,該容器層需要對(duì)上一層進(jìn)行“深拷貝”,因此完成創(chuàng)建并啟動(dòng)容器整個(gè)過(guò)程需要耗時(shí)約1min,請(qǐng)耐心等待。
Target#docker run -d --name led_flash -v /sys/:/sys 2d17af57ec7e
參數(shù)說(shuō)明:
-d:后臺(tái)運(yùn)行容器;
--name:為容器指定一個(gè)名稱;
-v:映射卷(將主機(jī)的目錄"/sys"映射至容器的"/sys");
2d17af57ec7e:鏡像ID,以docker images命令列舉的"IMAGE ID"為準(zhǔn)。 ?
圖25
容器啟動(dòng)完成后,評(píng)估底板的用戶可編程指示燈閃爍。
(3)容器的基本操作
執(zhí)行如下命令,查看正在運(yùn)行的容器并進(jìn)入容器。
Target#docker?ps -a
Target#docker exec -it 2d7c23bd13c0 /bin/bash
參數(shù)說(shuō)明:
-i:以交互模式運(yùn)行容器,通常與-t同時(shí)使用;
-t:為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用;
2d7c23bd13c0:容器ID,以實(shí)際"CONTAINER ID"為準(zhǔn);
/bin/bash:在容器內(nèi)執(zhí)行"/bin/bash"命令。
圖26
執(zhí)行如下命令,退出容器。
Bash#exit
圖27
執(zhí)行如下命令,停止容器。此時(shí),評(píng)估底板的用戶可編程指示燈不再閃爍。
Target#?docker stop 2d7c23bd13c0
圖28
執(zhí)行如下命令,啟動(dòng)容器。此時(shí),評(píng)估底板的用戶可編程指示燈閃爍。
Target#docker start?2d7c23bd13c0
圖29
備注:若運(yùn)行Docker時(shí),出現(xiàn)"x509: certificate signed by unknown authority"類似警告信息(如下圖),可通過(guò)修改/etc/docker/daemon.json文件解決。該警告是由于本機(jī)沒(méi)有遠(yuǎn)程倉(cāng)庫(kù)的證書文件導(dǎo)致。
圖30
修改內(nèi)容:
{
"registry-mirrors": ["https://registry-1.docker.io"],
"insecure-registries": ["https://registry-1.docker.io"]
}
圖31
修改完成后,重新運(yùn)行Docker。
審核編輯:黃飛
?
評(píng)論