目錄
什麼是Docker
視頻學習網站https://www.bilibili.com/video/av27122140
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。
Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名爲 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中廣泛應用。
Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更爲簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化,直接複用本地主機的操作系統,而傳統方式則是在硬件層面實現。
爲什麼要用Docker
作爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有衆多的優勢。
首先,Docker 容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啓動 10 個隔離的應用即可。
具體說來,Docker 在如下幾個方面具有較大的優勢。
更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
更輕鬆的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
對比傳統虛擬機總結
特性 |
容器 |
虛擬機 |
啓動 |
秒級 |
分鐘級 |
硬盤使用 |
一般爲 MB |
一般爲 GB |
性能 |
接近原生 |
弱於 |
系統支持量 |
單機支持上千個容器 |
一般幾十個 |
Docker的基本概念
Docker鏡像
Docker 鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的 ubuntu 操作系統環境,裏面僅安裝了 Apache 或用戶需要的其它應用程序。
鏡像可以用來創建 Docker 容器。
Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那裏下載一個已經做好的鏡像來直接使用。
Docker容器的運用
Docker 利用容器來運行應用。
容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
*注:鏡像是隻讀的,容器在啓動的時候創建一層可寫層作爲最上層。
Docker倉庫
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。
倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。 國內的公開倉庫包括 Docker Pool 等,可以提供大陸用戶更穩定快速的訪問。
當然,用戶也可以在本地網絡內創建一個私有倉庫。
當用戶創建了自己的鏡像之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。
注:Docker 倉庫的概念跟 Git 類似,註冊服務器可以理解爲 GitHub 這樣的託管服務。
Docker安裝指南
Ubuntu 系列安裝 Docker
通過系統自帶包安裝
Ubuntu 16.04 版本系統中已經自帶了 Docker 包,可以直接安裝。
$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
如果使用操作系統自帶包安裝 Docker,目前安裝的版本是比較舊的 0.9.1。 要安裝更新的版本,可以通過使用 Docker 源的方式。
通過Docker源安裝最新版本
要安裝最新的 Docker 版本,首先需要安裝 apt-transport-https 支持,之後通過添加源來安裝。
$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker
14.04 之前版本
如果是較低版本的 Ubuntu 系統,需要先更新內核。
$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
然後重複上面的步驟即可。
安裝之後啓動 Docker 服務。
$ sudo service docker start
CentOS 系列安裝 Docker
Docker 支持 CentOS6 及以後的版本。
CentOS6
對於 CentOS6,可以使用 EPEL 庫安裝 Docker,命令如下
$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io
CentOS7
CentOS7 系統 CentOS-Extras 庫中已帶 Docker,可以直接安裝:
$ yum update -- 用於更新yum
$ sudo yum install docker
安裝之後啓動 Docker 服務,並讓它隨系統啓動自動加載。
$ sudo service docker start
$ sudo chkconfig docker on
阿里雲服務器使用以下命令
啓動docker:systemctl start docker
停止docker:systemctl stop docker
重啓docker:systemctl restart docker
查看docker狀態:systemctl status docker
開機啓動:systemctl enable docker
設置鏡像加速
因爲docker的鏡像倉庫在國外,國內訪問會很慢所以我們需要鏡像加速,提供鏡像加速的企業有阿里雲,網易雲等,這裏我們採用阿里雲
進入阿里雲官網https://www.aliyun.com/
登陸後點擊控制檯進入自己的服務控制檯
然後點擊左上角樹形菜單欄---產品與服務---容器鏡像服務
然後在左邊樹形菜單欄中找到並點擊鏡像加速器然後根據阿里雲的操作文檔操作
centOS6
$ vim /etc/sysconfig/docker
將加速地址copy替換掉紅色字體部分
Docker鏡像命令
docker images羅列出所有的本地鏡像
docker images -q顯示當前鏡像image id
docker images -qa顯示所有本地鏡像image id
docker search 項目名 查看所有docker hub上的該鏡像例如docker search tomcat
Name爲鏡像名,stars爲點贊數
然後可以用docker pull 鏡像名來下載該鏡像docker pull tomcat
如果在鏡像名後加‘:版本號’例如docker pull tomcat:8.0則會下載8.0的tomcat默認爲最新版
docker rmi -f 本地鏡像名刪除單個鏡像
docker rmi -f 鏡像名 鏡像名:(用空格隔開)可以刪除多個鏡像名
docker rmi -f ${docker images -qa} 刪除所有本地鏡像
如果想將鏡像推送到阿里雲上,可以到阿里雲得docker服務去獲取幫助https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
Docker容器命令*
新建並啓動容器
docker [option] image [command] [arg..]
docker run -it REPOSITORY/IMAGE ID
既可啓動容器
可看到root@xxxxxxxx變化已經進入容器內
docker ps查看在運行的容器
docker ps [option]
運行容器並給容器設置別名,下次進入容器可以以別名命名
啓動守護進程(後臺運行)
Docker run -d REPOSITORY/IMAGE ID/NAMES
重啓容器
docker restart REPOSITORY/IMAGE ID/NAMES
停止容器
docker stop REPOSITORY/IMAGE ID/NAMES
強行停止
Docker kill REPOSITORY/IMAGE ID/NAMES
刪除容器
Docker ps -n 數字 查看最近數字個docker容器包括沒有運行的
Docker ps -l 上一輪的容器
Docker rm REPOSITORY/IMAGE ID/NAMES 刪除指定容器沒有停止不可刪除
Docke rm -f REPOSITORY/IMAGE ID/NAMES 強制刪除指定容器
Docker rm -f $(docker ps -qa)強制刪除所有容器
退出容器
退出並在後臺運行容器ctrl+p+q
退出並停止容器
Exeit
容器日誌操作
進入容器
Dokcer attach 容器ID:直接進入容器並且可以在容器中進行操作
Docker exec 容器ID:後臺操作容器(隔山打牛)
操作容器
打包容器爲鏡像文件
Docker commit -a=”作者” -m=”描述/註釋” 打包的容器ID 命名空間/鏡像名:版本號/標籤
將文件複製到宿主機
Docker cp 容器ID:容器地址 宿主地址
端口映射
Tomcat端口映射
Docker run -p 對外暴露的端口號:容器端口號 tomcat
Docker run -p 8888:8080 tomcat
Docker run -P tomcat 隨機分配端口號(大寫P)
Dockerfile保留字命令
from |
基礎鏡像,當前新鏡像是基於哪個鏡像,類似於繼承 |
|
Maintainer |
鏡像維護者的姓名和郵箱地址 |
|
Run |
容器構建時需要運行的命令 |
|
Expose |
當前容器對外暴露的端口號 |
|
Workdir |
指定創建容器後,終端默認登錄後的目錄,一個落腳點 |
|
Evn |
用來構建鏡像過程中設置環境變量 |
|
Add |
將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理url和解壓tar壓縮包 |
|
Copy |
類似ADD,將宿主機目錄下的文件拷貝進鏡像,但是不會自動處理url和解壓tar壓縮包 |
Copy src dest Copy[“src”,”dest”] |
Volume |
容器數據卷,用於數據保存和持久化 |
|
Cmd |
指定一個容器啓動時需要運行的命令,可以有多個cmd但是隻有最後一個會生效 |
|
Entrypoint |
指定一個容器啓動時要運行的命令和cmd一樣,出現多個會追加而不是覆蓋 |
|
Onbuild |
當構建一個被繼承的dockfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild觸發 |
|
自定義centos
原理
然後運行docker build -f dockerfile源文件 -t 新鏡像名字:TAG. (tag是標籤或版本)
注意最後有一個空格和.
自定義tomcat9
安裝mysql配置
安裝配置redis
https://mp.csdn.net/postedit/103232344
https://mp.csdn.net/postedit/103342952
docker------redis容器下的sentinel哨兵模式