Docker入門,這一篇就夠了。
前言接觸docker很長時間了,但是工作中也沒有用到,所以總是學了忘,忘了學。不過這次,我打算跟大家分享一下我的學習歷程,也算是我的獨特的復習筆記,我會在這一篇中講清楚docker幾乎所有的功能。不過也是我第一次寫,而且是一篇兩萬多字的長文,花了我半個月里所有的休閑娛樂時間,所以寫的不好的地方請大家見諒,也請在評論區(qū)斧正,謝謝大家的理解。 一、Docker背景介紹。1、什么是docker。Docker,翻譯過來就是碼頭工人 Docker是一個開源的應用容器引擎,讓開發(fā)者可以打包他們的應用以及依賴包到一個可抑制的容器中,然后發(fā)布到任何流行的Linux機器上,也可以實現(xiàn)虛擬化。容器完全使用沙盒機制,相互之間不會存在任何接口。幾乎沒有性能開銷,可以很容易的在機器和數(shù)據(jù)中心運行。最重要的是,他們不依賴于任何語言、框架或者包裝系統(tǒng)。 小知識:沙盒也叫沙箱(sandbox)。在計算機領域指一種虛擬技術,而且多用于計算機安全技術。安全軟件可以讓它在沙盒中運行,如果含有惡意行為,則禁止程序的進一步運行,而這不會對系統(tǒng)造成任何危害。 Docker是dotCloud公司開源的一個基于LXC的高級容器引擎,源碼托管在Github上,基于go語言并且遵從Apache2.0協(xié)議開源。 小知識:LXC為Linux Container的簡寫。Linux Container 容器是一種內(nèi)核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。 docker官網(wǎng):https://www. 2、Docker容器技術與虛擬機的區(qū)別。相同點:docker和容器技術和虛擬機技術,都是虛擬化技術。 不同點: 容器技術: 通過圖片,我們很明顯的看到容器少了一層Guest OS,也就是少了虛擬機操作系統(tǒng)這一層,所以docker效率比虛擬機效率高。達到了秒級啟動的地步。 docker相較于VM的優(yōu)點: 2、Docker是一個開放的平臺,構建、發(fā)布和運行分布式應用程序。 3、開發(fā)人員不需要關系具體是哪個Linux操作系統(tǒng) 4、Google、微軟(azure)、亞馬遜、IBM等都支持docker。 5、Docker支持Unix/Linux操作系統(tǒng),也支持Windows和Mac。 Docker局限性: 3、通過docker架構圖初步了解docker。
Docker核心技術: 4、Docker特性。文件系統(tǒng)隔離:每個進程容器運行在一個完全獨立的根文件系統(tǒng)里。 資源隔離:系統(tǒng)資源,像CPU和內(nèi)存等可以分配到不同的容器中,使用cgroup。 日志記錄:Docker將收集到和記錄的每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或者批量檢索 變更管理:容器文件系統(tǒng)的變更可以提交到新的鏡像中,并可重復使用以創(chuàng)建更多的容器。無需使用模板或者手動配置。 交互式shell:Docker可以分配一個虛擬終端并且關聯(lián)到任何容器的標準輸出上,例如運行一個一次性交互shell。 二、Docker的安裝。1、docker安裝背景。首先我問大家一個問題,你們知道docker有幾種安裝方式嗎? 1、yum -y install docker2、yum -y install docker-engine3、yum -y install docker-ce 是的,有三種安裝方式,而且,它們都是正確的! https://docs./engine/install/centos/ 2、部署docker容器虛擬化平臺并且配置docker鏡像加速地址。實驗環(huán)境:centos7.6 64位。網(wǎng)絡要求能上外網(wǎng)。 3、安裝docker依賴環(huán)境。yum install -y yum-utils device-mapper-persistent-data lvm2
4、配置國內(nèi)docker-ce的yum源(這里采用的是阿里云)yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum-config-manager命令作用是添加yum源。 cd /etc/yum.repos.d ls
5、安裝docker。yum -y install docker-ce doker-ce-cli containerd.io 安裝速度可能會比較慢,請耐心等待。 6、開啟網(wǎng)絡轉(zhuǎn)發(fā)功能。默認會自動開啟。 vim /etc/sysctl.conf #插入以下內(nèi)容 net.ipv4.forward =1-------------------------sysctl -p #生效 cat /proc/sys/net/ipv4/ip_forward #查看結果,為1開啟成功。 如果沒有開啟網(wǎng)絡轉(zhuǎn)發(fā),我們啟動實例的時候就會報錯?。?! 關閉防火墻: iptables -nL #查看一下iptable規(guī)則,關閉防火墻后會自動插入新規(guī)則
systemctl stop firewalld && systemctl disable firewalld #關閉防火墻
sysctlrem restart docker # 關閉防火墻要把docker重啟一下,不然docker
的ip包轉(zhuǎn)發(fā)功能無法使用。即便防火墻關閉了,docker依舊會調(diào)用內(nèi)核模塊netfilter增加規(guī)則,所以會新增iptables規(guī)則
iptables -nL #再查看一下iptable規(guī)則,會發(fā)現(xiàn)多出很多規(guī)則 iptables -nL 7、啟動服務。systemctl start docker && systemctl enable docker 啟動完成后會該網(wǎng)絡參數(shù),這個是ip轉(zhuǎn)發(fā)會改成1。默認0 docker version #查看docker版本
docker info #查看docker基本信息 我們可以通過docker info看到機器存放docker鏡像得地址,也可以看到docker倉庫的地址。 三、docker入門命令。1、搜索鏡像docker search docker search centos #從docker hub中搜索docker名為centos的鏡像
description:此鏡像的描述 stars:下載次數(shù) official:是否由官方提供(官方提供可放心下載,可以基于此鏡像做自己的鏡像) 2、拉取鏡像。docker pull== ,默認是拉去docker hub上搜索到的最新版本(第一個)。 docker pull centos
使用阿里云docker鏡像加速器。 {
'registry-mirrors': ['https://eu5rxjvf.mirror.']}systemctl daemon-reload #啟動配置
systemctl restart docker #重啟docker服務 配置好了之后,我們使用之前學的命令,docker info查看一下是否新增了阿里云的地址。 然后繼續(xù)使用docker pull centos,下載速度會很快。(由于作者已經(jīng)下載了centos,這里使用tomcat鏡像演示) 3、查看鏡像。拉去之后我們要如何看到我們下載下來的鏡像呢,這里我們就需要學習一個新命令。docker images,查看已下載鏡像。 docker images #查看已下載鏡像。
4、使用U盤的方式導入鏡像。比如把docker-centos-httpd.tar鏡像上傳到linux上,就需要用到==docker load -i ==命令。(記得帶上路徑,這里作者沒有錢買U盤,就不演示了) docker load -i /root/docker-centos-httpd.tar 導入之后可以使用docker images查看。 docker pull hub.c.163.com/library/tomcat:latest 注:docker鏡像相當于,對程序+程序依賴的庫直接打包(后期詳細解釋)。 四、Docker平臺的基本使用方法。很開心大家耐心的看到了這里,接下來我就會詳細講解docker的使用方法。 1、幫助命令。docker version #顯示docker詳細信息
docker info #顯示docker的系統(tǒng)信息,包括鏡像和容器的數(shù)量
docker --help #docker幫助命令手冊 2、鏡像命令。docker images #查看所有本地主機的鏡像 docker search 鏡像名 #搜索鏡像 docker pull 鏡像名 [標簽] #下載鏡像(如果不寫tag,默認是latest) docker rmi 鏡像名 [標簽] #刪除鏡像 docker rmi -f $(docker images -aq) 刪除全部鏡像 docker tag 鏡像名:版本 新鏡像名:版本 #復制鏡像并且修改名稱 docker commit -a 'xxx' -c 'xxx' 鏡像ID 名字:版本 #提交鏡像 -a :提交的鏡像作者;-c :使用Dockerfile指令來創(chuàng)建鏡像;-m :提交時的說明文字; docker load -i /xxx/xxx.tar #導入鏡像 docker save -o /xxx/xxx.tar #保存一個鏡像為一個tar包 3、容器命令。docker run [可選參數(shù)] image 命令 #啟動容器(無鏡像會先下載鏡像)
#參數(shù)說明--name = 'Name' 容器名字-c 后面跟待完成的命令-d 以后臺方式運行并且返回ID,啟動守護進程式容器-i 使用交互方式運行容器,通常與t同時使用-t 為容器重新分配一個偽輸入終端。也即啟動交互式容器-p 指定容器端口 -p 容器端口:物理機端口 映射端口-P 隨機指定端口-v 給容器掛載存儲卷
docker build #創(chuàng)建鏡像 -f:指定dockerfile文件路徑 -t:鏡像名字以及標簽
docker logs 容器實例的ID #查看容器日志
docker rename 舊名字 新名字 # 給容器重新命名
docker top 容器實例的ID #查看容器內(nèi)進程
docker ps -a #列出所有容器(不加-a就是在運行的)
docker rm 容器實例的ID #刪除容器(正在運行容器不能刪除,除非加-f選項)
docker kill 容器實例的ID #殺掉容器
docker history 容器實例的ID #查看docker鏡像的變更歷史
docker start 容器實例的ID #啟動容器
docker restart 容器實例的ID #重啟容器
docker stop 容器實例的ID #停止正在運行的容器
docker attach /docker exec 容器實例的ID #同為進入容器命令,不同的是attach連接終止會讓容器退出后臺運行,而exec不會。并且,docker attach是進入正在執(zhí)行的終端,不會情動新的進程,而docker exec則會開啟一個新的終端,可以在里面操作。
docker image inspect 容器名稱:容器標簽 #查看容器內(nèi)源數(shù)據(jù)
docker cp 容器id:容器內(nèi)路徑 目的主機路徑 #從容器內(nèi)拷貝文件到主機(常用)或者從主機拷貝到容器(一般用掛載)
exit #直接退出容器
crlt + P + Q #退出容器但是不終止運行 五、實戰(zhàn)測試:部署Nginx。1、搜索鏡像。docker search nginx 2、下載鏡像。docker pull nginx 3、查看鏡像。docker images 4、啟動容器。docker run -d --name nginx01 -p 80:80 nginx 5、查看容器。docker ps 6、測試訪問。curl 127.0.0.1:80 7、進入容器修改頁面。docker exec -it 容器ID /bin/bash 8、外網(wǎng)訪問。用公網(wǎng)IP,這里作者有域名(順便給自己的網(wǎng)站打個廣告,作者喜歡寫東西,如果有投稿之類的可以留言,我會篩選之后放到我的博客網(wǎng)站,當然也歡迎大家加入我,一起創(chuàng)建文字社區(qū)。 9、實戰(zhàn)總結。有的小伙伴不理解為什么要加/bin/bash,或者什么時候該加什么時候不加,這里我給大家解釋一下。 docker run [可選參數(shù)] image 命令 #啟動容器(無鏡像會先下載鏡像) #參數(shù)說明--name = 'Name' 容器名字-c 后面跟待完成的命令-d 以后臺方式運行并且返回ID,啟動守護進程式容器-i 使用交互方式運行容器,通常與t同時使用-t 為容器重新分配一個偽輸入終端。也即啟動交互式容器-p 指定容器端口 -p 容器端口:物理機端口 映射端口-P 隨機指定端口-v 給容器掛載存儲卷 大家注意-i 、 -t 、 -d這幾個參數(shù)。一般it連用表示給我一個可以操作的前臺終端。第二個呢就是id,以后臺守護進程的方式運行容器。這樣,我們就可以總結出兩種運行容器的命令模式。 第一種:交互方式創(chuàng)建容器,退出后容器關閉。
docker run -it 鏡像名稱:標簽 /bin/bash
第二種:守護進程方式創(chuàng)建容器。
docker run -id 鏡像名稱:標簽
通過這種方式創(chuàng)建的容器,我們不會直接進入到容器界面,而是在后臺運行了容器,
如果我們需要進去,則還需要一個命令。
docker exec -it 鏡像名稱:標簽 /bin/bash
通過這種方式運行的容器,就不會自動退出了。 六、鏡像原理。1、鏡像是什么?鏡像是一種輕量級的、可執(zhí)行的獨立軟件包。用來打包軟件運行環(huán)境和基于運行環(huán)境的開發(fā)軟件,它包含運行某個軟件所需要的內(nèi)容,包括代碼、運行時、庫、環(huán)境變量和配置文件。 2、Docker鏡像加載原理。UnionFS(聯(lián)合文件系統(tǒng)) 特性:一次同時加載多個文件系統(tǒng),但是從外面開起來,只能看一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,最終的文件系統(tǒng)會包含所有的底層文件和目錄。 Docker鏡像加載原理 rootfs(root file system),在bootfs之上。包含的就是典型Linux系統(tǒng)的/dev, /proc, /bin, /etc等等標準文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版本,比如Ubuntu、CentOS等。 如下圖: 3、分層理解。這里我用docker pull nginx命令,下載來一個鏡像給大家看看,框起來的是不是一層一層下載的。 我們通過docker image inspect ngixn:latest查看一下。 4、提交鏡像。這里大家看一下 1、命令。docker commit 提交容器成為一個新的副本 docker commit -m='提交的描述信息' -a='作者' 容器id 目標鏡像名:[TAG] 2、實驗。1、下載一個默認的tomcat,這里作者已經(jīng)下載好了,就不用再下載了。 七、Docker容器數(shù)據(jù)卷。1、容器數(shù)據(jù)卷介紹。docker容器在產(chǎn)生數(shù)據(jù)的時候,如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)作為鏡像的一部分保存下來,那么當容器刪除之后,數(shù)據(jù)自然而然的也會消失。為了能保存數(shù)據(jù),容器中引用了數(shù)據(jù)卷的概念。 2、作用以及特點。卷就是目錄或者文件,存在一個或者多個容器之中,由docker掛載到容器,但是不屬于聯(lián)合文件系統(tǒng),因此能夠繞過Union File System提供一些用于持續(xù)存儲或者共享數(shù)據(jù)的特性。 卷的設計目的就是數(shù)據(jù)的持久化,完全獨立于容器的生存周期,因此docker不會再容器刪除時刪除其掛載的數(shù)據(jù)卷。 它還存在以下幾種特點: 1、數(shù)據(jù)卷可在容器之間共享或者重用數(shù)據(jù)。 3、使用數(shù)據(jù)卷。方式一:直接使用命令來掛載 , -v docker run -it -v 主機目錄:容器目錄 /bin/bash 我們在創(chuàng)建容器之前,先看看掛載路徑上有沒有test01這個目錄,可以看到,是沒有的。執(zhí)行命令之后進入到容器內(nèi),我們ls看一下容器的home目錄,是空的。 docker run -it -v /home/test01:/home centos /bin/bash
4、具名掛載與匿名掛載。這里先教給大家一個新武器。 1、匿名掛載我們首先使用匿名掛載的命令啟動一個容器。 docker run -d -P --name=nginxt01 -v /etc/nginx nginx 然后使用剛剛教給大家的新武器查看卷。 2、具名掛載。具名掛載就很簡單了,跟我們之前演示的指定路徑掛載很相似,這里給大家簡單地演示一下。 同樣,我們使用具名掛載的方式啟動一個容器。 docker run -d -P --name=nginxt02 -v jumingguazai:/etc/nginx nginx docker volume ls 查看卷 這就是具名掛載。 如何確定是具名掛載還是匿名掛載:
-v 容器內(nèi)路徑 #匿名掛在
-v 卷名:容器內(nèi)路徑 #具名掛在
-v /宿主機路徑:容器內(nèi)路徑 # 指定路徑掛載 tips: 通過 -v 容器內(nèi)路徑 :ro rw 可以改變讀寫權限 ro readonly #只讀 rw readwrite #可寫可讀 例: docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx 八、Dockerfile。1、什么是Dockerfile?Dockerfile是一個創(chuàng)建鏡像所有命令的文本文件,包含了一條條指令和說明, 每條指令構建一層,,通過docker build命令,根據(jù)Dockerfile的內(nèi)容構建鏡像,因此每一條指令的內(nèi)容, 就是描述該層如何構建。有了Dockefile,,就可以制定自己的docker鏡像規(guī)則,只需要在Dockerfile上添加或者修改指令,,就可生成docker 鏡像。 2、Dockerfile構建過程。dockerfile的關鍵字建議使用大寫,它是從上往下按照循序執(zhí)行的,在dockerfile中,#代表注釋。我們可以通過這個腳本來生成鏡像,腳本中的每一個命令,都是一層鏡像。 我們先通過下面這張圖片來理解一下鏡像的構成以及運行過程。 dockerfile是面向開發(fā)的,發(fā)布項目做鏡像的時候就要編寫dockerfile文件。 3、Dockerfile 指令選項。Dockerfile 指令選項:
FROM #基礎鏡像 。 (centos)
MAINTAINER #鏡像的作者和郵箱。(已被棄用,結尾介紹代替詞)
RUN #鏡像構建的時候需要執(zhí)行的命令。
CMD #類似于 RUN 指令,用于運行程序(只有最后一個會生效,可被替代)
EXPOSE #對外開放的端口。
ENV #設置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個環(huán)境變量。
ADD # 步驟:tomcat鏡像,這個tomcat壓縮包。添加內(nèi)容。
COPY #復制指令,將文件拷貝到鏡像中。
VOLUME #設置卷,掛載的主機目錄。
USER #用于指定執(zhí)行后續(xù)命令的用戶和用戶組,
這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。
WORKDIR #工作目錄(類似CD命令)。
ENTRYPOINT #類似于 CMD 指令,但其不會被 docker run
的命令行參數(shù)指定的指令所覆蓋,會追加命令。
ONBUILD #當構建一個被繼承Dokcerfile,就會運行ONBUILD的指令。出發(fā)執(zhí)行。
注意:CMD類似于 RUN 指令,用于運行程序,但二者運行的時間點不同:
CMD 在docker run 時運行。
RUN 是在 docker build。
作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。
CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運行的程序所覆蓋。
如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。
LABEL(MAINTALNER已經(jīng)被棄用了,目前是使用LABEL代替)
LABEL 指令用來給鏡像添加一些元數(shù)據(jù)(metadata),以鍵值對的形式,語法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我們可以添加鏡像的作者:
LABEL org.opencontainers.image.authors='runoob' Tips:構建鏡像99%都是從scratch開始的,但是這個鏡像是個虛擬的概念,并不實際存在,表示一個空白的鏡像。 這里帶大家回顧一下docker history命令。接下來我們就要用dockfile制作屬于自己的鏡像了。 九、實戰(zhàn)測試:制作鏡像并且發(fā)布外網(wǎng)。1、注冊docker hub 賬號。網(wǎng)址:https://hub./ 2、服務器上使用命令行登陸。命令 docker login -u [賬號名字] #登陸命令 docker out #退出命令 docker push 賬號/容器名字:版本號
3、構建鏡像。1、創(chuàng)建工作目錄。mkdir dockerfile
cd dockerfile
ls 2、編寫dockerfile。首先,我們知道官方默認的鏡像,比如centos鏡像里面,沒有vim、ipconfig等命令,我們就基于此,創(chuàng)建此鏡像。 vim mydockerfile FORM centos
MAINTAINER ydk<123@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim-enhanced
RUN yum -y install net-tools
EXPOSE 80
CMD echo #MYPATH
CMD echo '------------END-------------'
CMD /bin/bash 3、構建dockerfile。docker build 命令: docker build -f mydockerfile-t mycentos:1.0 .
到這里,我們就制作好了我們自己的鏡像,雖然它并沒有什么用。 4、推送鏡像至docker hub。官方文檔要求,我們推送的鏡像名字必須是YOUR_DOCKER_HUB_ID/XXXX,所以我們需要給鏡像換一個名字 docker tag mycentos/1.0 自己的賬號名字/mytomcat
docker push 自己的賬號名字/mytomcat
鏡像有點大,所以請耐心等待一下。等了幾分鐘之后,我們登陸docker hub就可以看到我們剛剛推送上去的鏡像啦,這個鏡像可是全世界人民都看得到的哦,是不是有點小激動呢! 十、Docker網(wǎng)絡。1、本機網(wǎng)絡理解。我們使用ifconfig可以看到三組網(wǎng)絡。 brctl show 2、清空本機docker環(huán)境。docker rm -f $(docker ps -aq)docker rmi -f $(docker images -aq) 3、veth-pair技術。什么是veth-pair技術?要理解它,我們首先來啟動兩個tomcat容器。 docker run -d -P --name=tomcat01 tomcat:7docker run -d -P --name=tomcat02 tomcat:7提示:選擇tomcat7是因為這個鏡像包含了ip addr 等常用命令! 啟動機器之后,我們查看容器ip,通過容器的ip 去ping宿主機ip,發(fā)現(xiàn)是通的。 docker exec -it tomcat01 ip addr ping 172.17.0.3
使用ip addr命令,查看我們的網(wǎng)卡。 什么是veth-pair? 4、docker網(wǎng)絡詳解。我們來繪制一個簡單的網(wǎng)絡模型,這樣veth-pair的作用就清晰明了了。 5、docker網(wǎng)絡模式。1、docker網(wǎng)絡模式有以下幾種:Host:容器不會虛擬出自己的網(wǎng)卡,配置主機的IP等,而是使用宿主機的IP和端口
Container: 創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP。(一般不用)
None: 該模式關閉了容器的網(wǎng)絡功能。(一般不用)
Bridge:默認為該模式(橋接,自己創(chuàng)建也是用它),此模式會為每一個容器分配,設置IP等,并將容器連接到一個docker0 的虛擬網(wǎng)橋,通過docker 0 網(wǎng)橋以及iptables nat 表配置與宿主機通信。 docker network ls #列出docker網(wǎng)卡 2、創(chuàng)建自定義網(wǎng)絡的容器:我們直接啟動命令, --net bridge,就是docker0(默認)
docker run -d -P --name=tomcat01 --net bridge tomcat
docker0特點:默認,域名不能訪問,--link不建議使用 下面我們自己來創(chuàng)建一個bridge。 docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 testnet docekr network ls 只需要兩條命令,你就創(chuàng)建完了自己的網(wǎng)絡! docker network inspect 網(wǎng)卡名字 #查看網(wǎng)卡詳細信息 3、發(fā)布兩個在自己創(chuàng)建的網(wǎng)絡里的容器。docker run -d -P --name=tomcat01-net --net=testnet tomcat:7docker run -d -P --name=tomcat02-net --net testnet tomcat:7 然后使用docker network inspect testnet,就可以看到剛才創(chuàng)建的這兩個容器的IP了。 docker exec -it tomcat01-net ping -c 3 IP
docker exec -it tomcat01-net ping -c 3 tomcat02-net
提示,ping -c可以自定義ping的次數(shù) 總結到這里,我們學習docker的腳步就告一段落了。陸陸續(xù)續(xù)寫了大半個月,我也終于寫完了我在CSDN的第一篇文章。希望我的付出,能帶給大家學習的動力,容器其實并不難掌握,大家可能在剛剛接觸的時候很迷茫,不知道這是個啥。其實沒有關系,在你用著用著之后,容器的概念就會在你的腦子里漸漸形象起來。很感謝你看了這里,我也很希望能讓你對容器,有一定的認識,哈哈哈,就先寫到這兒吧,以后我還會更新其他內(nèi)容的,歡迎大家的關注。 |
|