一個java web工程,由於開發階段須要安裝jdk、tomcat、mysql、redis、nginx等等軟件,在部署在其餘平臺有須要從新安裝一遍,特別作集羣安裝很是浪費時間
,並且軟件版本的不一樣,各類配置文件,很容易致使誇平臺部署沒法運行,docker的出現,解決了運行環境和配置的問題,方便持續集成並有助於總體發佈容器虛擬化技術,目的就是「一次封裝,導出運行」。java
虛擬機:帶環境安裝的一種解決方案,模擬一整套操做系統,佔用資源多,啓動很是慢。
linux容器(docker):不須要捆綁一整套操做系統,也沒有對硬件進行虛擬,而只對進程進行隔離,只須要本身須要的資源,直接運行與宿主內核,容器沒有本身的內核mysql
倉庫、鏡像、容器linux
docker images
-a // 顯示全部(含中間層)
-q //只顯示鏡像id
--digests // 顯示鏡像摘要信息
--no-trunc // 顯示完整鏡像信息nginx
docker search [option] imageName
--no-trunc
-s //列出收藏數不小於的指定數的鏡像 如:docker search -s 30 tomcat
--automated // 只列出automated build類型的鏡像web
docker pull imageNmae[:tag]
tag通常表示版本信息,不寫的話,默認:latest最新版本redis
docker rmi -f imageId(或者imageName[:tag])
刪除多個:docker rmi -f tomcat nginx
或者 docker rmi -f $(docker images -qa)
sql
啓動容器(經過鏡像構建容器實例)
docker run [option] imageId(name) [command] [args..]
docker
>**OPTIONS** 說明(經常使用):有些是一個減號有些是兩個減號 --name="容器新名字" 爲容器指定一個名稱 -d: 後臺運行容器,並返回容器|D,也即啓動守護式容器 -i: 以交互模式運行容器,一般與+同時使用; -t: 爲容器從新分配一個僞輸入終端,一般與i同時使用; -P: 隨機端口映射; -p: 指定端口映射,有如下四種格式 ip: hostPort: container Port ip: :container Port hostPort: containerPort containerPort
docker ps [option]
docker ps [option]
如:docker ps
默認顯示正在運行的容器
如:docker ps -n 10
顯示最近建立的10個容器centos
>**OPTIONS**(經常使用): -a: 列出當前全部正在運行的容器+歷史上運行過的 -l: 顯示最近建立的容器。 -n: 顯示最近n個建立的容器 -q: 靜默模式,只顯示容器編號 -no- trunc: 不截斷輸出。
退出容器
exit:中止容器並退出
ctrl+p+q :不中止容器退出tomcat
進入未中止的容器(交互)
docker attach 容器id(name)
docker exec -it 容器id(name) /bin/bash (進入交互模式)
補充:docker exec -it 容器id(name) ls -l (不進入,只交互一次)
中止容器或強制中止
docker stop 容器name(容器id)
docker kill 容器name(容器id)
啓動容器或重啓
docker start 容器name(容器id)
docker restart 容器name(容器id)
刪除容器
刪除單個:docker rm [-f] 容器name(容器id)
刪除多個:docker rm [-f] $(docker ps -a -q)
或者 docker ps -a -q | xargs docker rm
注意:-f 表示強制刪除 ,不加-f ,能夠只刪除已中止的容器
查看容器(運行中)內部細節
docker inspect 容器id(name)
查看容器進程
docker top 容器id(name)
容器日誌
docker logs -t -f --tail 5 容器id
拷貝容器內文件到主機
docker cp 容器id:容器類文件路徑 目的主機路徑
補充
docker run-d 容器名
使用鏡像 centos: latest之後臺模式啓動一個容器如
docker run -d centos
問題: 而後 docker ps-a進行查看,會發現容器已經退出
很重要的要說明的一點:Dker容器後臺運行,就必須有一個前臺進程,容器運行的命令若是不是那些一直掛起的命令(好比運行top,tail),就是會自動退出的。這個是 docker的機制問題,好比你的web容器,咱們以 ngInx爲例,正常狀況下,咱們配置啓動服務只須要啓動響應的 service便可。例如service nginx start。可是,這樣作, ngInx爲後臺進程模式運行就致使 docker前臺沒有運行的應用,
這樣的容器後臺啓動後,會當即自殺由於他以爲他沒事可作了。因此,最佳的解決方案是,將你要運行的程序之前臺進程的形式運行
鏡像
是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的全部內容包括代碼、運行時、庫、環變量和配置文件
Docker鏡像加轂原理
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統 UnionFS。
bootfs( boot file system)主要包含 bootloader和kernel, bootloader主要是引導加載kernel,Lnux剛啓動時會加載 bootfs文件系統,在
Docker鏡像的最底層是 bootfs。這一層與咱們典型的 Linux/Unix系統是同樣的,包含boot加載器和內核。當boot加載完成以後整個內核
就都在內存中了,此時內存的使用權已由 bootfs轉交給內核,此時系統也會卸載 bootfs
rootfs( root file system),在 bootfs之上·包含的就是典型 Linux系統中的ldev,/proc,/bin,/etc等標準目錄和文件。 rootfs就是各類不
同的操做系統發行版,好比 Ubuntu, Centos等等
對於一個精簡的OS,root能夠很小,只須要包括最基本的命令、工具和程序庫就能夠了,由於底層直接用Host的kernel,自已己只須要
提供 rootfs魷行了。因而可知對於不一樣的nux發行版,boot基本是一致的, rootfs會有差異,所以不一樣的發行版能夠公用bootfs
聯合文件系統
Union FS(聯合文件系統); Union文件系統( UnionFS)是一種分層、輕量級而且高性能的文件系統,它支持對文件系統的修改做爲
交來一層層的疊加,同時能夠將不一樣目錄掛載到同一個虛擬文件系統下 unite several directories into a single virtual
filesystem) Union文件系統是 Docker鏡像的基礎。鏡像能夠經過分層來進行繼承,基於基礎鏡像(沒有父鏡像),能夠製做各類具
體的應用鏡像
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文
件系統會包含全部底層的文件和目錄
docker commit -m="描述信息" -a="做者" 容器id 新鏡像名稱[:tag]
容器的持久化 、容器間繼承+共享數據
卷就是目錄或文件,存在於一個或多個容器中,由 docker掛載到容器,但不屬於聯合文件系統,所以可以繞過 Union File Systen提供一些用於持續存儲或共享數據的特性
卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以 Docke不會在容器刪除時刪除其掛載的數據卷
特色:
1:數據卷可在容器之間共享或重用數據
2:卷中的更改能夠直接生效
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命週期一直持續到沒有容器使用它爲止
添加數據卷
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
(帶權限 ,ro 表示內文件只讀)
還有一種方式,dockerfile,看後面筆記
數據卷容器
命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共亨,掛載數據卷的容器,稱之爲數據卷容器
docker run -it --name name2 volumes-from name1 鏡像名
說明:同一個鏡像模板,啓動name1,而後name2 繼承自name1,那麼數據卷目錄共享資源。
結論:容器間配置信息的傳遞,卷的生命週期一直持續到沒有容器使用爲止
dockerfile是構建docker鏡像的構建文件,是由一系列命令和參數構成的腳本