1. 程式人生 > >docker 相關筆記

docker 相關筆記

# Docker  

學習目標:

- 掌握Docker基礎知識,能夠理解Docker映象與容器的概念

- 完成Docker安裝與啟動

- 掌握Docker映象與容器相關命令

- 掌握Tomcat Nginx 等軟體的常用應用的安裝

- 掌握docker遷移與備份相關命令

- 能夠運用Dockerfile編寫建立容器的指令碼

- 能夠搭建與使用docker私有倉庫

  ​


# 1 Docker簡介

## 1.1 什麼是虛擬化

​    在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如伺服器、網路、記憶體及儲存等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使使用者可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。

​    在實際的生產環境中,虛擬化技術主要用來解決高效能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體   對資源充分利用

​    虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機器等等。

## 1.2 什麼是Docker

​    Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在 [GitHub](https://github.com/docker/docker) 上進行維護。

​    ![](image/1-3.png)



​    Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。

​    Docker 專案的目標是實現輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。

​    在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。

為什麼選擇Docker?

(1)上手快。

​    使用者只需要幾分鐘,就可以把自己的程式“Docker化”。Docker依賴於“寫時複製”(copy-on-write)模型,使修改應用程式也非常迅速,可以說達到“隨心所致,程式碼即改”的境界。    

         隨後,就可以建立容器來執行應用程式了。大多數Docker容器只需要不到1秒中即可啟動。由於去除了管理程式的開銷,Docker容器擁有很高的效能,同時同一臺宿主機中也可以執行更多的容器,使使用者儘可能的充分利用系統資源。

(2)職責的邏輯分類

​    使用Docker,開發人員只需要關心容器中執行的應用程式,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫程式碼的開發環境與應用程式要部署的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正常的,上線後出了問題就歸結為肯定是運維的問題)”

(3)快速高效的開發生命週期

​    Docker的目標之一就是縮短程式碼從開發、測試到部署、上線執行的週期,讓你的應用程式具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裡面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)

(4)鼓勵使用面向服務的架構

​    Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只執行一個應用程式或程序,這樣就形成了一個分散式的應用程式模型,在這種模型下,應用程式或者服務都可以表示為一系列內部互聯的容器,從而使分散式部署應用程式,擴充套件或除錯應用程式都變得非常簡單,同時也提高了程式的內省性。(當然,可以在一個容器中執行多個應用程式)

## 1.3 容器與虛擬機器比較

​    下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實現虛擬化,直接複用本地主機的作業系統,而傳統方式則是在硬體層面實現。

![](image/1-1.png)

與傳統的虛擬機器相比,Docker優勢體現為啟動速度快、佔用體積小。

## 1.4 Docker 元件

### 1.4.1 Docker伺服器與客戶端

​    Docker是一個客戶端-伺服器(C/S)架構程式。Docker客戶端只需要向Docker伺服器或者守護程序發出請求,伺服器或者守護程序將完成所有工作並返回結果。Docker提供了一個命令列工具Docker以及一整套RESTful API。你可以在同一臺宿主機上執行Docker守護程序和客戶端,也可以從本地的Docker客戶端連線到執行在另一臺宿主機上的遠端Docker守護程序。

![](image/1-2.png)

### 1.4.2 Docker映象與容器

​    映象是構建Docker的基石。使用者基於映象來執行自己的容器。映象也是Docker生命週期中的“構建”部分。映象是基於聯合檔案系統的一種層式結構,由一系列指令一步一步構建出來。例如:

新增一個檔案;

執行一個命令;

開啟一個視窗。

也可以將映象當作容器的“原始碼”。映象體積很小,非常“便攜”,易於分享、儲存和更新。

​    Docker可以幫助你構建和部署容器,你只需要把自己的應用程式或者服務打包放進容器即可。容器是基於映象啟動起來的,容器中可以執行一個或多個程序。我們可以認為,映象是Docker生命週期中的構建或者打包階段,而容器則是啟動或者執行階段。  容器基於映象啟動,一旦容器啟動完成後,我們就可以登入到容器中安裝自己需要的軟體或者服務。

所以Docker容器就是:

​    一個映象格式;

​    一些列標準操作;

​    一個執行環境。

​    Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟體。

         和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底裝了什麼,它不管是web伺服器,還是資料庫,或者是應用程式伺服器什麼的。所有的容器都按照相同的方式將內容“裝載”進去。

         Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然後下載到一個物理的或者虛擬的伺服器來測試,在把容器部署到具體的主機中。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且儘量通用。

### 1.4.3 Registry(註冊中心)

​    Docker用Registry來儲存使用者構建的映象。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。使用者可以在Docker Hub註冊賬號,分享並儲存自己的映象(說明:在Docker Hub下載映象巨慢,可以自己構建私有的Registry)。

​    https://hub.docker.com/

# 2 Docker安裝與啟動

## 2.1 安裝Docker

​    Docker官方建議在Ubuntu中安裝,因為Docker是基於Ubuntu釋出的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支援更新最新的一些補丁包的。

​    由於我們學習的環境都使用的是CentOS,因此這裡我們將Docker安裝到CentOS上。注意:這裡建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支援更新。

​    請直接掛載課程配套的Centos7.x映象    

(1)yum 包更新到最新

```
sudo yum update
```

(2)安裝需要的軟體包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

```
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```

(3)設定yum源為阿里雲

```
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
```

(4)安裝docker

```
sudo yum install docker-ce
```

(5)安裝後檢視docker版本

```
docker -v
```

## 2.2 設定ustc的映象

ustc是老牌的linux映象服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker映象加速器速度很快。ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。

[https://lug.ustc.edu.cn/wiki/mirrors/help/docker](https://lug.ustc.edu.cn/wiki/mirrors/help/docker)

編輯該檔案:

```
vi /etc/docker/daemon.json 
```

在該檔案中輸入如下內容:

```
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
```

## 2.3 Docker的啟動與停止

**systemctl**命令是系統服務管理器指令

啟動docker:

```
systemctl start docker
```

停止docker:

```
systemctl stop docker
```

重啟docker:

```
systemctl restart docker
```

檢視docker狀態:

```
systemctl status docker
```

開機啟動:

```
systemctl enable docker
```

檢視docker概要資訊

```
docker info
```

檢視docker幫助文件

```
docker --help
```

# 3 常用命令

## 3.1 映象相關命令

### 3.1.1 檢視映象

```
docker images
```

REPOSITORY:映象名稱

TAG:映象標籤

IMAGE ID:映象ID

CREATED:映象的建立日期(不是獲取該映象的日期)

SIZE:映象大小

這些映象都是儲存在Docker宿主機的/var/lib/docker目錄下

### 3.1.2 搜尋映象

如果你需要從網路中查詢需要的映象,可以通過以下命令搜尋

```
docker search 映象名稱
```

NAME:倉庫名稱

DESCRIPTION:映象描述

STARS:使用者評價,反應一個映象的受歡迎程度

OFFICIAL:是否官方

AUTOMATED:自動構建,表示該映象由Docker Hub自動構建流程建立的

### 3.1.3 拉取映象

拉取映象就是從中央倉庫中下載映象到本地

```
docker pull 映象名稱
```

例如,我要下載centos7映象

```
docker pull centos:7
```

### 3.1.4 刪除映象

按映象ID刪除映象

```
docker rmi 映象ID
```

刪除所有映象

```
docker rmi `docker images -q`
```

## 3.2 容器相關命令

### 3.2.1 檢視容器

檢視正在執行的容器

```
docker ps
```

檢視所有容器

```
docker ps –a
```

檢視最後一次執行的容器

```
docker ps –l
```

檢視停止的容器

```
docker ps -f status=exited
```

### 3.2.2 建立與啟動容器

建立容器常用的引數說明:

建立容器命令:docker run

 -i:表示執行容器

 -t:表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。

 --name :為建立的容器命名。

 -v:表示目錄對映關係(前者是宿主機目錄,後者是對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。

 -d:在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器)。

 -p:表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映

(1)互動式方式建立容器

```
docker run -it --name=容器名稱 映象名稱:標籤 /bin/bash
```

這時我們通過ps命令檢視,發現可以看到啟動的容器,狀態為啟動狀態  

退出當前容器

```
exit
```

(2)守護式方式建立容器:

```
docker run -di --name=容器名稱 映象名稱:標籤
```

登入守護式容器方式:

```
docker exec -it 容器名稱 (或者容器ID)  /bin/bash
```

### 3.2.3 停止與啟動容器

停止容器:

```
docker stop 容器名稱(或者容器ID)
```

啟動容器:

```
docker start 容器名稱(或者容器ID)
```

### 3.2.4 檔案拷貝

如果我們需要將檔案拷貝到容器內可以使用cp命令

```
docker cp 需要拷貝的檔案或目錄 容器名稱:容器目錄
```

也可以將檔案從容器內拷貝出來

```
docker cp 容器名稱:容器目錄 需要拷貝的檔案或目錄
```

### 3.2.5 目錄掛載

我們可以在建立容器的時候,將宿主機的目錄與容器內的目錄進行對映,這樣我們就可以通過修改宿主機某個目錄的檔案從而去影響容器。
建立容器 新增-v引數 後邊為   宿主機目錄:容器目錄,例如:

```
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
```

如果你共享的是多級的目錄,可能會出現許可權不足的提示。

這是因為CentOS7中的安全模組selinux把許可權禁掉了,我們需要新增引數  --privileged=true  來解決掛載的目錄沒有許可權的問題

### 3.2.6 檢視容器IP地址

我們可以通過以下命令檢視容器執行的各種資料

```
docker inspect 容器名稱(容器ID)
```

也可以直接執行下面的命令直接輸出IP地址

```
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
```

### 3.2.7 刪除容器

刪除指定的容器:

```
docker rm 容器名稱(容器ID)
```

# 4 應用部署

## 4.1 MySQL部署

(1)拉取mysql映象

```
docker pull centos/mysql-57-centos7
```

(2)建立容器

```
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
```

-p 代表埠對映,格式為  宿主機對映埠:容器執行埠

-e 代表新增環境變數  MYSQL_ROOT_PASSWORD  是root使用者的登陸密碼

(3)遠端登入mysql

連線宿主機的IP  ,指定埠為33306

 ## 4.2 tomcat部署

(1)拉取映象

```
docker pull tomcat:7-jre7
```

(2)建立容器

建立容器  -p表示地址對映

```
docker run -di --name=mytomcat -p 9000:8080
-v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
```

## 4.3 Nginx部署

(1)拉取映象    

```
docker pull nginx
```

(2)建立Nginx容器

```
docker run -di --name=mynginx -p 80:80 nginx
```

## 4.4 Redis部署

(1)拉取映象

```
docker pull redis
```

(2)建立容器

```
docker run -di --name=myredis -p 6379:6379 redis
```

# 5 遷移與備份

## 5.1 容器儲存為映象

我們可以通過以下命令將容器儲存為映象

```
docker commit mynginx mynginx_i
```

## 5.2 映象備份

我們可以通過以下命令將映象儲存為tar 檔案

```
docker  save -o mynginx.tar mynginx_i
```

## 5.3 映象恢復與遷移

首先我們先刪除掉mynginx_img映象  然後執行此命令進行恢復

```
docker load -i mynginx.tar
```

-i 輸入的檔案

執行後再次檢視映象,可以看到映象已經恢復

# 6 Dockerfile

## 6.1 什麼是Dockerfile

Dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立一個新的映象。

1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境;
2、對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作了;
3、對於運維人員:在部署時,可以實現應用的無縫移植。

## 6.2 常用命令



| 命令                                 | 作用                                 |
| ---------------------------------- | ---------------------------------- |
| FROM image_name:tag                | 定義了使用哪個基礎映象啟動構建流程                  |
| MAINTAINER user_name               | 宣告映象的建立者                           |
| ENV key value                      | 設定環境變數 (可以寫多條)                     |
| RUN command                        | 是Dockerfile的核心部分(可以寫多條)            |
| ADD source_dir/file dest_dir/file  | 將宿主機的檔案複製到容器內,如果是一個壓縮檔案,將會在複製後自動解壓 |
| COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有壓縮檔案並不能解壓              |
| WORKDIR path_dir                   | 設定工作目錄                             |

## 6.3 使用指令碼建立映象

步驟:

(1)建立目錄

```
mkdir –p /usr/local/dockerjdk8
```

(2)下載jdk-8u171-linux-x64.tar.gz並上傳到伺服器(虛擬機器)中的/usr/local/dockerjdk8目錄

(3)建立檔案Dockerfile  `vi Dockerfile`

```
#依賴映象名稱和ID
FROM centos:7
#指定映象建立者資訊
MAINTAINER ITCAST
#切換工作目錄
WORKDIR /usr
RUN mkdir  /usr/local/java
#ADD 是相對路徑jar,把java新增到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/

#配置java環境變數
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
```

(4)執行命令構建映象

```
docker build -t='jdk1.8' .
```

注意後邊的空格和點,不要省略

(5)檢視映象是否建立完成

```
docker images
```



# 7 Docker私有倉庫

## 7.1 私有倉庫搭建與配置

(1)拉取私有倉庫映象(此步省略)

```
docker pull registry
```

(2)啟動私有倉庫容器

```
docker run -di --name=registry -p 5000:5000 registry
```

(3)開啟瀏覽器 輸入地址http://192.168.184.141:5000/v2/_catalog看到`{"repositories":[]}` 表示私有倉庫搭建成功並且內容為空

(4)修改daemon.json

```
vi /etc/docker/daemon.json
```

新增以下內容,儲存退出。

```json
{"insecure-registries":["192.168.184.141:5000"]}
```

此步用於讓 docker信任私有倉庫地址

(5)重啟docker 服務

```
systemctl restart docker
```

## 7.2 映象上傳至私有倉庫

(1)標記此映象為私有倉庫的映象

```
docker tag jdk1.8 192.168.184.141:5000/jdk1.8
```

(2)再次啟動私服容器

```
docker start registry
```

(3)上傳標記的映象

```
docker push 192.168.184.141:5000/jdk1.8
```