文章目錄
1. Docker 簡介
1.1 什麼是虛擬化
在計算機中,虛擬化(Virtualization)是一種資源管理技術,是將計算機的各種實體資源(如: 服務器、網絡、內存及存儲等)予以抽象、轉化後呈現出來, 打破實體間不可切割的障礙,使用戶可以通過更好的方式來應用這些資源。
- 在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件,對資源充分利用。
- 虛擬化的種類有很多,例如:
軟件虛擬化:Vmware軟件、KVM軟件、VirtualBox軟件等
硬件虛擬化: 磁盤陣列RAID、邏輯卷LVM、
內存虛擬化、網絡虛擬化、桌面虛擬化、服務虛擬化、虛擬機等。
1.2 什麼是 Docker
Docker 是一個開源的應用容器引擎, 誕生2013年,最初是 dotCloud 公司內部的一個業餘項目。它基於Google公司推出的 Go 語言實現。 項目後來加入 Linux 基金會,遵從了Apache2.0協議,源代碼託管在 Github 進行維護。
Docker 自開源後受到廣泛的關注和討論,以至於 dotcloud 公司後來都改名爲 Docker Inc。Redhat 已經在 RHEL6.5 中集成對 Docker 的支持,Google 也在 PaaS 產品中廣泛應用。
- Docker項目的目標是實現輕量級的操作系統虛擬化解決方案。Docker的基礎是Linux容器(LXC)等技術。在2018年之前是不支持在Windows系統部署Docker的。
- 在LXC的基礎上Docker做了進一步的封裝,讓用戶不需要去關心容器的管理,使操作更爲簡便。用戶操作Docker的容器就像操作一個快速輕量級的虛擬機一樣簡單
Docker的優勢:
- 上手快
用戶只需要幾分鐘,就可以把自己的程序"Docker化"。Docker依賴於"寫時複製"(copy-onwrite)模型,使修改應用程序也非常迅速,可以說達到"隨心所欲,代碼即改"的境界。
隨後,就可以創建容器來運行應用程序了。大多數Docker容器只需要不到1秒即可啓動。由於去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶儘可能的充分利用系統資源。
在linux程序中,fork()會產生一個和父進程完全相同的子進程,但子進程在此後多會
exec系統調用,出於效率考慮,linux中引入了“寫時複製”技術,也就是隻有進程空間的
各段的內容要發生變化時,纔將父進程的內容複製一份給子進程。
-
職責的邏輯分類
使用Docker,開發人員只需要關心容器中優秀的應用程序,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。從而降低那種"開發時一切正常,肯定時運維的問題(測試環境都是正常的, 上線後出了問題就歸結爲肯定是運維的問題)"。 -
快速高效的開發生命週期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裏面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從盒子裏一件一件的取)。 -
鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或者進程,這樣就形成了一個分佈式的應用程序模型,在這種模型下,應用程序或者服務都可以表示爲一系列內部互聯的容器。從而使分佈式部署應用程序,擴展和調試應用程序都變得非常簡單,同時也提高了程序的內省性。(當然,一個程序中可以運行多個應用程序)。
1.3 容器與虛擬化的比較
下面的圖片比較了Docker和傳統的虛擬化方式的不同之處,可見容器在操作系統層面上實現虛擬化,直接複用本地主機的操作系統,而傳統的虛擬化則是在硬件層面實現。
總結: 與傳統的虛擬機相比,Docker的優勢體現爲啓動速度快、佔用體積小。
1.4 Docker 組件
1.4.1 Docker 服務器與客戶端
Docker是一個客戶端/服務器(C/S)架構的程序。Docker客戶端只需向Docker服務器或守護進程發出請求,服務器或守護進程將完成所有工作並返回結果。
- Docker提供了一個命令行工具docker以及一整套RESTful API來與守護進程交互。
- 用戶可以在同一臺宿主機上運行Docker守護進程和客戶端。
1.4.2 Docker鏡像與容器
- 倉庫:每個倉庫存放某一類鏡像。
- 鏡像:類似虛擬機鏡像(eg:xxx.iso)。 eg: MySQL鏡像、Redis鏡像、2048鏡像
- 容器:類似linux系統環境,運行和隔離應用。容器從鏡像啓動的時候,docker會在鏡像的最上一層創建一個可寫層,鏡像本身是隻讀的,保持不變。
1.4.3 Registry(註冊中心)
Docker用Registry來保存用戶構建的鏡像。Registry分爲公有和私有兩種。
- 公有倉庫 :所有人可以訪問下載鏡像的倉庫。Docker公司運營公共的Registry叫做Docker Hub。
- 私有倉庫: 規定範圍內可以訪使用的庫。用戶可以構建私有的Registry。
2. Docker 的安裝與啓動
如果你有一個阿里雲服務器,直接 yum 安裝即可
yum install docker -y
如果你在自己的虛擬機 (redhat7.4) 上安裝,則需要配置 yum 源
方法一: 直接使用docker鏡像源安裝docker最新版本
step1:yum 包更新到最新
cd /etc/yum.repos.d/
# 阿里安裝軟件鏡像源下載
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache # 生成緩存
yum update # yum包更新
step2:配置yum倉庫安裝Docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/dockerce.
repo
step3:安裝 Docker
yum install docker-ce -y
step4:安裝後查看 Docker 版本
docker -v
方法二:官網下載軟件包,自行安裝
# 在下載目錄下
yum install * -y
docker -v
2.2 設置 ustc 的鏡像
ustc說老牌的linux鏡像服務提供者,ustc的docker鏡像加速器速度很快。ustc docker mirror 的優勢之一就是不需要註冊,是真正的公共服務,https://lug.ustc.edu.cn/wiki/
編輯文件
vim /etc/docker/daemon.json
編輯以下內容,保存退出
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
}
2.3 Docker 的啓動與停止
# 啓動
systemctl start docker
# 停止
systemctl stop docker
# 重啓
systemctl restart docker
# 查看Docker狀態
systemctl status docker
# 開機啓動Docker
systemctl enable docker
# 查看Docker概要信息
docker info
# 查看Docker幫助文檔
docker --help
3. 常用命令
3.1 鏡像相關命令
3.1.1 查看鏡像
docker load -i game2048.tar # 從tar包載入鏡像
docker pull tensorflow/tensorflow # 從鏡像倉庫拉取鏡像
docker images # 查看鏡像
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下。
3.1.2 搜索鏡像
如果你需要從網絡中查找需要的鏡像,可以通過下面命令搜索:
docker search 鏡像名稱
3.1.3 拉取鏡像
docker pull 鏡像名稱
3.1.4 刪除鏡像
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 [-options]
-i, --interactive
: 表示運行容器-t, --tty
: 表示容器啓動後進入其命令行(分配一個僞終端)--name
: 指定容器名稱-v, --volume list
: 表示一個/多個目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄)-d, --detach
: 創建一個守護進程在後臺運行-p, --publish list
: 表示一個/多個端口映射,前者是宿主機端口,後者是容器內的映射端口。
- 交互式創建容器
docker load -i ubuntu.tar # 加載 ubuntu 鏡像
docker run -it --name=myubuntu ubuntu /bin/bash # 爲 ubuntu 創建容器, exit退出當前容器
docker ps -a
- 守護方式創建容器
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 myubuntu1 ubuntu
docker exec -it myubuntu1 /bin/bash
root@8e80ee93f4e1:/# cd /usr/local/myhtml/
root@8e80ee93f4e1:/usr/local/myhtml# ls
test
如果你共享的是多級的目錄,可能會出現權限不足的提示。
這是因爲Redhat7的安全模塊Selinux把權限禁掉了, 我們需要添加參數--privileged=true
來解決掛載的目錄沒有權限的問題。
3.2.6 查看容器IP地址
我們可以通過以下命令查看容器運行的各種數據,myubuntu1是容器的名稱
docker inspect myubuntu1
也可以執行下面的命令直接輸出IP地址,myubuntu1是容器的名稱。
docker inspect --format='{{.NetworkSettings.IPAddress}}' myubuntu1
3.2.7 刪除容器
刪除指定的容器,如果刪如果刪除容器時,容器正在運行中,則先停止容器。
docker stop myubuntu1
docker rm myubuntu1
4. 案例基於Docker的2048項目
step1:從倉庫拉取鏡像信息
docker images
deocker search 2048
docker pull docker.io/blackiceburd/2048
step2:重啓Docker容器
systemctl restart docker
step3:容器操作(雲服務器下)
# 創建容器,並把容器的80端口映射到宿主機的(本地:127.0.0.1:80:80)端口
docker run -d --name game2048 -p 0.0.0.0:80:80 docker.io/blackiceburd/2048
# 查看
docker ps -a
netstant -antlpe | grep 80
執行結果:
5. 遷移與備份
5.1 容器保存爲鏡像
可以通過以下命令將容器保存爲鏡像
docker commit mysql mysql:remote_login
5.2 鏡像備份
docker save -o mysqlRemoteLogin.tar mysql:remote_login
5.3 鏡像恢復與遷移
docker load -i mysqlRemoteLogin.tar
-i 輸入的文件
執行後再次查看鏡像,可以看到鏡像已經恢復。
6. Dockerfile
6.1 什麼是Dockerfile
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。
- 對於開發人員:可以爲開發團隊提供一個完全一致的開發環境。
- 對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了。
- 對於運維人員: 在部署時,可以實現應用的無縫移植。
6.2 常用命令
命令 | 作用 |
---|---|
FROM Image_name:tag | 定義了使用哪個基礎鏡像啓動構建流程 |
MAINTAINER user_name | 聲明鏡像的創建者 |
RUN command | 執行命令,是Dockerfile的核心部分(可以寫多條) |
COPY source_dir/file dest_dir/file | 和ADD類似, 如果是壓縮文件,不會自動解壓 |
ENV key value | 設定環境變量 |
WORKDIR path_dir | 設置工作目錄 |
7. Docker私有倉庫
7.1 私有倉庫搭建和配置
step1:拉取私有倉庫鏡像
docker pull registry
step2:啓動私有倉庫容器
docker run -di --name registry -p 5000:5000 registry
# 查看 --> 172.17.0.7 http://172.17.0.7:5000
docker inspect --format='{{.NetworkSettings.IPAddress}}' registry
step3:測試頁面訪問: http://172.17.0.7:5000/v2/_catalog
, 私有倉庫搭建不成功內容爲空,否則,返回{"repositories": []}
step4:修改daemon.json
vim /etc/docker/daemon.json
編輯以下內容,保存退出。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["172.17.0.7:5000"]
}
step5:重啓docker服務
systemctl restart docker
7.2 鏡像上傳至私有倉庫
step1:標記鏡像爲私有倉庫的鏡像
docker tag mysql:remote_login 172.17.0.7:5000/remote_login
step2:上傳標記的鏡像
docker push 172.17.0.7:5000/remote_login