Docker
1.初識Docker
Docker如何解決大型項目依賴關系復雜,不同組件依賴的兼容性問題?
- Docker允許開發中將應用、依賴、函數庫、配置一起打包,形成可移植鏡像
- Docker應用運行在容器中,使用沙箱機制,相互隔離
Docker如何解決開發、測試、生產環境有差異的問題?
- Docker鏡像中包含完整運行環境,包括系統函數庫,僅依賴系統的Linux內核,因此可以在任意Linux操作系統上運行
Docker是一個快速交付應用、運行應用的技術,具備下列優勢:
- 可以將程序及其依賴、運行環境一起打包為一個鏡像,可以遷移到任意Linux操作系統
- 運行時利用沙箱機制形成隔離容器,各個應用互不干擾
- 啟動、移除都可以通過一行命令完成,方便快捷
Docker和虛擬機的差異:
-
docker是一個系統進程;虛擬機是在操作系統中的操作系統
-
docker體積小、啟動速度快、性能好;虛擬機體積大、啟動速度慢、性能一般
鏡像:
- 將應用程序及其依賴、環境、配置打包在一起
容器:
- 鏡像運行起來就是容器,一個鏡像可以運行多個容器
Docker結構:
-
服務端:接收命令或遠程請求,操作鏡像或容器
-
客戶端:發送命令或者請求到Docker服務端
DockerHub:
- 一個鏡像托管的服務器,類似的還有阿里云鏡像服務,統稱為DockerRegistry
2.Docker的安裝
0.安裝Docker
Docker 分為 CE 和 EE 兩大版本。CE 即社區版(免費,支持周期 7 個月),EE 即企業版,強調安全,付費使用,支持周期 24 個月。
Docker CE 分為 stable
test
和 nightly
三個更新頻道。
官方網站上有各種環境下的 安裝指南,這里主要介紹 Docker CE 在 CentOS上的安裝。
1.CentOS安裝Docker
Docker CE 支持 64 位版本 CentOS 7,并且要求內核版本不低于 3.10, CentOS 7 滿足最低內核的要求,所以我們在CentOS 7安裝Docker。
1.1.卸載(可選)
如果之前安裝過舊版本的Docker,可以使用下面命令卸載:
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce
1.2.安裝docker
首先需要大家虛擬機聯網,安裝yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken
然后更新本地鏡像源:
# 設置docker鏡像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast
然后輸入命令:
yum install -y docker-ce
docker-ce為社區免費版本。稍等片刻,docker即可安裝成功。
1.3.啟動docker
Docker應用需要用到各種端口,逐一去修改防火墻設置。非常麻煩,因此建議大家直接關閉防火墻!
啟動docker前,一定要關閉防火墻后!!
啟動docker前,一定要關閉防火墻后!!
啟動docker前,一定要關閉防火墻后!!
# 關閉
systemctl stop firewalld
# 禁止開機啟動防火墻
systemctl disable firewalld
通過命令啟動docker:
systemctl start docker # 啟動docker服務systemctl stop docker # 停止docker服務systemctl restart docker # 重啟docker服務
然后輸入命令,可以查看docker版本:
docker -v
1.4.配置鏡像加速
docker官方鏡像倉庫網速較差,我們需要設置國內鏡像服務:
參考阿里云的鏡像加速文檔:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
3.Docker基本操作
首先來看下鏡像的名稱組成:
- 鏡名稱一般分兩部分組成:[repository]:[tag]。
- 在沒有指定tag時,默認是latest,代表最新版本的鏡像
#鏡像拉取
docker pull nginx #拉取的是nginx
#查看已拉取鏡像
docker images
#保存鏡像為壓縮包
docker save -o 文件名.tar 鏡像名:版本號
#刪除鏡像
docker rmi 鏡像名稱/鏡像id
#加載鏡像壓縮包
docker load -i 文件名.tar
4.容器基本操作
容器保護三個狀態:
- 運行:進程正常運行
- 暫停:進程暫停,CPU不再運行,并不釋放內存
- 停止:進程終止,回收進程占用的內存、CPU等資源
其中:
- docker run:創建并運行一個容器,處于運行狀態
- docker pause:讓一個運行的容器暫停
- docker unpause:讓一個容器從暫停狀態恢復運行
- docker stop:停止一個運行的容器
- docker start:讓一個停止的容器再次運行
- docker rm:刪除一個容器
- docker ps: 查看所有運行的容器及狀態
- docker logs:查看容器運行日志
- docker exec:進入容器執行命令
后邊都要加上參數 指明執行哪個鏡像
創建并運行nginx容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解讀:
- docker run :創建并運行一個容器
- –name : 給容器起一個名字,比如叫做mn
- -p :將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口
- -d:后臺運行容器
- nginx:鏡像名稱,例如nginx
進入容器。進入我們剛剛創建的nginx容器的命令為:
docker exec -it mn bash
命令解讀:
-
docker exec :進入容器內部,執行一個命令
-
-it : 給當前進入的容器創建一個標準輸入、輸出終端,允許我們與容器交互
-
mn :要進入的容器的名稱
-
bash:進入容器后執行的命令,bash是一個linux終端交互命令
修改index.html的內容
容器內沒有vi命令,無法直接修改,我們用下面的命令來修改:
sed -i -e 's#Welcome to nginx#傳智教育歡迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
docker run命令的常見參數有哪些?
- –name:指定容器名稱
- -p:指定端口映射
- -d:讓容器后臺運行
查看容器日志的命令:
- docker logs
- 添加 -f 參數可以持續查看日志
查看容器狀態:
- docker ps
- docker ps -a 查看所有容器,包括已經停止的
5.數據卷操作
在之前的nginx案例中,修改nginx的html頁面時,需要進入nginx內部。并且因為沒有編輯器,修改文件也很麻煩。
這就是因為容器與數據(容器內文件)耦合帶來的后果。
要解決這個問題,必須將數據與容器解耦,這就要用到數據卷了。
**數據卷(volume)**是一個虛擬目錄,指向宿主機文件系統中的某個目錄。
數據卷操作的基本語法如下:
docker volume [COMMAND]
docker volume命令是數據卷操作,根據命令后跟隨的command來確定下一步的操作:
- create 創建一個volume
- inspect 顯示一個或多個volume的信息
- ls 列出所有的volume
- prune 刪除未使用的volume
- rm 刪除一個或多個指定的volume
需求:創建一個數據卷,并查看數據卷在宿主機的目錄位置
① 創建數據卷
docker volume create html
② 查看所有數據
docker volume ls
③ 查看數據卷詳細信息卷
docker volume inspect html
小結:
數據卷的作用:
- 將容器與數據分離,解耦合,方便操作容器內數據,保證數據安全
數據卷操作:
- docker volume create:創建數據卷
- docker volume ls:查看所有數據卷
- docker volume inspect:查看數據卷詳細信息,包括關聯的宿主機目錄位置
- docker volume rm:刪除指定數據卷
- docker volume prune:刪除所有未使用的數據卷
我們在創建容器時,可以通過 -v 參數來掛載一個數據卷到某個容器內目錄,命令格式如下:
docker run \--name mn \-v html:/root/html \-p 8080:80nginx \
這里的-v就是掛載數據卷的命令:
-v html:/root/htm
:把html數據卷掛載到容器內的/root/html這個目錄中
需求:創建一個nginx容器,修改容器內的html目錄內的index.html內容
分析:上個案例中,我們進入nginx容器內部,已經知道nginx的html目錄所在位置/usr/share/nginx/html ,我們需要把這個目錄掛載到html這個數據卷上,方便操作其中的內容。
提示:運行容器時使用 -v 參數掛載數據卷
步驟:
① 創建容器并掛載數據卷到容器內的HTML目錄
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
② 進入html數據卷所在位置,并修改HTML內容
# 查看html數據卷的位置
docker volume inspect html
# 進入該目錄
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
小結
docker run的命令中通過 -v 參數掛載文件或目錄到容器中:
- -v volume名稱:容器內目錄
- -v 宿主機文件:容器內文件
- -v 宿主機目錄:容器內目錄
數據卷掛載與目錄直接掛載的
- 數據卷掛載耦合度低,由docker來管理目錄,但是目錄較深,不好找
- 目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看