Docker容器学习(一)
文章目錄
- 前言:
- 一、Docker 概述:
- 1、Docker 簡介:
- 2、對比傳統虛擬機:
- 二、基本概念:
- 1、鏡像(image):
- 2、容器(container):
- 3、倉庫(repository)
- 三、Docker 安裝
- 第一步:卸載舊版本
- 第二步:更新apt包索引和安裝包,以允許apt使用HTTPS存儲庫:
- 第三步:添加Docker官方的GPG密鑰
- 第四步:設置鏡像的倉庫
- 第五步:更新apt包索引
- 第六步:安裝最新版本的Docker Engine和containerd
- 第七步:使用docker version查看是否安裝成功
- 第九步:測試 hello-world
- 最后:查看下載的鏡像
- 補充:
- 四、Docker運行原理:
- 1、回顧 HelloWorld 流程:
- 2、Docker是怎么工作的?
- 3、Docker 為什么比 VM 快?
- 五、Docker的常用命令:
- 1、幫助命令:
- 2、鏡像命令:
- 3、容器命令:
- 4、常用其他命令:
- 5、Docker可視化:
- 六、Docker鏡像講解:
- 1、Docker鏡像加載原理:
- 2、分層理解:
- 3、Commit 鏡像:
前言:
廢話就不說了,抓緊時間學習。docker yyds!
一、Docker 概述:
1、Docker 簡介:
Docker 是一個開源的應用容器引擎,可以將你的開發環境、代碼、配置文件等一并打包到這個容器中,并發布和應用到任意平臺。比如,你在本地用 Python 開發網站后臺,開發測試完成后,就可以將 Python3 及其依賴包、Flask 及其各種插件、Mysql、Nginx 等打包到一個容器中,然后部署到任意你想部署到的環境。
Docker 的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規整的擺放起來。并且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那么就不需要專門運送水果的船和專門運送化學品的船了。
Docker基于Go語言開發的!開源項目!
2、對比傳統虛擬機:
在容器技術出來之前,我們都是使用虛擬機技術,虛擬機相較于 docker 容器很笨重。
二、基本概念:
Docker 包括三個基本概念:
-
鏡像(Image)
-
容器(Container)
-
倉庫(Repository)
理解了這三個概念,就理解了 Docker 的整個生命周期。
1、鏡像(image):
類似于虛擬機中的鏡像,是一個包含有文件系統的面向 docker 引擎的只讀模板。任何應用程序運行都需要環境,而鏡像就是用來提供這種運行環境的。例如一個 Ubuntu 鏡像就是一個包含 Ubuntu 操作系統環境的模板。
2、容器(container):
鏡像和容器的關系,就像是面向對象程序設計中的 “類” 和 “實例” 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。可以將其看作一個簡易的Linux系統 以及運行在其中的應用程序。Docker利用容器來運行、隔離各個應用。容器是鏡像創建的應用實例,可以創建、啟動、停止、刪除容器,各個容器之間是是相互隔離的,互不影響。
3、倉庫(repository)
倉庫就是用來集中存放鏡像文件的地方。類似于代碼倉庫,這里是鏡像倉庫,分為公有倉庫和私有倉庫。注意與注冊服務器(Registry)的區別:注冊服務器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放鏡像的地方,一般每個倉庫存放一類鏡像,每個鏡像利用 tag 進行區分,比如 Ubuntu 倉庫存放有多個版本(12.04、14.04等)的 Ubuntu 鏡像。
目前最用的 Registry 是官方的 Docker Hub,這也是默認的 Registry,擁有大量的高質量的官方鏡像 。除此以外,還有 Red Hat 的 Quay.io ;Google 的 Google Container Registry,Kubernetes (K8s) 的鏡像使用的就是這個服務;以及代碼托管平臺 GitHub 推出的 ghcr.io。
三、Docker 安裝
Docker 可以安裝在 Windows、Linux、Mac 等各個平臺上。具體可以查看文檔 Install Docker。
環境準備: Linux要求內核3.0以上
查詢內核版本命令:
uname -r
這里使用的OS是Ubuntu,可以看到 版本是符合要求的。
準備好環境之后,接下來按著官方文檔來一步一步安裝。
這里使用官方推薦的第一種方法安裝。
第一步:卸載舊版本
sudo apt-get remove docker docker-engine docker.io containerd runc如果有的話就卸,沒有則省略。
第二步:更新apt包索引和安裝包,以允許apt使用HTTPS存儲庫:
sudo apt-get updatesudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release第三步:添加Docker官方的GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg第四步:設置鏡像的倉庫
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
這里默認是從國外的,不推薦,推薦使用國內的。
第五步:更新apt包索引
sudo apt-get update第六步:安裝最新版本的Docker Engine和containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io # docker-ce 社區版 而ee是企業版🆗,至此安裝完成!如果 Docker 沒啟動的話,先啟動一下。
sudo systemctl start docker第七步:使用docker version查看是否安裝成功
sudo docker version
出現這個頁面就是成功安裝了!
第九步:測試 hello-world
sudo docker run hello-world
hello-world 第一次需要先下載。
最后:查看下載的鏡像
docker images
🆗,都沒什么問題!
補充:
1、卸載 Docker:
#1.卸載 Docker Engine、CLI 和 Containerd 包: sudo apt-get purge docker-ce docker-ce-cli containerd.io#2. 刪除所有鏡像、容器和卷 //主機上的映像、容器、卷或自定義配置文件不會自動刪除。 sudo rm -rf /var/lib/docker # /var/lib/docker 是docker的默認工作路徑! sudo rm -rf /var/lib/containerd2、阿里云鏡像加速:
因為默認的 docker 倉庫是國外的,所以這里把倉庫改為aliyun的。
依次執行下面命令:
四、Docker運行原理:
1、回顧 HelloWorld 流程:
run的流程圖:
2、Docker是怎么工作的?
Docker是一個 C/S 結構的系統,Docker的守護進程運行在主機上。通過 Socket 從客戶端訪問。
Docker-Server 接收到 Docker-Client 的指令,就會執行這個命令。
3、Docker 為什么比 VM 快?
1、Docker 有著比虛擬機更少的抽象層。由于 docker 不需要 Hypervisor 實現硬件資源虛擬化,運行在 docker 容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內存利用率上docker將會在效率上有明顯優勢。
2、docker 利用的是宿主機的內核,vm 需要 Guest OS。
-
GuestOS: VM(虛擬機)里的的系統(OS)
-
HostOS:物理機里的系統(OS)
因此,當新建一個容器時,docker 不需要和虛擬機一樣重新加載一個操作系統內核。虛擬機加載 GuestOS,是分鐘級別的。而 docker 直接利用宿主機的操作系統,省略了這個復雜的過程,因此新建一個 docker 容器只需要幾秒鐘。
五、Docker的常用命令:
1、幫助命令:
docker version #顯示docker的版本信息。 docker info #顯示docker的系統信息,包括鏡像和容器的數量 docker 命令 --help #幫助命令2、鏡像命令:
docker images #查看所有本地主機上的鏡像 可以使用 docker image ls代替 docker search #搜索鏡像 docker pull #下載鏡像 = docker image pull docker rmi #刪除鏡像 = docker image rmdocker images 查看所有本地主機上的鏡像:
docker search 搜索鏡像:
docker pull 下載鏡像:
#下載鏡像 docker pull 鏡像名 smk@ubuntu:~$ sudo docker pull mysql Using default tag: latest #如果不寫tag,默認就是latest latest: Pulling from library/mysql 33847f680f63: Pull complete #分層下載: docker image 的核心 聯合文件系統 5cb67864e624: Pull complete 1a2b594783f5: Pull complete b30e406dd925: Pull complete 48901e306e4c: Pull complete 603d2b7147fd: Pull complete 802aa684c1c4: Pull complete 715d3c143a06: Pull complete 6978e1b7a511: Pull complete f0d78b0ac1be: Pull complete 35a94d251ed1: Pull complete 36f75719b1a9: Pull complete Digest: sha256:8b928a5117cf5c2238c7a09cd28c2e801ac98f91c3f8203a8938ae51f14700fd #簽名 防偽 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真實地址#二者等價 docker pull mysql docker pull docker.io/library/mysql:latest指定版本下載:
docker rmi 刪除鏡像:
docker rmi -f 鏡像id #刪除指定的鏡像 docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id #刪除指定的鏡像 docker rmi -f $(docker images -aq) #刪除全部的鏡像
注意這里不是root用戶,需要加 sudo
3、容器命令:
docker run 鏡像id #新建容器并啟動 docker ps #列出所有運行的容器 docker rm 容器id #刪除指定容器 docker start 容器id #啟動容器 docker restart 容器id #重啟容器 docker stop 容器id #停止當前正在運行的容器 docker kill 容器id #強制停止當前容器有了鏡像才可以創建容器;先下載一個 centos 鏡像來測試:
docker pull centos新建容器并啟動(注意和 start 的區別,start 只能啟動):
docker run [可選參數] 鏡像名 #參數說明 --name="Name" 容器名字 tomcat01 tomcat02 用來區分容器 -d 后臺方式運行 -it 使用交互方式運行(就是進入容器內) -p 指定容器的端口 -p 8080(宿主機):8080(容器)#一共有四種用法:-p ip:主機端口:容器端口-p 主機端口:容器端口(常用)-p 容器端口容器端口 -P(大寫) 隨機指定端口啟動并進入容器:
/bin/bash:即啟動 bash類型的shell。
退出容器:
exit #容器停止并退出 ctrl +P +Q #容器不停止退出列出所有運行的容器:
啟動和停止容器:
docker start 容器id #啟動容器 docker restart 容器id #重啟容器 docker stop 容器id #停止當前正在運行的容器 docker kill 容器id #強制停止當前容器刪除容器:
docker rm 容器id #刪除指定的容器,不能刪除正在運行的容器,如果要強制刪除 rm -f docker rm -f $(docker ps -aq) #強制刪除所有的容器 docker ps -a -q|xargs docker rm #刪除所有的容器4、常用其他命令:
后臺啟動:
docker run -d 鏡像名
一個小坑:
docker ps 發現 centos 停止了
原因是:docker容器使用后臺運行,就必須要有要一個前臺進程,docker 沒有發現前臺進程,就會自動停止。
常見:nginx,容器啟動后,發現自己沒有提供服務,就會立刻停止,就是沒有程序了
查看容器中進程信息:
docker top 容器id
注:必須是運行的容器。
進入當前正在運行的容器:
我們通常容器都是使用后臺方式運行的,需要進入容器,修改一些配置。命令:
docker exec -it 容器id bashshell # 方式二 docker attach 容器id #區別 docker exec #進入當前容器后開啟一個新的終端,可以在里面操作。(常用) docker attach # 進入容器正在執行的終端從容器內拷貝到主機上:
docker cp 容器id:容器內路徑 主機目的路徑例:
5、Docker可視化:
portainer 是 docker 圖形化界面管理工具!提供一個后臺面板供我們操作!(不建議使用)
#官網查找安裝命令 docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce訪問:
進來之后就是這樣。
可以看到一些本地docker的配置
六、Docker鏡像講解:
1、Docker鏡像加載原理:
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統 UnionFS(下載的時候看到一層層的下載就是這個) 。
UnionFs (聯合文件系統):Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
bootfs(boot file system):主要包含 bootloader 和 Kernel(內核),bootloader 主要是引導加載 kernel,Linux 剛啟動時會加 bootfs 文件系統,在 Docker 鏡像的最底層是 bootfs。這一層與我們典型的 Linux/Unix 系統是一樣的,包含 boot加載器和內核。當 boot 加載完成之后整個內核就都在內存中了,此時內存的使用權已由 bootfs 轉交給內核,此時系統也會卸載 bootfs。
rootfs(root file system),在 bootfs 之上。包含的就是典型 Linux 系統中的 /dev,/proc,/bin,/etc 等標準目錄和文件。 rootfs 就是各種不同的操作系統發行版,比如 Ubuntu,Centos 等等。
平時安裝的虛擬機的 CentOS 都是好幾個G,為什么 Docker 這里才200M?
- 對于個精簡的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序庫就可以了,因為底層直接用 Host(主機) 的 kernel,自己只需要提供 rootfs 就可以了。由此可見對于不同的 Linux 發行版, bootfs 基本是一致的, rootfs 會有差別,因此不同的發行版可以公用 bootfs.
2、分層理解:
思考:為什么Docker鏡像要采用這種分層的結構呢?
- 最大的好處:資源共享,比如有多個鏡像都從相同的 Base鏡像構建而來,那么宿主機只需在磁盤上保留一份base鏡像,同時內存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。
例如:當系統中已經有了 CentOS 鏡像,那么后面再有用到 CentOS 鏡像的就不用再下載一次了。
查看鏡像分層的方式可以通過docker image inspect 命令:
3、Commit 鏡像:
Docker 鏡像都是只讀的,當容器啟動時,一個新的可寫層加載到鏡像的頂部。
這一層就是我們通常說的容器層,容器之下的都叫鏡像層!
如果想要保存當前容器的狀態,就可以通過 commit 來提交,獲得一個鏡像,就好比使用虛擬機的快照。
命令:
docker commit -m="描述信息" -a="作者" 容器id 目標鏡像名:[TAG]實戰測試:
1、啟動一個tomcat
docker run -d -p 8080:8080 tomcat:9.02、發現這個默認的 tomcat 是沒有 webapps 應用
docker exec -it 容器id3、自己拷貝文件進去
cp -r webapps.dist/* webapps4、將操作過的容器通過 commit 提交為一個鏡像
docker commit -a="smk" -m="add webapps" 容器id tomcat02:1.0
這樣以后就可以使用我們修改過的鏡像了,這就是我們自己的一個修改的鏡像。
🆗,至此 Docker入門成功!
總結
以上是生活随笔為你收集整理的Docker容器学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 练习(一)——搭建web服
- 下一篇: sqlmap —— os-shell参数