一、概念
理念:容器化,把應用打包
定義:docker是一個開源的應用容器引擎,可以把任何應用以及他們的依賴包打包到一個 輕量級、可移植的容器中,然後發佈到流行的Linux機器上,實現虛擬化。
VM和docker區別:
VM結構:server-》host OS -》hypervisor -> Guest OS -> Bins/libs ->app
docker : server-》host OS -》-> docker engine ->bins/libs ->app
從以上結構可以看出,hostOS直接安裝一個docker engine,就可以從遠程倉庫【Registry】只中下載對應軟件的docker鏡像【images】,然後docker鏡像運行起來就是一個容器【Containers】,這個容器像一個正常的操作系統一樣,可以讀寫文件 並且運行起來的docker鏡像,在刪除和遷移的時候,也非常方便。
二、docker架構圖
hostOS在安裝完docker之後,會啓動一個docker守護進程【docker daemon】,這個守護進程相當於docker命令行的解釋器【類似於shell】,用戶只要在hostOS的shell中執行docker對應的命令,就可以完成相應的操作。
三、docker命令
現在假設你已經安裝好docker了。
1、驗證是否安裝成功
$ docker info
2、docker需要有自己的守護進程才能運行自己的命令,如果你沒有的話,可以這樣啓動
用systemctl 或者service啓動
$ sudo systemctl start docker
$ sudo service docker start
3、列出本機所有的docker images
$ docker images
4、下載並運行自己的鏡像,假設我們現在下載一個hello-world
$ docker image pull hello-world #下載
$ docker run -d -p 8080:80 hello-world #運行 -p 端口映射 -d守護進程
$ docker run -it ubuntu /bin/bash # -i 交互模式 -t 終端 使用Ubuntu鏡像啓動一個容器
5、查看在運行的container
$ docker ps
6、運行失敗,要刪除原來的container,重新運行
$docker rm hello-world
$docker rmi [imagesName] #刪除鏡像文件
$docker container kill [containerID] #手動停止容器
可以先在 Docker官方倉庫 docker hub中搜索一下想要用的images https://hub.docker.com ,獲取他對應的文件名稱路徑,然後在用 pull 下載
7、把host主機中的文件和容器相互拷貝
$docker cp 容器名:要拷貝的文件在容器裏面的路徑 要拷貝到宿主機的相應路徑
$docker cp 宿主機的相應路徑 容器名:要拷貝的文件在容器裏面的路徑
8、服務運行之後,產生的文件需要保存下來,但是直接停止container,一般來說是不會在容器中保存產生的文件的。這時候需要先commit,把文件保存下來,生成新的鏡像
$docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
-a 提交鏡像作者
-m 提交時說明文字
a404c6c174a2 原imagesID
四、查看docker日誌
注意:docker有關的命令都要有管理員權限,可以把用戶添加到管理員組,或者每次都接sudo
1、直接進入該容器,找到對應日誌
$ sudo docker exec -it a95cee23942d /bin/bash #在鏡像a95cee23942d中執行/bin/bash
root@a95cee23942d:/# ls
bin boot dev etc home lib lib64 logs media mnt opt proc requirements.txt root run sbin srv sys tmp usr var
#進入該container之後,就直接找到 /var/logs查看了
docker logs是根據containers而創建的
2、在主機中 ,實時查看docker容器日誌
$sudo docker logs -f -t --tail 行數 容器名[containerID]
-f 按日誌輸出
-t 顯示時間戳
3、在主機中 ,docker容器的日誌目錄
1、查看容器詳細信息
$docker inspect 7a20f9671dbd
2、通過詳細信息找到LogPath,那麼它就在主機的目錄結構下面
"LogPath": "/var/lib/docker/containers/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c-json.log"
3、用less 或者cat查看日誌
$ sudo less /var/lib/docker/containers/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c-json.log
五、定製鏡像,並推送到 Registry --> dockerfile
定義: Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
1、dockerfile 語法
from base鏡像
maintainer 作者
run 執行命令
copy 把文件拷貝到鏡像中
add 添加文件
expose 暴露端口號
copy能拷貝命令和 文件夾,add可以添加遠程的文件,比如ftp上的
entrypoint 容器入口
workdir 指定路徑
env 設定環境變量
user 指定用戶
2、docker存儲 :鏡像分層
dockerfile中每一行都產生一個新層
已經存在的鏡像:只讀
運行起來,就是可讀可寫的層
分層技術,在有層共享的時候,存儲壓力會小很多
3、dockerfile 創建一個 images
$docker build -t hello:tag .
# hello:tag 容器名:標籤; . 是上下文,把該路徑裏面的所有東西打包成hello【images】
4、推送到遠程registry,公共【Docker hub】或私人【需要另外購買】
首先得先註冊,然後在登錄,最後推送
$docker login
# 輸入用戶名和密碼即可
$docker push hello/ubuntu:v2.4
#添加tag是爲了在鏡像分層上傳時候,只要上傳新增加的就可以了,如果想上傳全部鏡像層,不添加tag即可