1. 學習步驟
Docker
簡介Docker
中的基本概念Docker
安裝- 設置
Docker
Docker
的應用操作Docker
搭建PHP
開發環境
2. Docker
介紹
2.1. Docker
是什么
Docker
是一個開源的應用容器引擎,基于Go
語言開發實現,屬于操作系統層面的虛擬化技術。
Docker
可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何安裝有Docker
的電腦(windows
和Linux
)上。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似iPhone
的app
),更重要的是容器性能開銷極低。
image.png
2.2. Docker
能夠做什么
Docker
可以解決虛擬機能夠解決的問題,同時也能夠解決虛擬機由于電腦資源要求過高而無法解決的問題。
虛擬機和Docker
虛擬化的不同之處:
image.png
2.3. 為什么使用 Docker
1、更快速的交付和部署:
對開發和運維員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
例如:開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。Docker
容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
節約安裝各種開發環境的軟件的時間。
解決開發環境和生產環境不一致的問題。
2、更輕松的遷移和擴展:
Docker
容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
3、更高的資源利用率:
Docker
對系統資源的利用率很高,一臺主機上可以同時運行數千個Docker
容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker
只需要啟動 10 個隔離的應用容器即可。
總結:
Docker
背后的想法是創建軟件程序可移植的輕量級容器,讓其可以在任何安裝了Docker
的機器上運行,并不用關心底層操作系統,就像野心勃勃的造船者們成功創建了集裝箱而不需要考慮裝在哪種船舶上一樣。
只有一個共同目標:簡化部署流程,提高生產力!
2.4. Docker
項目架構
Docker
使用C/S
架構,通過docker
客戶端連接到Docker
服務器上從而管理Docker
服務器里面的鏡像和容器,類似于git
的架構。
image.png
2.5. Docker
的基本概念
2.5.1. 鏡像(
Image
)
Docker
鏡像(Image
)就是一個只讀的模板。例如:一個鏡像可以包含一個完整的操作系統環境,里面僅安裝了Apache
或用戶需要的其它應用程序。鏡像可以用來創建Docker
容器,一個鏡像可以創建很多容器。Docker
提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
2.5.2. 容器(
Container
)
Docker
利用容器(Container
)來運行應用。容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的Linux
環境(包括root
用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
文件系統隔離技術使得Docker
成為了一個非常有潛力的虛擬化技術。在容器中可以對文件進行修改、刪除、創建。
2.5.3. 倉庫(
Registry
)
倉庫(Repository
)是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務器(Registry
)混為一談,并不嚴格區分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag
)。
倉庫分為公開倉庫(Public
)和私有倉庫(Private
)兩種形式。最大的公開倉庫是Docker Hub
,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括 時速云 、網易云 等,可以提供大陸用戶更穩定快速的訪問。當然,用戶也可以在本地網絡內創建一個私有倉庫。
當用戶創建了自己的鏡像之后就可以使用push
命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上pull
下來就可以了。
Docker
倉庫的概念跟Git
類似,注冊服務器可以理解為GitHub
這樣的托管服務。
3. Windows 10
下安裝 Docker
3.1. 系統要求
一、64bit Windows 10 Build 10586 以上專業版或者企業版本,電腦支持虛擬化。
二、開啟Hyper-V。
三、win7、win8 等需要利用 docker toolbox 來安裝。
3.1.1. 查看系統版本和版本號
查看系統信息:
image.png
查看版本號:
win+R 輸入cmd
進入 dos 系統就可以看到
image.png
3.1.2. 電腦支持虛擬化
對于
windows10
系統來說,你可以在 任務管理器->性能 中查看到你的電腦是否開啟了虛擬化
image.png
在BIOS下開啟虛擬化虛擬化:
image.png
3.1.3. 開啟Hyper-V
windows設置 -> 應用 -> 應用和功能 -> 程序和功能 -> 啟用和關閉Windows功能 -> 選中Hyber-V -> 重啟
選中Hyper-V后確定重啟電腦
image.png
注意:Hyper-V
是與 VMware
是沖突的,兩者不能并存,只能擇其一,如果你必須要使用虛擬機的話,比如 Vagrant
之類的工具,亦可在虛擬機內運行一個 Linux
系統,然后根據 Linux
系統 的安裝流程處理,在虛擬機內運行 Docker
作為開發環境。
3.2. 安裝Docker for Windows
3.2.1. 下載Docker for Windows
https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
3.2.2. 安裝
雙擊下載的
Docker for Windows Installer.exe
安裝完畢即可。
3.2.3. 啟動
啟動之后會在電腦的右下角查看到
docker
的圖標image.png
4. 簡單使用 Docker
4.1. 使用Docker
的前提
必須通過 dos命令 行來操作
Docker
。win+R 輸入cmd
進入 dos 系統
4.2. Docker
命令初體驗
docker info
#查看docker信息
docker version
#查看docker版本
docker run hello-world
#運行第一個容器
5. 設置Docker
5.1. 切換到Linux
容器下
docker for windows
默認使用linxu
容器。如有需要可切換到win
容器下。
右鍵點擊docker
圖標:
image.png
5.2. 鏡像加速
鑒于國內網絡問題,后續拉取
Docker
鏡像十分緩慢,強烈建議安裝Docker
之后配置 國內鏡像加速。
5.2.1. 獲取阿里云加速器地址
登錄阿里云進入后臺
image.png
5.2.2. 配置docker
加速器
對于使用
Windows 10
的系統,在系統右下角托盤Docker
圖標內右鍵菜單選擇Settings
,打開配置窗口后左側導航菜單選擇Daemon
。在Registry mirrors
一欄中填寫加速器地址你的專屬加速器地址,之后點擊Apply
保存后Docker
就會重啟并應用配置的鏡像地址了。
image.png
5.2.3. 檢查加速器是否生效
手動檢查加速器配置是否生效,在命令行執行
docker info
,如果從結果中看到了如下內容,說明配置成功。
image.png
6. Docker
鏡像操作
6.1. 獲取鏡像(下載鏡像到本地)
Docker Hub 上有大量的高質量的鏡像可以用,這里我們就說一下怎么獲取這些鏡像。
從
Docker
鏡像倉庫獲取鏡像的命令是docker pull
。其命令格式為:
docker pull
[選項] [Docker Registry
地址 [:端口號] /] 鏡像名 [:標簽]
具體的選項可以通過 docker pull --help
Docker
鏡像倉庫地址:地址的格式一般是<域名/IP>[:端口號]。默認地址是 Docker Hub
,但我們已經將其修改為阿里云的加速器。
例如:
docker pull training/webapp
docker pull busybox
docker pull centos
備注:↓
training/webapp
:python
的app
busybox
:是一個集成了三百多個最常用Linux
命令和工具的軟件,簡化的Linux
系統
centos
:centos
系統容器
6.2. 列出本地鏡像
要想列出已經下載下來的鏡像,可以使用
docker image ls
命令。
image.png
列表包含了 鏡像名、版本、鏡像 ID、創建時間 以及所占用的空間。
6.3. 刪除本地鏡像
如果要刪除本地的鏡像,可以使用
docker image rm
命令,其格式為:
docker image rm
[選項] <鏡像1> [<鏡像2> ...]
備注:
用 ID、鏡像名、摘要刪除鏡像
其中,<鏡像> 可以是 鏡像短 ID、鏡像長 ID、鏡像名 或者 鏡像摘要。
我們可以用鏡像的完整 ID,也稱為 長 ID,來刪除鏡像。使用腳本的時候可能會用長 ID,但是人工輸入就太累了,所以更多的時候是用 短 ID 來刪除鏡像。docker image ls 默認列出的就已經是短 ID 了,一般取前3個字符以上,只要足夠區分于別的鏡像就可以了。
例如:
docker image rm training/webapp
7. Docker
容器操作
7.1. 說在前面
/bin/bash
是linux
的命令行工具,類似于window
的cmd
進入dos
系統
7.2. 查看容器
docker ps
#查看啟動的容器
docker ps -a
#查看所有容器,包含沒有啟動的容器
7.3. 啟動容器
啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。
因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創建容器。
語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
COMMAND
: 容器啟動后進入容器中要執行的命令.
OPTIONS
(常用選項)
-d
:讓Docker
在后臺運行而不是直接把執行命令的結果輸出在當前宿主機下
-t
:選項讓Docker
分配一個偽終端(pseudo-tty
)并綁定到容器的標準輸入上
-i
:則讓容器的標準輸入保持打開。
--name
:為容器命名
-v
:創建數據卷
-p
:綁定端口
7.3.1. 基于鏡像新建一個容器并啟動
docker run
例如:
docker run -p 8000:5000 –-name web training/webapp
實際操作舉例:
啟動
python
的app
:training/webapp
,并綁定本機端口8000映射到容器5000端口
訪問本機image.pngimage.png
7.3.2. 后臺運行
更多的時候,需要讓 Docker 在后臺運行而不是直接把執行命令的結果輸出在當前宿主機下。此時,可以通過添加 -d 參數來實現。
docker run -d CONTAINER [CONTAINER...]
例如:
docker run –d –p 8000:5000 training/webapp
7.3.3. 交互運行
啟動一個
bash
終端,允許用戶進行交互。
docker run -t -i CONTAINER [CONTAINER...] /bin/bash
-t
選項讓Docker
分配一個偽終端(pseudo-tty
)并綁定到容器的 標準輸入 上
-i
則讓容器的 標準輸入 保持打開。
在交互模式下,用戶可以通過所創建的終端來輸入linux命令
例如:
docker run -i -t centos /bin/bash
創建centos容器并且進入centos容器中image.png
7.4. 終止容器
docker stop CONTAINER [CONTAINER...]
例:
image.png
7.5. 啟動一個停止的容器
docker start CONTAINER [CONTAINER...]
例:
image.png
7.6. 重啟容器
docker restart CONTAINER [CONTAINER...]
例:
image.png
7.7. 刪除容器
docker rm CONTAINER [CONTAINER...]
注意:刪除容器前 先關閉容器
例:
image.png
7.8. 獲取容器的輸出信息
docker logs CONTAINER [CONTAINER...]
例:
image.png
7.9. 進入容器
docker exec –i –t CONTAINER /bin/bash
例:
image.png
7.10. 主機和容器間拷貝文件
7.10.1. 容器拷貝到主機
docker cp CONTAINER:/opt/webapp/app.py d:/www
備注:
/opt/webapp/app.py: 容器中的文件
d:/www: 主機文件夾
例:
image.pngimage.png
7.10.2. 主機拷貝到容器
docker cp f:/docker_test/文件 CONTAINER:/目標路徑
例:
image.pngimage.png
8. 數據卷
8.1. 什么是數據卷
數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
- 數據卷 可以在容器之間共享和重用
- 對 數據卷 的修改會立馬生效
- 對 數據卷 的更新,不會影響鏡像
- 數據卷 默認會一直存在,即使容器被刪除
理解:
1.數據卷 的使用,類似于 Linux
下對目錄或文件進行 mount
,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數據卷。
2.相當于將容器中的目錄 和 本機目錄映射起來,在本機目錄中修改代碼,增加文件等,會實時反映在容器目錄中
8.2. 為什么要使用數據卷
方便將本地主機中的代碼運行在docker
容器中
8.3. 掛載數據卷的前提
授權本地磁盤
image.png
注意:點擊Apply的時候,會驗證本機賬戶,沒有設置密碼的話,去設置一個吧。
8.4. 掛載一個主機目錄作為數據卷
docker run -d -P 8000:5000 --name web -v f:/docker:/opt/webapp training/webapp
9. Docker應用-搭建PHP開發環境
9.1. 下載阿里云的lamp鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/itsource/centos-lamp:[鏡像版本號]
鏡像版本號就是TAG的值
9.2. 創建lamp容器并且運行
docker run -itd -p 80:80 -p 3306:3306 --name lamp --privileged=true -v D:/www/default:/data/wwwroot/default ec258725b54b /usr/sbin/init
-i選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上,
-t 則讓容器的標準輸入保持打開。
-d 則讓容器在后臺運行。
--name lamp為容器起名為lamp
--privileged=true 讓container內的root擁有真正的root權限。
-v 創建數據卷,將本地主機目錄掛著到容器的指定目錄中
10. 制作阿里云鏡像
10.1. 制作本地鏡像
docker commit -a "itsource.com" -m "this is image" 容器ID 鏡像名字:版本
OPTIONS說明:
· -a :提交的鏡像作者;
· -m :提交時的說明文字;
· -p :在commit時,將容器暫停。
10.2. 上傳阿里云
進入阿里云演示
10.3. 導出鏡像到本地
docker save d2b9f203546d -o d:/www/centos-lamp-v2.tar
10.4. 加載本地鏡像文件
docker load -i d:/www/centos-lamp-v2.tar
安裝wget
yum install wget –y
備份yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo <u>http://mirrors.aliyun.com/repo/Centos-7.repo</u>
解決bash: service: command not found
yum install initscripts.x86_64 –y
yum install net-tools
docker run -it -p 80:80 --name lamp2 --privileged=true itsource/centos-lamp /usr/sbin/init
docker run -itd -p 80:80 --name lamp3 --privileged=true -v /data/wwwroot/www.baidu.com:/data/wwwroot/www.baidu.com itsource/centos-lamp /usr/sbin/init
docker rm $(docker ps -a -q)