Docker入門學習筆記

  • 2019 年 10 月 3 日
  • 筆記

Docker

什麼是Docker

虛擬化技術

在電腦中,虛擬化是一種資源管理技術,將電腦中的各種實體資源如:CPU、硬碟、記憶體等予以抽象、轉換後呈現出來打破實體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些資源。在實際的生產環境當中,虛擬化技術主要用來解決高性能電腦產能過剩和老舊的機器產能過低的重組重用。對硬體進行最大化利用

虛擬化種類

  1. 全虛擬化架構

虛擬機的監視器(hypervisor)是類似於用戶的應用程式運行在主機的OS之上,如VMware的workstation,這種虛擬化產品提供了虛擬的硬體。可以在一台設備上運行不同內核的作業系統

  1. OS層虛擬化技術

  2. 硬體層虛擬化

硬體層的虛擬化具有高性能和隔離性,因為hypervisor(虛擬機的監視器)直接在硬體上運行,有利於控制VM的OS訪問硬體資源,使用這種解決方案的產品有VMwareESXi 和 Xen server

Hypervisor是一種運行在物理伺服器和作業系統之間的中間軟體層,可允許多個作業系統和應用共享一套基礎物理硬體,因此也可以看作是虛擬環境中的「元」作業系統,它可以協調訪問伺服器上的所有物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor,VMM)。

Hypervisor是所有虛擬化技術的核心。當伺服器啟動並執行Hypervisor時,它會給每一台虛擬機分配適量的記憶體、CPU、網路和磁碟,並載入所有虛擬機的客戶作業系統。 宿主機

Hypervisor是所有虛擬化技術的核心,軟硬體架構和管理更高效、更靈活,硬體的效能能夠更好地發揮出來。常見的產品有:VMware、KVM、Xen等等。Openstack

Docker

特點:

上手快

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

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

職責的邏輯分類

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

快速高效的開發周期

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

鼓勵使用面向服務的架構

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

Docker組件

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

Docker鏡像

鏡像是構建Docker的基石。用戶基於鏡像來運行自己的容器。鏡像也是Docker生命周期中的「構建」部分。鏡像是基於聯合文件系統的一種層式結構,由一系列指令一步一步構建出來。例如:

添加一個文件;

執行一個命令;

打開一個窗口。

也可以將鏡像當作容器的「源程式碼」。鏡像體積很小,非常「隨身」,易於分享、存儲和更新。

Registry(註冊中心)

Docker用Registry來保存用戶構建的鏡像。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。用戶可以在Docker Hub註冊帳號,分享並保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構建私有的Registry)

Docker容器

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

Docker安裝

使用 yum 命令在線安裝

yum install docker

查看 docker 版本

docker -v

啟動和關閉

啟動 docker

systemctl命令是系統服務管理器指令,它是service 和 chkconfig 兩個命令組合。

啟動 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

Docker鏡像操作

Docker鏡像

Docker鏡像是由文件系統疊加而成(是一種文件的存儲形式)。最底端是一個文件引導系統,即bootfs,這很像典型的Linux/Unix的引導文件系統。Docker用戶幾乎永遠不會和引導系統有什麼交互。實際上,當一個容器啟動後,它將會被移動到記憶體中,而引導文件系統則會被卸載,以留出更多的記憶體供磁碟鏡像使用。Docker容器啟動是需要的一些文件,而這些文件就可以稱為Docker鏡像。

列出鏡像:

docker images

列名 含義
repository 鏡像所在的倉庫名稱
tag 鏡像標籤,一般對應該鏡像的版本號
image id 鏡像的ID
created 鏡像創建日期
size 鏡像大小

搜索鏡像:

docker search 鏡像名稱
列名 介紹
NAME 倉庫名稱
DESCRIPTION 鏡像描述
STARS 用戶評價,反應一個鏡像的受歡迎程度。應該類似於GitHub收藏數?或者是基於某種演算法計算而來
OFFICIAL 是否官方
AUTOMATED 自動構建,表示該鏡像由Docker Hub自動構建流程創建的

拉取鏡像

由於一些不可控的原因,我們從中央倉庫下載鏡像速度是很慢的,學過 MAVEN/NPM 的同學應該也知道,這時候就要我們來使用中國的遠程鏡像倉庫了。

使用遠程倉庫的方法:

  1. 編輯該文件:

    vi /etc/docker/daemon.json // 如果該文件不存在就手動創建;說明:在centos7.x下,通過vi

  2. 在該文件中輸入如下內容:

    {  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]  }
  3. 重啟 docker 服務,如果速度還是很慢就重啟一下虛擬機

刪除鏡像

docker rmi $IMAGE_ID:刪除指定鏡像  docker rmi `docker images -q`:刪除所有鏡像

Docker容器操作

查看容器

查看正在運行的容器

docker ps

查看所有的容器

docker ps -a

查看最後一次運行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited

創建與啟動容器

創建容器命令:

docker run
  • -i:表示運行容器

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

  • –name :為創建的容器命名。

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

  • -d:在run後面加上-d參數,則會創建一個守護式容器在後台運行(這樣創建容器後不會自動登錄容器,如果只加-i -t兩個參數,創建後就會自動進去容器)。

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

互動式容器(前台啟動容器)

創建一個互動式容器並取名為mycentos

docker run -it --name=mycentos centos:7 /bin/bash

退出當前容器

exit

守護式容器(後台啟動容器)

創建一個守護式容器:如果對於一個需要長期運行的容器來說,我們可以創建一個守護式容器。命令如下(容器名稱不能重複)

docker run -id --name=mycentos2 centos:7

登錄守護式容器:

docker exec -it 容器名 (或者 容器ID)  /bin/bash(exit退出時,容器不會停止)

停止與啟動容器

停止正在運行的容器:

docker stop 容器名/ID

啟動已運行過的容器:

docker start 容器名/ID

文件拷貝

將宿主機器的文件拷貝到 docker 容器中

docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄

將容器中的文件拷貝到宿主機器中

docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄

目錄掛載

我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。創建容器 添加-v參數 後邊為 宿主機目錄:容器目錄

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

如果你共享的是多級的目錄,可能會出現許可權不足的提示。這是因為CentOS7中的安全模組selinux把許可權禁掉了,我們需要添加參數 –privileged=true
來解決掛載的目錄沒有許可權的問題

查看容器IP地址

docker inspect 容器名  對應的欄位是 ipaddr

刪除容器

docker rm 容器名/ID  // 僅支援刪除未運行的容器  // 刪除所有容器:  docker rm `docker ps -a -q

部署應用

MySQL部署

  1. 拉取 MySQL 鏡像:docker pull mysql
  2. 創建 MySQL 容器:docker run -id –name=pinyougou_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-p 代表埠映射,格式為  宿主機映射埠:容器運行埠  -e 代表添加環境變數  MYSQL_ROOT_PASSWORD是root用戶的登陸密碼
  1. 進入 MySQL 容器,登陸 MySQL
docker exec -it pinyougou_mysql /bin/bash

TomCat部署

  1. 拉取 TomCat 鏡像:docker pull tomcat:7-jre7
  2. 創建 TomCat 容器:
docker run -id --name=pinyougou_tomcat -p 8080:8080 -v /usr/local/myhtml:/usr/local/tomcat/webapps --privileged=true tomcat:7-jre7  // -v 就是指定文件映射路徑(這裡 myhtml是一個CAS單點登陸的工程)  // -p 就是埠映射,可以通過宿主IP:埠 來訪問容器裡面部署的項目
  1. 修改web項目中的配置文件,這裡修改CAS項目連接的資料庫地址為部署 MySQL 的容器的 IP(注意不是宿主機器的IP)

Nginx部署

  1. 拉取 Nginx 鏡像:docker pull nginx
  2. 創建 Nginx 容器:docker run -id –name=pinyougou_nginx -p 80:80 nginx

  3. 測試 Nginx

  4. 配置反向代理:

官方的nginx鏡像,nginx配置文件nginx.conf 在/etc/nginx/目錄下。在容器內編輯配置文件不方便,我們可以先將配置文件從容器內拷貝到宿主機,編輯修改後再拷貝回去。

從容器拷貝配置文件到宿主機:

docker cp pinyougou_nginx:/etc/nginx/nginx.conf nginx.conf 

編輯nginx.conf,添加反向代理配置:

upstream tomcat-cas {      server 172.17.0.7:8080;  }  server {      listen 80;      server_name passport.pinyougou.com;      location / {          proxy_pass http://tomcat-cas;          index index.html index.htm;      }  }

將修改後的配置文件拷貝到容器:

docker cp nginx.conf pinyougou_nginx:/etc/nginx/nginx.conf

重新啟動容器

設置域名指向:

這裡推薦使用:SwitchHost這個管理Host的小工具。下載地址:https://oldj.github.io/SwitchHosts/

1564919017842

記得以管理員身份運行,這裡只能配 IP 和 域名的映射關係,如果想要區別埠,在瀏覽器輸入域名:埠號就OK

Redis部署

  1. 拉取 Redis 鏡像:docker pull redis
  2. 創建 Redis 容器:docker run -id –name=pinyougou_redis -p 6379:6379 redis

  3. 測試,在redis目錄下啟動cmd,輸入以下命令: redis-cli -h 宿主機器IP 【埠號默認6379】

C:developredis-2.8.9>redis-cli -h 192.168.40.131

備份與遷移

容器保存為鏡像

docker commit 容器名 鏡像名

鏡像備份

docker  save -o mynginx.tar mynginx  // -o 指定輸出到的文件名

鏡像恢復與遷移

docker load -i mynginx.tar