Docker的一些概念 docker image docker鏡像 即容器模板,操作系統+軟體運⾏環境+⽤戶程式 類似於安裝操作系統的windows鏡像、centos鏡像,只是一個模板 Docker container docker容器 容器是從鏡像運行的實例,比如用tomcat鏡像運行tomcat ...
Docker的一些概念
- docker image docker鏡像
即容器模板,操作系統+軟體運⾏環境+⽤戶程式
類似於安裝操作系統的windows鏡像、centos鏡像,只是一個模板
- Docker container docker容器
容器是從鏡像運行的實例,比如用tomcat鏡像運行tomcat,就得到一個tomcat容器
容器,是應用程式的容器,tomcat容器是運行tomcat的,mysql容器是運行mysql的,微服務的容器是運行某個微服務的
一個鏡像可運行多個容器(實例),好比一個類可以new多個對象,這個容器是相互隔離的,互不影響。
- Docker registerie docker倉庫
⽤於存儲鏡像,分為公有倉庫、私有倉庫,好⽐Maven的中央倉庫和本地倉庫。
docker的公有倉庫在國外,訪問速度慢,需要我們配置一下國內的鏡像,常用的鏡像加速器比如阿裡雲、網易的
配置阿裡雲的鏡像加速器
登錄阿裡雲,搜索容器鏡像服務 -> 找到鏡像加速器 -> centos,把那一串命令複製到centos上執行即可
每個人分配的加速器地址不同,需要登錄阿裡雲才會分配加速器地址。
啟動、停止Docker
啟動docker:systemctl start docker
停止docker:systemctl stop docker
重新載入docker的配置:systemctl daemon-reload
重啟docker:systemctl restart docker
image 鏡像常用命令
在公有倉庫中搜索鏡像:docker search tomcat
此處是搜索tomcat的鏡像,會列出相關的所有鏡像,包括官方的、組織機構、個人上傳的
只列出官方的鏡像:docker search --filter is-official=true tomcat
只列出star數>=10的鏡像:docker search --filter stars=10 tomcat
下載|拉取鏡像:docker pull tomcat:9
冒號後面指定版本,如果不指定,預設下載公有倉庫中的最新版latest,下載到本地倉庫
docker鏡像的體積很大,往往幾百兆、幾個G,因為鏡像不僅包含應用程式,還包含了所需的環境、依賴。
查看本地倉庫中的鏡像:docker images
第一列是鏡像名稱,第二列tag是鏡像的版本號,最新版不會顯示具體的版本號,會顯示為latest
刪除本地倉庫中的鏡像:docker rmi tomcat:9 #刪除tomcat:9這個鏡像,rmi即remove image
container 容器常用命令
從鏡像運行一個容器:docker run -itd --name=tomcat1 tomcat:9
-it:都要有,以交互方式運行容器,分配命令行等交互資源
-d:以守護線程的方式在後臺運行,比如不使用-d,運行後當前標簽頁不可用,需重起一個標簽頁執行命令,如果關閉當前標簽頁或在當前標簽頁中Ctrl+C,都會終止該容器的運行。
--name:指定容器的name,如果不使用--name,會自動化分配一個name
如果不指定鏡像的版本號,預設使用最新版latest,如果本地倉庫沒有最新版,會自動從公有倉庫拉取
-d會返回容器id,很長,往往只取一部分。id、name都唯一標識一個容器
啟動容器:docker start id|name
停止:docker stop id|name
重啟:docker restart id|name
docker run是創建並運行容器,docker start是運行一個已存在的容器
有些容器在docker run創建運行時,需要設置參數,比如msyql就需要設置資料庫密碼,如果不設置參數,會創建但啟動失敗
容器的環境都是打包好的,環境沒有問題,如果使用docker run或docker start啟動失敗,說明沒有設置某些參數
查看正在運行的所有容器:docker ps #第一列id就只列出了id的一部分,這一部分也可以唯一標識一個容器
查看所有容器:docker ps -a #a即all,正在運行+停止
狀態一欄,Up表示該容器正在運行,Exited表示該容器處於停止狀態,時間是停止|啟動了多久
查看容器的詳細信息:docker inspect id|name
重命名容器:docker rename id|name newName
刪除容器:docker rm id|name #容器要是已停止的才能刪除。rm是刪除容器,rmi是刪除鏡像,i是images
強制刪除容器:docker rm -f id|name #如果容器正在運行,也能刪除
進入容器:docker exec -it id|name /bin/bash
一個容器就是一個虛擬機,進入容器相當於進入一個Linux伺服器,照樣可以執行linux命令,可以修改容器配置、程式參數
該容器處於運行狀態才能進入
exit #退出容器,只是退出該容器的命令行,該容器仍在運行
批量操作容器:
那些根據id|name操作單個容器的命令,都可以同時操作多個容器,
eg. docker start id1|name1 id2|name2 #啟動多個容器,空格間隔
可以用 $(docker ps -aq) 表示所有容器的id|name(正在運行+已停止)
eg. docker start $(docker ps -aq) #啟動所有容器
容器、宿主機之間的文件複製
從宿主機複製到容器:docker cp srcPath id|name:distPath
從容器複製到宿主機:docker cp id|name:srcPath distPath
eg. 假設容器的name是tomcat1
docker cp /root/1.txt tomcat1:/usr/local/ #把宿主機上的/root/1.txt複製到tomcat1的/usr/local/下
docker cp tomcat1:/usr/local/1.txt /root/2.txt #把容器tomcat1中的/usr/local/1.txt複製到宿主機的/root/下,文件名使用2.txt
註意:
docker cp這個命令是在宿主機上執行的,宿主機安裝了docker,才可以執行docker命令
不是在docker exec進入容器執行的,容器沒有安裝docke,不能執行docker命令
宿主機上的文件路徑可以寫相對路徑或者絕對路徑,不知道當前路徑的可以用pwd命令查看
容器掛載
一個容器是運行在一個單獨的虛擬的Linux上,每個容器都對應一個單獨的Linux,
應用安裝在這個Linux的/usr/local/下,比如tomcat安裝位置是與之對應的Linux的/usr/local/tomcat
容器使用的文件系統是與之對應的Linux的文件系統,不是宿主機的文件系統,在宿主機上看不到容器對應的Linux上的文件。
宿主機、容器文件系統的隔離造成了一個問題:如果容器故障,容器的數據全部丟失
容器掛載是使用宿主機的某個文件夾作為容器文件系統的某個目錄,宿主機、容器都可以訪問、操作這個目錄,這個目錄在宿主機、容器中的狀態、數據是一致的
比如說把容器tomcat3掛載到宿主機的/usr/local/tomcat3:
mkdir /usr/local/tomcat3 #在宿主機上新建一個目錄用於掛載容器
docker run -itd -v /usr/local/tomcat:/usr/local/tomcat/webapps --name=tomcat3 tomcat:9 #前面是宿主機的path,後面是容器的path,會把宿主機的path映射為容器的指定path
以後在tomcat上部署項目時,直接把項目放在宿主機的/usr/local/tomcat下即可,這個目錄就是容器的tomcat的webapps目錄
如果容器故障,這個目錄還在,重新掛載一個tomcat容器即可,不需要重新部署項目
容器掛載的優點
- 操作簡便,不用進入容器操作文件、目錄,直接在宿主機就可以操作
- 數據安全,可以映射為重要數據的存儲目錄,比如作為redis的數據存儲目錄,容器故障,目錄還在,數據還在,不會丟失
容器掛載十分常用
Docker鏡像層、容器層
鏡像是一個只讀模板,docker run創建容器時都是從鏡像中讀取數據,放到記憶體中,每個容器占據單獨的記憶體空間。
鏡像中的數據只讀,容器中的數據可讀可寫。