學習筆記:Linux下Docker的使用

目錄

一、介紹

二、使用鏡像

三、使用容器

四、數據管理

一、介紹

Docder屬於操作系統層面的虛擬化技術。傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更爲輕便。

1. 基本概念:鏡像(Image)、容器(Container)、倉庫(Repository)

1) 鏡像

操作系統分爲內核和用戶空間,內核啓動後會掛在root文件系統爲其提供用戶空間支持,鏡像就相當於一個root文件系統,提供了容器運行時所需的程序、庫、資源、配置等文件,以及一些爲運行時準備的配置參數(如匿名卷、環境變量、用戶等)。

鏡像被設計爲分層存儲架構,由多層文件系統聯合組成,不包含任何動態數據。鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。

2) 容器

鏡像是靜態的定義,容器是鏡像運行時的實體(像是類和實例一樣),容器的實質是進程,但運行與屬於自己的獨立的命名空間。

容器也使用分層存儲。每一個容器運行時,是以鏡像爲基礎層,在其上創建一個當前容器的容器存儲層。

容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷後,容器刪除或者重新運行之後,數據卻不會丟失。

3) 倉庫

鏡像構建完成後,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。

一個 Docker Registry 中可以包含多個倉庫;每個倉庫可以包含多個標籤;每個標籤對應一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以 latest 作爲默認標籤。

二、使用鏡像

# 獲取
官方鏡像library/centos倉庫中標籤最新的鏡像
# docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤]
$ docker pull ufoym/deepo:tensorflow-py36

# 列出已經下載下來的鏡像
$ docker image ls

# 保存&加載:可以回滾到之前的層
# 持久化鏡像
$ docker save [IMAGE NAME] > /root/save.tar
# 導入save的文件
$ docker load < /root.save.tar
# 回滾
$ docker iamges --tree
$ docker tag <LAYER ID> <IMAGE NAME>

# 查看鏡像、容器、數據卷所佔用的空間
$ docker system df

# 取消鏡像的某個標籤(刪除鏡像)
# 因爲一個鏡像可以對應多個標籤,因此當我們刪除了所指定的標籤後,可能還有別的標籤指向了這個鏡像
# 如果是這種情況,那麼 Delete 行爲就不會發生
$ docker image rm [鏡像標籤]

# 查看當前系統版本
$ cat /etc/os-release

# 層回滾
$ docker tag [LAYER ID] [IMAGE NAME]

三、使用容器

# 查看已有的容器
$ docker container ls -a

# 新建並啓動
# 以centos鏡像爲基礎以bash終端啓動並運行一個容器,允許用戶進行交互
# -it 創建一個交互式的容器
# -d 容器會在後臺運行並不會把輸出的結果 (STDOUT) 打印到宿主機上面
# -p 選擇宿主機具體的9999端口映射到容器內部的8888端口上
# -v 掛載目錄 /root/software是本地目錄,/software是容器自己創建的目錄
# -c "while true; do echo hello world; sleep 1; done" 指令 容器是否會長久運行,是和docker run指定的命令有關
# --name 容器名稱
# --privileged=true 關閉安全權限,否則你容器操作文件夾沒有權限
# --runtime=nvidia 在容器中使用NVIDIA的GPU,需要安裝nvidia-docker
# --ipc=host 增加共享內存大小
# --rm 結束則刪除容器
$ docker run --runtime=nvidia --rm ufoym/deepo:tensorflow-py36 nvidia-smi
$ docker run --runtime=nvidia --ipc=host -it -p 8888:8888 -v /root/myDocker:/share --privileged=true --name my_tensorflow ufoym/deepo:tensorflow-py36 /bin/bash
$ docker run --runtime=nvidia --ipc=host -it -p 8888:8888 ufoym/deepo:all-py36-jupyter jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token= --notebook-dir='/root'

# 終止容器
$ docker container stop [container ID]

# 啓動已終止的容器
$ docker container start [container ID]

# 重啓容器
$ docker container restart [container ID]

# 進入容器
$ docker exec -it [CONTAINER ID] bash

# 退出容器
$ exit

# 提交容器成爲新的鏡像
$ docker commit [container id] [your name]/[image name]:[tag]

# 導出&導入:會丟失所有歷史
# 持久化容器
$ docker export [CONTAINER ID] > export.tar
# 導入export的文件
$ cat centos.tar | docker import - test/centos:v1.0

# 指定URL或者某個目錄來導入
$ docker import http://example.com/exampleimage.tgz example/imagerepo

# 刪除容器
$ docker container rm [CONTAINER NAMES]

# 查看輸出結果
$ docker container logs [container ID or NAMES]

# 查看容器綁定和映射的端口
$ docker port [container NAMES]

# 查看容器信息
$ docker inspect [container NAMES]

# 查看已經存在的容器的掛載目錄
$ docker inspect [container NAMES] | grep Mounts -A 10

# 清理所有處於終止狀態的容器
$ docker container prune

注:docker save/load和 docker export/import 的區別

  1. docker save保存的是鏡像(image)可以層回滾,docker export保存的是容器(container);
  2. docker load用來載入鏡像包,docker import用來載入容器包,但兩者都會恢復爲鏡像;
  3. docker load不能對載入的鏡像重命名,而docker import可以爲鏡像指定新名稱。

四、數據管理

容器中數據管理主要有兩種方式:數據卷(Volumes)和掛載主機目錄(Bind mounts)

1)數據卷:可以在容器之間共享和重用;對數據卷的修改會立刻生效;對數據卷的更新不會影響鏡像;即使容器被刪除數據卷也會默認會一直存在

# 創建數據卷
$ docker volume create my-vol

# 查看所有的數據卷
$ docker volume ls

# 查看指定數據卷的信息
$ docker volume inspect my-vol

# 啓動一個掛載數據卷的容器,在一次docker run中可以掛載多個數據卷
# 創建一個名爲web的容器,並加載一個數據捲到容器的 /webapp 目錄
$ docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py

# 刪除數據卷
$ docker volume rm my-vol

# 在刪除容器的同時移除數據卷
$ docker rm -v my-vol

2) 掛載一個主機目錄作爲數據卷

# 加載主機的 /src/webapp 目錄到容器的 /opt/webapp目錄
$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py

# 從主機掛載單個文件到容器中
# 記錄在容器輸入過的命令
$ docker run --rm -it \
   # -v $HOME/.bash_history:/root/.bash_history \
   --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
   ubuntu:17.10 \
   bash

參考:

https://yeasy.gitbooks.io/docker_practice/content/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章