簡單來說,Docker是允許開發者,系統管理員等人簡單地將他們的應用(程序)部署在一個沙盒(Docker稱為containers),然後在目標操作系統上運行的工具。它的關鍵優點是它將應用程序所有的依賴包,環境,配置文件等打包成一個標準化的單元。 Docker容器比虛擬機執行速度更快,並且佔用的資源更少。具體原因解釋可點擊查看
前往https:// download.docker.com/lin ux/ubuntu/dists/ 選擇對應Ubuntu版本的文件夾,在pool/stable 下選擇下載,並安裝deb包
$ sudo dpkg -i /path/to/package.deb
驗證是否安裝成功,通過以下命令
$ sudo docker run hello-world
2. Image和Container
Image 是一個可執行的包,它包含了運行程序所需要的一切東西(包括代碼,運行時庫,依賴庫,環境變數和配置文件等)image文件是Docker用來生成container的實例的模板。
image文件是二進位文件,可以在不同機器中使用。一般而言,我們使用別人製作好的image文件,如果需要根據需求進行修改,也最好基於別人製作好的image文件加工。
關於image文件的共享,Docker的官方倉庫Docker Hub彙集了很多常用的image倉庫。
通過以下命令抓取倉庫中的image文件到本地
$ docker image pull library/hello-world
其中 docker image pull 是抓取image文件的命令
library/hello-world 是image文件在倉庫中的位置,Docker官方提供的image文件都在library組裡,我們拉取官方倉庫的image文件時,可以省略library,直接使用命令:
$ docker image pull hello-world
使用命令
$ docker image ls
查看抓取到本機的image文件
使用以下命令,運行這個image文件生成一個container實例
$ docker container run hello-world
其中 docker container run 是從image文件生成一個container實例的命令,同時這個命令具有自動抓取的功能 ,也就是說如果後面的image文件在本地不存在,Docker會自動從倉庫中抓取對應名字的image文件並生成container實例。
有些container在執行完後會自動終止,但是有些提供服務的container,例如安裝運行了Ubuntu的image,我們可以用命令行體驗Ubuntu系統,這些container不會自動終止。
可以使用以下命令終止container
$ docker container kill [ containID]
對於[containID], 我們可以通過以下命令去獲得本機的container ID
# 列出正在運行的container
$ docker container ls
# 列出所有的container 包括終止的
$ docker container ls --all
本質上來說,image文件和由image文件生成的container都是文件,上面我們終止container時,並不會刪除相應的container文件,如果想移除container文件,可以使用以下命令:
$ docker container rm [containerID]
使用 docker run 命令將鏡像運行為可交互的 shell:
$ docker run -i -t [IMAGENAME] /bin/bash
在命令中:
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-i:以交互模式運行容器,通常與 -t 同時使用
3. 生成Image文件
一個好的教程(裡面講解了Dockerfile各種關鍵字含義):
如何寫Dockerfile,Dockerfile 參考文檔 ?
deepzz.com
Docker通過Dockerfile文件 生成的,Dockerfile文件是一個文本文件用來配置image如何寫Dockerfile,Dockerfile 參考文檔Docker通過Dockerfile文件 生成的,Dockerfile文件是一個文本文件用來配置image
在項目的根目錄下,新建名為Dockerfile的文本文件,假設該文件為如下內容(以參加的天池對抗樣本比賽官方提供的Dockerfile為例)
# Dockerfile of Example
# Version 1.0
# Base Images
FROM registry.cn-shanghai.aliyuncs.com/aliseccompetition/tensorflow:1.1.0-devel-gpu
#MAINTAINER
MAINTAINER AlibabaSec
ADD . /competition
WORKDIR /competition
RUN pip --no-cache-dir install -r requirements.txt
# INSTALL cleverhans foolbox
RUN mkdir ./models
RUN curl -O http://alg-misc.cn-hangzhou.oss.aliyun-inc.com/ijcai2019_ai_security_competition/pretrained_models/inception_v1.tar.gz && tar -xvf inception_v1.tar.gz -C ./models/
FROM :表示該image繼承自後面這個地址的image,冒號後面表示的是標籤,這裡的標籤是1.1.0-devel-gpu
MAINTAINER : 指示生成image的作者
ADD:ADD <src> <dst> 將當前目錄所有文件,複製到image文件的/competition目錄。還有一個關鍵字是COPY,用法和ADD類似,但是ADD的<dst>不能為URL
WORKDIR: 指定接下來的工作路經為/competition
RUN :在/competition目錄下,安裝依賴包。創建文件夾和下載預訓練模型,解壓模型到指定文件夾。
在項目目錄中編寫完Dockerfile後,可以使用以下命令創建image文件
$ docker image build -t demo .
$ docker image build -t demo:0.0.1 .
上面代碼中,-t 參數用來指定image文件的名字,後面加冒號指定標籤,如果指定,默認標籤為latest。 image文件後的 . 表示Dockerfile的文件所在路徑。
刪除Image文件,首先通過命令獲得需要刪除的Image文件的ID,然後使用如下命令刪除:
$ docker image rm [Image ID]
刪除停止的所有容器:
$ docker container prune
5. 使用GPU的Docker——nvidia-docker
Docker一般是用來封裝基於CPU的應用,但是如果該項目需要使用GPU的話。我們需要使用nvidia-docker。nvidia-dicker是在docker上進行封裝,通過封裝之後調用docker。
6. 基於自定義的鏡像Image修改生成新的Image
首先通過命令將基礎鏡像生成容器,以交互模式啟動:
$ docker run -i -t [IMAGENAME] /bin/bash
在啟動的容器中通過命令,進行你需要的操作,增刪查改之類。修改完成後,通過exit命令退出容器。
然後通過下面命令將剛剛修改的容器生成新的鏡像Image
$ docker commit -m="test update" -a="hanjie" [containerID] test:4.3.1
參數解釋:
-m: 更新的描述信息
-a: 鏡像作者
containerID: 容器ID
test:4.3.1: 要創建的目標鏡像名
7. 在本機和docker容器中傳輸文件
先通過命令找到你要傳輸到的docker容器的ID:
然後使用命令將本機文件copy到容器中:
$ docker cp /opt/test/file.txt [containerID]:/opt/testnew/
使用以下命令重啟暫停的容器並進入容器的終端:
$ docker start [containerID]
$ docker attach [containerID]
未完待續........
推薦閱讀: