一、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 dockersystemctl enable docker
1.5?驗證是否安裝成功?
docker versiondocker 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——入門實戰
---------------------
作者:Yunlord
來源:CSDN
原文:https://blog.csdn.net/kobepaul123/article/details/120072009
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件