
一、docker概述
1.什么是docker
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源,
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實作虛擬化,
容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器性能開銷極低,
Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),
簡單來說,docker是一個用來裝應用的容器,就像杯子可以裝水,筆筒可以放筆,書包可以放書,可以把深度學習放在docker中,可以把網站放入docker中,可以把任何想得到的程式放在docker中,
2.docker思想
2.1 集裝箱
如果沒有集裝箱,運輸貨物的時候,東西零散容易丟失,但是一旦有了集裝箱,那么貨物就會被裝載在里面,運輸的時候就不容易丟失了,目前我們需要將程式部署到一臺新的機器上,可能會啟動不起來,比如缺失庫或者組態檔等,那我們如果將程式想象成貨物,我們只需要用一個集裝箱將這些程式打包好,就可以在部署后保證程式可以正常運行,而docker就是這個集裝箱,
2.2 標準化
運輸方式:
如果我們把臺式機的應用部署到服務器上,我們可能選擇用移動硬碟拷過去,而有了docker,我們就可以將這個程序標準化,
docker運輸東西通過一個超級碼頭,任何地方需要貨物都由鯨魚先送到超級碼頭,然后再由鯨魚從超級碼頭把貨物送到目的地,
在剛才例子中,我們只需要在臺式機執行一個docker命令,把鯨魚派過來,把程式送到超級碼頭去,再在服務器上執行一個docker命令,然后由鯨魚把程式從超級碼頭送到服務器上去,
存盤方式:
當我們把程式存盤到服務器上時,因為下次我們有可能還要修改存盤目錄,所以我們需要記住這個目錄,而有了docker之后我們就不用記住了程式在哪里了,我們使用的時候只需要一條命令就行了,
API介面:
docker提供了一系列rest api的介面,包含了對docker也就是對我們的應用的一個啟動停止查看洗掉等等,有了docker,通過docker命令就可以對其進行操作,
2.3 隔離
我們在使用虛擬機時有自己的cpu、硬碟、記憶體,完全感覺不到外面主機的存在,docker也差不多,不過它更輕量,我們創建虛擬機可能要幾分鐘,但是docker只需要一秒,最底層的技術是linux一種內核的限制機制,叫做LXC,
LXC是一種輕量級的容器虛擬化技術,最大效率的隔離了行程和資源,通過cgroup、namespace等限制,隔離行程組所使用的物理資源,比如CPU,MEMORY等等,這個機制在7、8年前已經加入到linux內核了,直到2013年docker出世的時候才火起來,大家可能奇怪為什么這么好的技術埋沒這么多年都沒人發現呢?
英雄造時勢,時勢造英雄,如果沒有云計算、敏捷開發、高頻度的彈性伸縮需求,沒有IT行業這么多年長足的發展,也就沒有docker,
3.為什么選擇docker?
作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢,
- 更高效的利用系統資源,
- 更快速的啟動時間
- 一致的運行環境
- 持續交付和部署
- 更輕松的遷移
- 更輕松的維護和擴展
4.走進docker
鏡像就是上面說的集裝箱,倉庫就是超級碼頭,容器就是我們運行程式的地方,docker運行程式的程序,就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運行起來變成容器,
build:構建,就是構建鏡像.
ship:運輸,運輸鏡像,從倉庫和主機運輸.
run:運行的鏡像就是一個容器.
build,ship,run和鏡像,倉庫,容器是一一對應的,
4.1 鏡像
鏡像的英文名叫image,前面我們講到了集裝箱,鯨魚拖著的所有集裝箱就是一個鏡像,
從本質上來說鏡像就是一系列檔案,可以包括我們應用程式的檔案,也可以包括我們應用的運行環境的檔案,既然是檔案,那么是以什么樣的格式在本地保存的呢?
說到存盤格式,就要提到linux的一個存盤技術,叫做聯合檔案系統,它是一種分層的檔案系統,可以將不同的目錄掛到同一個虛擬檔案系統下,
比如test1下有三個檔案夾,test2下有兩個檔案夾,還有一個readme檔案,聯合檔案系統就是可以在一個檔案夾(test)中看到多個檔案夾(test1,test2)中的內容,
通過這種方式可以實作檔案的分層,test1可以把它看作第一層,test2可以把它看作第二層,每一層有每一層自己的檔案,docker就是利用了這種分層的概念實作了鏡像存盤,
鏡像的存盤格式如下圖所示,

這張圖是分層的,最下面一層,上面也是一層層的好像集裝箱羅列在一起,這就是鏡像最直觀的存盤方式,下面是作業系統的引導,上面是linux作業系統,再上面是一些相關的軟體,如果是我們自己的程式,就可以是tomcat,jdk,再往上是應用代碼,每一層是我們自己都可以控制得,最上面一層先忽略不看,因為這是和容器有關的,注意一點,docker鏡像系統的每一層都是只讀的,然后把每一層加載完成之后這些檔案都會被看成是同一個目錄,相當于只有一個檔案系統,docker的這種檔案系統被稱之為鏡像,
4.2 容器
為了便于理解,大家可以把容器想象成虛擬機,每個虛擬機都有自己的檔案系統,可以把上圖整個一部分看成是檔案系統,與虛擬機系統的區別是這里面的檔案系統是一層一層的,并且最下面的n層都是只讀的,只有上面一層是可寫的,為什么要有可寫的這層呢?大家的程式運行起來,勢必會要寫一些日志,寫一些檔案,或者對系統的某一些檔案做一些修改,所以容器在最上面一層創建了可讀可寫的檔案系統,
因為鏡像的每一層都是只讀的,所以在程式的運行程序中要寫鏡像檔案時,它會把檔案的每一層拷到檔案的最上層,然后再對它進行修改,修改之后,當我們的應用讀一個檔案時會從頂層進行查找,如果沒有才會找下一層,
由于容器的最上一層是可以修改的,鏡像是不能修改的,這樣就能保證鏡像可以生成多個容器獨立運行,沒有任何干擾,
4.3 倉庫
我們的鏡像是要在其它機器上運行,如何進行傳輸呢?
這就用到了docker倉庫,我們要先把我們的鏡像傳到docker倉庫中,再由目的地把docker倉庫拉過去,這就完成了這樣的一次傳輸程序,
誰提供了這樣的倉庫呢?docker自己提供了hub.docker.com,但是非常慢為了解決這個問題,國內很多公司也在做自己的倉庫,
二、docker安裝
因為在虛擬機中安裝的是linux的redhat7.4,所以接下來將介紹如何在redhat中安裝docker,以下方法通用于linux內核,只是安裝包有可能不同,
安裝需滿足以下要求:
- 64位作業系統
- 3.1及以上的Linux內核
- iptables版本在1.4及以上
- git版本在1.7及以上
- A ps executable, usually provided by procps or a similar package.
- XZ Utils 4.9 or higher
- A properly mounted cgroupfs hierarchy; a single, all-encompassing cgroup mount point is not sufficient.
通過 uname -r 命令查看你當前的內核版本,
1.在線安裝
1.1 如果安裝過請先卸載
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.2 安裝依賴設定yum倉庫
安裝依賴:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
設定倉庫:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
1.3 安裝docker
yum install docker-ce docker-ce-cli containerd.io
1.4 啟動并加入開機啟動
systemctl start docker
systemctl enable docker
1.5 驗證是否安裝成功
docker version
docker run hello-world
能夠看到輸出 Hello from Docker! 就OK了!
2.離線安裝
在某些情況下,我們可能需要離線安裝docker,那么接下來將詳細介紹如何實作docker的離線安裝,
2.1 下載docker壓縮包
從download.docker.com下載對應的docker包,我這里下載的是docker-18.03.1-ce.tgz版本,如果有需要可以直接私信我,
2.2 解壓檔案
[root@devops-102 ~]# tar -xvzf docker-18.03.1-ce.tgz
2.3 將檔案移動到系統目錄下 excutable path,
ps:本步驟為可選步驟,也可以把解壓路徑放到PATH變數中,
$ sudo cp docker/* /usr/bin/
執行后會看到 API listen on /var/run/docker.sock 的提示,表示docker已經在運行了,
2.4 啟動Dockerd
$ sudo dockerd &
2.5 驗證
$ sudo docker run hello-world
能夠看到輸出 Hello from Docker! 就OK了!
2.6 設定開機自啟動
systemctl start docker
systemctl enable docker
三、docker基礎操作
當我們安裝好docker后,由于我做深度學習方面的研究,所以我們需要安裝相應的深度學習環境,以配置pytorch環境為例,接下來會一步步介紹如何構建一個屬于自己的鏡像,
1.鏡像基本操作
1.1 抓取鏡像
首先我們進入dockerhub網站選擇一個我們需要的鏡像,

然后輸入:
docker pull pytorch/pytorch
通過此命令可以docker遠程倉庫拉取鏡像到本地,
docker pull [options] NAME[:TAG]
name是拉取鏡像的名稱;TAG表示是可選的,如果不選表明時latest,如果選擇表明是指定版本的,
options是拉去的一些引數,當不加請求地址的時候回去docker的官網拉取鏡像,
1.2 查看鏡像
docker images
通過此命令可以查看當前存在哪些鏡像,

docker images [options] [REPOSITORY[:TAG]]
options是選項,后面是指定鏡像的名稱,這個用的不多,可能當本地鏡像非常多的時候要指定查看某一個鏡像,
IMAGE ID 其實是一個64位的字串,它可以唯一標識我們的鏡像,這里只顯示了16位,后面的被截掉了
1.3 啟動互動式容器
docker run -it -v /home/admin/workplace:/workspaces --name bert_pytorch pytorch/pytorch /bin/bash
docker run -t -i -v 本地目錄:虛擬目錄 --name 自定義名稱 IMAGE_NAME /bin/bash
-i –interactive=true | false,默認是false
-t –tty=true | false,默認是false
–name 給啟動的容器自定義名稱,方便后續的容器選擇操作
啟動互動式的容器,就是類似虛擬機、云主機的操作方式,操作完一個命令后仍然可以繼續
1.4 洗掉鏡像
docker rmi d77dc4c8ebab
docker rmi 鏡像的標識
標識可以是id或者name,
2.容器的操作
2.1 運行容器
# 簡單操作
docker run 鏡像的標識|鏡像名稱[tag]
# 常用的引數
docker run -d -p 宿主機埠:容器埠 --name 容器名稱 鏡像的標識|鏡像名稱[tag]
# -d: 代表后臺運行容器
# -p: 宿主機埠:容器埠: 為了映射當前Linux的埠和容器的埠
# --name 容器名稱: 指定容器的名稱
2.2 查看正在運行的容器
docker ps [OPTIONS]
# OPTIONS說明:
# -a: 代表查看全部的容器,包括沒有運行
# -q: 只查看容器的標識
# -f: 根據條件過濾顯示的內容
# --format: 指定回傳值的模板檔案
# -l: 顯示最近創建的容器
# -n: 列出最近創建的n個容器
# --no-trunc: 不截斷輸出
# -s: 顯示總的檔案大小
2.3 查看容器的日志
docker logs -f 容器id
# -f: 可以滾動查看日志的最后幾行
2.4 進入到容器內部
docker exec -it 容器id bash
2.5 洗掉容器(洗掉容器前,需要先停止容器)
docker stop 容器id
# 停止指定的容器
docker stop $(docker ps -qa)
# 停止全部容器
docker rm 鏡像id
# 洗掉指定容器
docker rm $(docker ps -qa)
# 洗掉全部容器
2.6 啟動容器
docker start 容器id
3.構建鏡像
構建Docker鏡像,可以保存對容器的修改,并且再次使用,構建鏡像提供了自定義鏡像的能力,以軟體的形式打包并分發服務及其運行環境,Docker中提供了兩種方式來構建鏡像:
- 通過容器構建:docker commit
- 通過Dockerfile:docker build
3.1 使用commit命令構建鏡像
docker commit 7843e0556e67 bertpytorch
命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
引數:
-a,–author=“”,指定鏡像的作者資訊
-m,–message=“”,提交資訊
-p,–pause=true,commit時是否暫停容器

3.2 使用Dockerfile檔案構建鏡像
Docker允許我們利用一個類似組態檔的形式來進行構建自定義鏡像,在檔案中可以指定原始的鏡像,自定義鏡像的維護人資訊,對原始鏡像采取的操作以及暴露的埠等資訊,比如:
# Sample Dockerfile
FROM ubuntu:16.04
MAINTAINER wgp "Kingdompin@163.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
命令:docker build [OPTIONS] DockerFile_PATH | URL | -
引數:
–force-rm=false
? –no-cache=false
? –pull=false
? -q,quite=false,構建時不輸出資訊
? –rm=true
-t,tag=“”,指定輸出的鏡像名稱資訊
4.鏡像遷移
我們制作好的鏡像,一般會遷移到其他機器上,Docker提供了幾種鏡像遷移分享給其他人的方式,推薦鏡像遷移應該直接使用Docker Registry,無論是直接使用Docker Hub還是使用內網私有Registry都可以,使用鏡像頻率不高,鏡像數量不多的情況下,我們可以選擇以下兩種方式,
4.1 上傳Docker Hub
首先,需要在Docker Hub上申請注冊一個帳號(人機驗證時需要科學上網),然后我們需要創建倉庫,指定倉庫名稱,
在終端中登錄你的Docker Hub賬戶,輸入docker login,輸入用戶名密碼即可登錄成功,
查看需要上傳的鏡像,并將選擇的鏡像打上標簽,標簽名需和Docker Hub上新建的倉庫名稱一致,否則上傳失敗,給鏡像打標簽的命令如下,
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]
其中existing-image代表本地待上傳的鏡像名加tag,后面<hub-user>/<repo-name>[:<tag>]則是為上傳更改的標簽名,tag不指定則為latest,
接下來,我們利用push命令直接上傳鏡像,
docker push <hub-user>/<repo-name>:<tag>
我們已經上傳成功,由于之前介紹的分層存盤系統,我們這里是直接對已有的ubuntu鏡像進行上傳,只是重新打了標簽,所以真正上傳的只是變化的部分,
4.2 匯出檔案互傳
Docker 還提供了 docker load 和 docker save 命令,用以將鏡像保存為一個tar檔案,比如這次我們將bertpytorch:latest這個鏡像保存為tar檔案,
docker save -o bertpytorch.tar bertpytorch
docker save -o <倉庫名稱>-<tag>.img <倉庫名稱>:<tag>
查看本地磁盤,即可看見名為bertpytorch的tar包,我們可以將其拷貝給其他機器,再利用load命令重新匯入,
docker load --input bertpytorch.tar
docker save --input <tar>
四、常用linux操作
1.檔案和目錄
cd /home 進入 '/ home' 目錄'
cd .. 回傳上一級目錄
cd ../.. 回傳上兩級目錄
cd 進入個人的主目錄
cd ~user1 進入個人的主目錄
cd - 回傳上次所在的目錄pwd 顯示作業路徑
mkdir dir1 創建一個叫做 'dir1' 的目錄'
mkdir dir1 dir2 同時創建兩個目錄
mkdir -p /tmp/dir1/dir2 創建一個目錄樹rm -f file1 洗掉一個叫做 'file1' 的檔案'
rmdir dir1 洗掉一個叫做 'dir1' 的目錄'
rm -rf dir1 洗掉一個叫做 'dir1' 的目錄并同時洗掉其內容
rm -rf dir1 dir2 同時洗掉兩個目錄及它們的內容cp file1 file2 復制一個檔案
cp dir/* . 復制一個目錄下的所有檔案到當前作業目錄
cp -a /tmp/dir1 . 復制一個目錄到當前作業目錄
cp -a dir1 dir2 復制一個目錄
cp -r dir1 dir2 復制一個目錄及子目錄
linux涉及到docker的基礎命令會不斷更新,建議收藏,不時查閱!!!
如果該文章對您有所幫助,麻煩點贊,關注,收藏三連支持下!
各位的支持和認可,是我創作的最大動力!
參考:
Docker超詳細基礎教程
docker入門(利用docker部署web應用)
Docker 入門到實戰教程(一)介紹Docker
Docker——入門實戰
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/297891.html
標籤:其他
