柚子快報激活碼778899分享:容器 【入門級】docker
柚子快報激活碼778899分享:容器 【入門級】docker
開頭處生動的描述一下”碼頭工人”吧:小鯨魚(登記處Registry:比如docker hub官方)背著好多集裝箱(倉庫repository:存放各種各樣的鏡像,一般存放的是一類鏡像,這一類鏡像中通過tag 版本進(jìn)行區(qū)分),可以游向各個地方(指無需配置環(huán)境便可直接運行)。
【入門級】docker
一、docker概念簡述二、docker拉取1.國內(nèi)鏡像加速2.docker pull with proxy
三、docker基本命令1.幫助命令2.鏡像命令3.容器命令4.移動命令5.其余命令
四、容器數(shù)據(jù)卷1. 容器-v掛載2.構(gòu)建鏡像時掛載3.數(shù)據(jù)卷容器
五、DockerFile六、Docker網(wǎng)絡(luò)
一、docker概念簡述
所有應(yīng)用,可以打包成docker鏡像(包含某個軟件運行所需的所有內(nèi)容:代碼、庫、環(huán)境變量、配置文件等),無需重新配置環(huán)境,可以直接跑起來!簡單了解以下幾個名詞:
鏡像(images):可以理解成C++里的類/模板,通過鏡像實例化對象.容器(container):鏡像實例化的對象就是容器,每個容器都類似一個VM虛擬機(區(qū)別是容器不用單獨構(gòu)建操作系統(tǒng)內(nèi)核,所有的容器共用宿主機的內(nèi)核,啟動更快),各個容器之間存儲隔離,不同容器可以進(jìn)行交互.倉庫(repository):存放鏡像的地方(官方docker hub,以及一些國內(nèi)的鏡像倉庫).
Ubuntu下docker的安裝可以采用魚香ros一鍵安裝:wget http://fishros.com/install -O fishros && . fishros(安裝的是引擎版,不是桌面版)安裝完成后啟動docker:systemctl start docker 查看docker版本:docker version run hello-world檢測docker:docker run hello-world(自動pull hello-world的鏡像,拉取時關(guān)閉防火墻)docker的默認(rèn)工作路徑在/var/lib/docker下,可以使用sudo -i提高權(quán)限,cd查看,Ctrl+D退出高級權(quán)限.docker遵循client-server模式,可以輸入docker info查看其余詳情請移步到 docker官方用戶手冊
二、docker拉取
1.國內(nèi)鏡像加速
在終端進(jìn)行下述配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json < { "registry-mirrors": [ "https://hub.uuuadc.top", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu", "https://docker.ckyl.me", "https://docker.awsl9527.cn" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 以docker.awsl9527.cn為例拉取: docker pull docker.awsl9527.cn/library/alpine:latest // 拉取 library 鏡像 docker pull docker.awsl9527.cn/coredns/coredns:latest // 拉取 coredns 鏡像 (說明:library是一個特殊的命名空間,它代表的是官方鏡像。如果是某個用戶的鏡像就把library替換為鏡像的用戶名) 重命名鏡像名稱: docker image tag docker.awsl9527.cn/library/alpine:latest library/alpine:latest docker image tag docker.awsl9527.cn/coredns/coredns:latest coredns/coredns:latest 刪除“中間站”鏡像: docker rmi docker.awsl9527.cn/library/alpine:latest docker rmi docker.awsl9527.cn/coredns/coredns:latest 欲知其余鏡像加速器的配置方法,可以跳轉(zhuǎn)DockerHub國內(nèi)鏡像源列表 2.docker pull with proxy 若想使用clash(確保已經(jīng)配置好clash)直接從docker hub官網(wǎng)拉取鏡像,可以配置proxy,具體步驟如下: mkdir /etc/systemd/system/docker.service.dvim /etc/systemd/system/docker.service.d/http-proxy.conf在 http-proxy.conf 中添加下述內(nèi)容: [Service] Environment="HTTP_PROXY=http://proxy.example.com:80/" Environment="HTTPS_PROXY=http://proxy.example.com:80/" (在終端使用命令env | grep -i proxy,查看HTTP_PROXY和HTTPS_PROXY的值進(jìn)行替換) 刷新一下:sudo systemctl daemon-reload查看配置是否被加載完成 $ sudo systemctl show --property Environment docker Environment=HTTP_PROXY=http://proxy.example.com:80/ Environment=HTTPS_PROXY=http://proxy.example.com:80/ 重啟docker:sudo systemctl restart docker (注:配置好代理后pull時需要關(guān)掉防火墻) 三、docker基本命令 1.幫助命令 docker 命令 --help 官方命令Reference 2.鏡像命令 sudo docker images //查看所有已下載的docker鏡像 docker images -q //只顯示鏡像id docker search osrf/ros //搜索鏡像(也可以在docker hub上直接搜索) docker search osrf/ros --filter=STARS=73 //過濾:只搜索stars大于73的鏡像 sudo docker pull osrf/ros:humble-desktop-full //拉取ros-humble的docker鏡像 分層下載(如果不寫tag,默認(rèn)latest) sudo docker rmi 鏡像ID/鏡像name //刪除鏡像 docker rmi -f $(docker images -aq) //刪除所有鏡像(f->force a->all q->id) (注:容器ID≠鏡像ID) 3.容器命令 sudo docker ps //查看正在運行的docker容器 sudo docker ps -a //列出所有運行/停止的容器 sudo docker ps -aq //僅列出所有運行/停止的容器的id sudo docker ps -n=? //顯示最近創(chuàng)建的容器(尚存在的) sudo docker run -it hello-world:latest //運行容器(-it:交互式運行;i:從容器中獲取一個標(biāo)準(zhǔn)輸入stdIn創(chuàng)建可交互連接;t:在容器內(nèi)分配一個偽終端;hello-world:repository;latest:tag) sudo docker run -it -d osrf/ros:humble-desktop-full-jammy //在后臺運行一個容器(輸出1c7a8a5b58116e6b5f7d88aa1608748a1b36ab582822c760556d5e6b7850f5ee,前12位為容器ID)(容器發(fā)現(xiàn)沒有前臺進(jìn)程,自殺->exit) sudo docker run -it --rm osrf/ros:humble-desktop-full-jammy //僅用于測試,關(guān)閉容器后自動刪除 sudo docker run -it -d --name xiaoxin osrf/ros:humble-desktop-full-jammy //創(chuàng)建容器時自己給容器rename sudo docker start 容器name/ID //重新打開已經(jīng)創(chuàng)建好但退出的容器 docker restart 容器name/ID //重啟容器 sudo docker attach 1c7a8a5b5811 //連接進(jìn)入ID為1c7a8a5b5811的容器(Ctrl+D后exited) docker exec -it frosty_mahavira /bin/bash //連接進(jìn)入name為frosty_mahavira的容器(開啟一個新終端 Ctrl+D后up) CTRL+P+Q //讓容器呆在后臺(不停止) 當(dāng)前終端:CTRL+D或exit //停止并退出容器 新開終端:sudo docker stop 容器name/ID //溫柔退出容器 sudo docker kill 容器name/ID //強制關(guān)閉docker容器 sudo docker rm 容器ID/容器name //刪除容器(不能刪除正在運行的容器,如果強制刪除rm -f) docker rm -f $(docker ps -aq) //刪除所有的up/exit容器(若去掉-f,只能刪掉停止的容器) docker ps -aq | xargs docker rm //刪除所有的容器(xargs處理管道多行變單行,換行和空白將被空格取代) sudo docker container prune //把所有停止的容器一鍵刪除 sudo docker system prune -a //(慎用)刪掉所有未運行的容器、所有鏡像、構(gòu)建的緩存、所有網(wǎng)絡(luò) 4.移動命令 docker save -o lawskiybin.tar lawskiy/roaf3d_bin:v3.0 //把鏡像打包成tar docker load -i lawskiybin.tar //從tar文件導(dǎo)出鏡像 sudo docker commit 容器ID 容器name/鏡像name //創(chuàng)建一個當(dāng)前運行容器的 Docker 鏡像 docker commit -m="提交的描述信息" -a="作者" 容器ID 目標(biāo)鏡像名:tag docker cp 容器id:容器內(nèi)路徑 目的主機路徑 //從容器內(nèi)拷貝文件(夾)到主機上 docker cp /home/zixie/ws frosty_mahavira:/home //從主機拷貝文件(夾)到容器內(nèi) 5.其余命令 # 查找日志 docker logs -tf --tail 10 容器name/ID //輸出最近的10條日志(t-時間戳 f-實時顯示 tail-后跟最近日志獲取數(shù)量) docker logs -tf 容器names/ID //輸出所有日志 # 查看容器中進(jìn)程信息 docker top 容器name/ID //各個輸出所表含義: //UID-進(jìn)程的用戶ID //PID-進(jìn)程ID //PPID-父進(jìn)程ID //C-CPU使用率 //STIME-進(jìn)程啟動時間 //TTY-進(jìn)程所在的終端 //TIME-進(jìn)程累計CPU時間 //CMD-啟動進(jìn)程的命令 #查看容器的源數(shù)據(jù) docker inspect 容器name/ID #查看docker磁盤使用情況 docker system df 四、容器數(shù)據(jù)卷 容器內(nèi)部數(shù)據(jù)和主機數(shù)據(jù)的互相掛載,確保容器的”持久化“以及”同步化“。通過掛載數(shù)據(jù)卷,容器之間也可以共享數(shù)據(jù). docker inspect 容器name:查看掛載詳情:Mounts掛載-v;Source主機目錄;Destination容器內(nèi)目錄.docker volume ls:查看所有容器數(shù)據(jù)卷.docker volume inspect 卷名:查看容器在主機的掛載目錄Mountpoint.docker volume rm 數(shù)據(jù)卷名:刪除容器數(shù)據(jù)卷(在/var/lib/docker/volumes執(zhí)行rm -rf 主機目錄有時刪不掉). 1. 容器-v掛載 docker run -it -v 主機目錄:容器內(nèi)目錄 鏡像name:tag 匿名掛載:docker run --rm -it -v /home/test osrf/ros:humble-desktop-full(只寫了容器內(nèi)目錄:/home/test;主機目錄默認(rèn)為:/var/lib/docker/volumes/數(shù)據(jù)卷名/_data)具名掛載:docker run --rm -it -v juming:/home/test osrf/ros:humble-desktop-full(juming前沒加/,不是主機目錄,而是數(shù)據(jù)卷的名字,主機目錄默認(rèn)為:/var/lib/docker/volumes/數(shù)據(jù)卷名/_data)指定路徑掛載:docker run --rm -it -v /home/zixie:/home/test osrf/ros:humble-desktop-full(指定路徑掛載是一種把主機目錄絕對化的匿名掛載) //改變讀寫權(quán)限(針對于容器而言) docker run -it -v 主機目錄:容器內(nèi)目錄:ro/rw 鏡像name:tag //ro:readonly 只能在宿主機進(jìn)行操作,容器內(nèi)只讀 //rw:readwrite 2.構(gòu)建鏡像時掛載 vim Dockerfile新建Dockerfile文件,輸入: FROM osrf/ros:humble-desktop-full VOLUME ["volume1","volume2"] CMD echo "---end---" CMD /bin/bash 終端輸入docker build -f ./Dockerfile -t hzx/ros:1.0 .構(gòu)建鏡像(不要少寫了 “.”) 新建容器docker run --rm -it hzx/ros:1.0,完成后ls可以看到掛載的數(shù)據(jù)卷volume1&volume2. 3.數(shù)據(jù)卷容器 docker run --rm -it --name docker01 hzx/ros:1.0 //hzx/ros:1.0鏡像在構(gòu)建時自帶數(shù)據(jù)卷 docker run --rm -it --name docker02 --volumes-from docker01 hzx/ros:1.0 //實現(xiàn)容器間掛載數(shù)據(jù)卷 (關(guān)于掛載原理不是很清楚:本人先刪除docker,虛擬機中的文件不會丟失;刪除虛擬機中的volume數(shù)據(jù)卷,docker中的文件丟失) 五、DockerFile 構(gòu)建docker鏡像的文件(手工構(gòu)建image)——命令腳本 通過docker history 鏡像名可以大致窺見構(gòu)建鏡像的Dockerfile. 關(guān)鍵字(指令)可以大/小寫字母(推薦大寫).從上到下順序執(zhí)行.使用#注釋每一個指令都會創(chuàng)建一個鏡像層,并提交. (bootfs是Docker鏡像的基礎(chǔ)文件系統(tǒng),由多個只讀層(read-only layer)組成,這些層疊加形成了完整的文件系統(tǒng),這個文件系統(tǒng)是唯一一個在容器運行時保持不變的層,所有的修改都是在其他層上完成) 指令說明FROM指定基礎(chǔ)鏡像:FROM ubuntu:18.04(FROM scratch 白手起家)RUN在構(gòu)建鏡像過程中執(zhí)行的操作:RUN apt-get update && apt-get install -y vimCOPY拷貝本機文件到鏡像內(nèi)ADD類似于COPY,支持URL和自動解壓縮WORKDIR進(jìn)入容器后所在的工作目錄EXPOSE暴露端口CMD指定容器啟動時默認(rèn)執(zhí)行的命令,只有最后一個生效,運行容器時若添加CMD后的相關(guān)指令會被替代:CMD [“python ”, “app.py”]ENTRYPOINT指定容器啟動時默認(rèn)執(zhí)行的命令,只有最后一個生效, 運行容器時可以在原先Dockerfile ENTRYPOINT的基礎(chǔ)上追加命令LABEL鍵值對形式,可以生成鏡像的作者名稱(取代MAINTAINER):LABEL maintainer=‘zixie’ENV設(shè)置環(huán)境變量,運行容器時有效ARG設(shè)置環(huán)境變量,構(gòu)建鏡像時有效VOLUME掛載數(shù)據(jù)卷:VOLUME [“volume1”, “volume2”]USERdocker默認(rèn)運行權(quán)限是root,USER用于設(shè)置運行容器時的用戶ONBUILD該指令后面的指令在當(dāng)前鏡像被構(gòu)建時,并不會被執(zhí)行;只有以當(dāng)前鏡像為基礎(chǔ)鏡像去構(gòu)建下一級鏡像時,才會被執(zhí)行 (每個指令的些微介紹請移步Docker Dockerfile指令大全) 發(fā)布自己的鏡像到 docker hub 官網(wǎng): 首先在個人docker hub賬戶dockerhub_username(命名空間)下Create repository 創(chuàng)建倉庫repository_name,這樣做是為了確定要上傳網(wǎng)站的位置為dockerhub_username/repository_name給自己的鏡像打標(biāo)簽 docker tag [鏡像id] [網(wǎng)站上的位置]:[自定義Tag名字]:docker tag docker流程小結(jié): (Dockerfile & Images & Containers & Docker registry & backup.tar) 六、Docker網(wǎng)絡(luò) 首先,簡要插播一下計算機網(wǎng)絡(luò)的內(nèi)容: 集線器hub(物理層):連接多個PC端。不做任何處理,通過48位的MAC地址無腦將電信號廣播至所有出口,浪費網(wǎng)絡(luò)資源又不安全。 交換機(數(shù)據(jù)鏈路層):內(nèi)部維護(hù)一張 MAC 地址表(起初MAC地址表的形成要依靠廣播),只把數(shù)據(jù)包發(fā)給目標(biāo) MAC 地址(物理層面上,一般不可修改)指向的那臺電腦,形成以太網(wǎng)。由于交換機端口數(shù)量有限,當(dāng)PC端逐漸變多時難以支撐,此時可以考慮把交換機A(連接ABCD)與交換機B(連接EFGH)相連,但兩個交換機得分別記錄 A ~ H 所有機器的映射記錄,日積月累,交換機也不堪重負(fù)。 路由器(網(wǎng)絡(luò)層):路由器的每一個端口,都有獨立的 MAC 地址,現(xiàn)在交換機的 MAC 地址表中,只需要多出一條 MAC 地址 ABAB 與其端口的映射關(guān)系,利用32位IP地址(軟件層面上,可以修改),就可以成功把數(shù)據(jù)包轉(zhuǎn)交給路由器了。 All in all:電腦視角:首先我要知道我的 IP 以及對方的 IP;通過子網(wǎng)掩碼判斷我們是否在同一個子網(wǎng);在同一個子網(wǎng)就通過 arp 緩存表(通過 arp 協(xié)議廣播逐漸完善)獲取對方 mac 地址直接扔出去;不在同一個子網(wǎng)就通過 arp 緩存表獲取默認(rèn)網(wǎng)關(guān)的 mac 地址直接扔出去。交換機視角:我收到的數(shù)據(jù)包必須有目標(biāo) MAC 地址;通過 MAC 地址表(通過以太網(wǎng)各節(jié)點廣播逐漸完善)查映射關(guān)系;查到了就按照映射關(guān)系從我的指定端口發(fā)出去;查不到就所有端口都發(fā)出去。路由器視角:我收到的數(shù)據(jù)包必須有目標(biāo) IP 地址;通過路由表(各種路由算法 + 人工配置逐步完善)查映射關(guān)系;查到了就按照映射關(guān)系從我的指定端口發(fā)出去;查不到則返回一個路由不可達(dá)的數(shù)據(jù)包。網(wǎng)絡(luò)層(IP協(xié)議)本身沒有傳輸包的功能,包的實際傳輸是委托給數(shù)據(jù)鏈路層(以太網(wǎng)中的交換機)來實現(xiàn)的。 以上總結(jié)參考自wx公眾號,欲深入了解請?zhí)D(zhuǎn) 查看docker網(wǎng)絡(luò)模式docker network ls,會出現(xiàn)bridge、host、none三種網(wǎng)絡(luò)模式,創(chuàng)建容器時默認(rèn)為bridge,可以使用docker network inspect bridge/host/none來查看三種網(wǎng)絡(luò)的詳細(xì)信息。 默認(rèn)bridge:采用veth(virtual ethernet虛擬以太網(wǎng))技術(shù),以docker0做bridge默認(rèn)網(wǎng)絡(luò)模式的網(wǎng)關(guān),每創(chuàng)建一個容器就會產(chǎn)生(一對)veth-pair接口&與docker0在同一網(wǎng)段的一個IP地址. 容器IP是私有地址,外部互聯(lián)網(wǎng)想要訪問容器,需要-p暴露端口. 假設(shè)采用默認(rèn)bridge網(wǎng)絡(luò)模式創(chuàng)建了兩個容器aa(172.17.0.2)和bb(172.17.0.3),進(jìn)入容器aa,ping 172.17.0.3可以ping通,但在默認(rèn)bridge模式下無法進(jìn)行DNS域名解析,即ping bb會ping不通。采用–link進(jìn)行容器互聯(lián) docker run -it --name bb --link aa 鏡像name:tag,可以實現(xiàn)bb ping aa的單方向DNS域名解析.自定義bridge:docker network create -d bridge my_bridge_net創(chuàng)建自定義bridge網(wǎng)絡(luò)模式,可以使用docker network ls 查看新建的bridge,同樣它也有一個類似docker0的橋。docker run -it --network my_bridge_net 鏡像name:tag使用自定義bridge創(chuàng)建容器,可以進(jìn)行DNS域名解析。要想刪除此網(wǎng)絡(luò),終端輸入docker network rm my_bridge_net(無法刪除原始的3種網(wǎng)絡(luò)).host:該模式下容器相當(dāng)于宿主機的一個應(yīng)用,無需端口映射互聯(lián)網(wǎng)也能訪問容器(非要映射會遭到拒絕discard).none:以該模式創(chuàng)建的容器只有l(wèi)o本地回環(huán)一種網(wǎng)絡(luò),不能聯(lián)網(wǎng),被隔離. docker進(jìn)階: Docker Compose :一個在單個服務(wù)器或主機上創(chuàng)建多個容器的工具Docker Swarm :可以在多個服務(wù)器或主機上創(chuàng)建容器集群服務(wù) (未完待續(xù)) 柚子快報激活碼778899分享:容器 【入門級】docker 推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。