本文參考:Docker官網教程和阮一峰老師的博客。這兩個都是很好的學習和理解Docker的資料,可以參考學習

Docker命令大全?

www.runoob.com

什麼是Docker?

維基百科對docker的定義:

an open-source project that automates the deployment of software applications inside containers by providing an additional layer of abstraction and automation of OS-level virtualization on Linux.

簡單來說,Docker是允許開發者,系統管理員等人簡單地將他們的應用(程序)部署在一個沙盒(Docker稱為containers),然後在目標操作系統上運行的工具。它的關鍵優點是它將應用程序所有的依賴包,環境,配置文件等打包成一個標準化的單元。Docker容器比虛擬機執行速度更快,並且佔用的資源更少。具體原因解釋可點擊查看

Docker解決了千萬開發者最頭痛的問題:環境配置。每次我們換一台機器,我們可能都十分苦惱地想「天啊!又要配環境了「。然後在各種依賴衝突中掙紮好久才能把環境搭建好。這時我們會想,如果我能直接把舊電腦的開發環境,原封不動地搬到新機器上就好了。Docker應運而生。

引用阮一峰老師的一個解釋,真的解釋得很清楚。

Docker 將應用程序與該程序的依賴,打包在一個文件裡面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。

使用Docker

Overview of Docker editions?

docs.docker.com圖標

以上是官網的官方教程,可以自行查閱哈。下面我記錄下,我覺得重要的Docker操作。

  1. 安裝Docker

先將舊版本的Docker卸載

$ sudo apt-get remove docker docker-engine docker.io containerd runc

我選擇使用.deb文件進行安裝

首先使用命令:lsb_release -a 查看Ubuntu版本

前往download.docker.com/lin 選擇對應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]

未完待續........


推薦閱讀:
相关文章