部署Docker容器虛擬化平臺

一、 Docker概述

1、 Docker概述
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可一致的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙盒機制,相互之間不會有任何接口。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴於任何語言、框架或包裝系統。
沙盒也叫沙箱,英文sandbox。在計算機領域指一種虛擬技術,且多用於計算機安全技術。安全軟件可以先讓它在沙盒中運行,如何含有惡意行爲,則禁止程序的進一步運行,而這不會對系統造成任何危害。
Docker是dotCloud公司開源的一個基於LXC的高級容器引擎,源代碼託管在Github上,基於go語言並遵循Apachae2.0協議開源。
Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的container中,然後發佈到任何流行的Linux機器上。
擴展:LXC
LXC是Linux Container的簡寫。Linux container容器是一種內核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他複雜性。
LXC主要通過來之kernel的namespace實現每個用戶實例之間的相互隔離,通過cgroup實現對資源的配額和度量。

官方網站:
https://www.docker.com
注:docker服務相當於鯨魚,container容器就是集裝箱
container:集裝箱、容器
docker:碼頭工人
docker源代碼:https://github.com/moby/moby

2、 Docker容器技術虛擬機對比
相同點:docker容器技術和虛擬機技術,都是虛擬化技術。
在這裏插入圖片描述
總結:docker相對於VM虛擬機,少了虛擬機操作系統這一層,所以docker效率比虛擬機高。

3、 Docker架構
在這裏插入圖片描述
工作流程:服務器A運行Docker Engine服務,在docker Engine上啓動很多容器container,從外網Docker Hub上吧images操作系統鏡像下載到本地,放到container容器運行。這樣一個容器的實例就運行起來了。
最後,通過Docker Client對docker容器虛擬化平臺進行控制。
DockerHub::dockerhub是docker官方的鏡像存儲點,其中提供了很多常用的鏡像供用戶下載,如ubuntu,centos等系統鏡像。通過dockerhub用戶也可以發佈自己的docker鏡像,爲此用戶需要註冊一個賬號,在網站上創建一個docker倉庫。

4、 Docker特性
文件系統隔離:每個進程容器運行在一個完全獨立的跟文件系統裏。
資源隔離:系統資源,像CPU和內存等可以分配到不同的容器中,使用cgroup。
網絡隔離:每個進程容器運行在自己的網絡空間,虛擬接口和IP地址。
日誌記錄:Docker將會收集和記錄每個進程容器的標準流,用於實時檢索或批量檢索。
變更管理:容器文件系統的變更可以提交到新的鏡像中,並可重複使用以創建更多的容器。無需使用模板或手動配置。
交互式shell:Docker可以分配一個虛擬終端並關聯到任何容器的標準輸入上,例如運行一個一次性交互shell。

5、 Docker優點
1) 一些優勢和VM一樣,但不是所有都一樣
比VM小,比VM快。Docker容器的尺寸減小相比整個虛擬機大大簡化了分佈到雲和從雲分佈時間和開銷。Docker啓動一個容器實例時間短,一兩秒就可以啓動一個實例。
2) 對於在筆記本電腦,數據中心的虛擬機,以及任何的雲上,運行相同的沒有變化的應用程序,IT的發佈速度更快。
Docker是一個開放的平臺,構建,發佈和運行分佈式應用程序。
Docker使應用程序能夠快速從組建組裝和避免開發和生成環境之間的摩擦。
3) 您可以在部署在公司局域網或雲或虛擬機上使用它。
4) 開發人員並不關心具體哪個linux操作系統
使用Docker,開發人員可以根據所有依賴關係構建相應的軟件,針對他們所選擇的操作系統。然後,在部署時一切是完全一樣的,因爲一切都在DockerImage的容器在其上運行。開發人員負責並且能夠確保所有的相關性得到滿足。
5) Google,微軟,亞馬孫,IBM等都支持Docker。
6) Docker支持Unix/Linux操作系統,也支持Windows或Mac

6、 Docker侷限性
Docker用於應用程序時是最有用的,但並不包括數據。日誌,跟蹤和數據庫等通常應放在Docker容器外。一個容器的鏡像通常很小,不合適存大量數據,存儲可以通過外部掛載的方式使用。比如使用:NFS、ipsan、MFS等,-V映射磁盤分區。
一句話:docker只用於計算,存儲交給別人。
oracle不適合使用docker來運行,太大了,存儲的數據太多。

7、 Docker版本簡單介紹
1) docker版本的安裝方法
Docker最早的版本名是docker和docker-engine,現在名字是docker-ce和docker-ee。
2017年年初,docker公司將原先的docker開源項目改名爲moby。
moby是繼承了原先的docker項目,是社區維護的開源項目,誰都可以在moby的基礎打造自己的容器產品。
docker-ce是docker公司維護的開源項目,是一個基於moby項目的免費的容器產品。
docker-ee是docker公司維護的閉源產品,是docker公司的商業產品。
注:moby是源代碼;docker-ce和docker-ee是容器產品,是rpm包。
所以,現在我們通常使用到的版本就是docker-ce版本。

二、 部署docker容器虛擬化平臺

1、 安裝docker環境依賴
[root@xuegod120 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

2、 安裝國內docker的yum源(阿里雲)
[root@xuegod120 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、 安裝docker-ce
[root@xuegod120 ~]# yum -y install docker-ce docker-ce-cli containerd.io
4、 下載docker鏡像
默認docker鏡像是從國外的源下載,這樣就會造成在pull鏡像的時候,經常會因爲網絡問題,造成pull失敗。所以我們配置國內的docker鏡像加速源,一般使用阿里雲、網易163等常用的網絡源。

1) 配置阿里的docker鏡像源
https://cr.console.aliyun.com #登錄後輸入支付寶賬號或淘寶賬號,找到自己的docker加速地址
在這裏插入圖片描述

2) 配置網易163的加速鏡像
https://c.163.com/hub#/m/home/ #需要先註冊登錄上,才能打開此站點
在這裏插入圖片描述

3) 配置linux本地docker加速鏡像
方法1:創建daemon.json文件
[root@xuegod120 ~]# tee /etc/docker/daemon.json << eof

{
"registry-mirrors": ["https://p3rfhvb9.mirror.aliyuncs.com"]
}
eof

方法2:修改docker的啓動腳本
[root@xuegod120 ~]# vim /usr/lib/systemd/system/docker.service
在下面內容ExecStart 後加入鏡像的鏈接
[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H fd:// --registry-mirror= https://p3rfhvb9.mirror.aliyuncs.com

推薦使用方法1,使用方法2需要重載daemon和docker服務。

4) 啓動docker服務
[root@xuegod120 ~]# systemctl enable docker
[root@xuegod120 ~]# systemctl start docker

5) 顯示docker版本和信息
[root@xuegod120 ~]# docker version
[root@xuegod120 ~]# docker info
[root@xuegod120 ~]# docker info
Server:
Containers: 0 #總個數
Running: 0 #運行中的個數
Paused: 0 #暫停的個數
Stopped: 0 #停止的個數
Images: 0 #鏡像的數量
Server Version: 19.03.2 #docker的版本嘻嘻
Storage Driver: overlay2
Backing Filesystem: xfs #docker的文件系統格式
………
Name: xuegod120.com #docker宿主機的名稱
ID: TAAJ:S7TP:MKNQ:OWEL:DH3D:LF4R:XRLQ:PRJG:6BNQ:5PVP:Z2AG:4JUW
Docker Root Dir: /var/lib/docker #docker的家目錄
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://p3rfhvb9.mirror.aliyuncs.com/ #默認的dockerhub鏡像源變更爲阿里雲的源
Live Restore Enabled: false

6) 搜索docker鏡像
[root@xuegod120 ~]# docker search centos
在這裏插入圖片描述

7) 下載docker鏡像
方法1:從配置的docker鏡像地址下載
[root@xuegod120 ~]# docker pull centos
在這裏插入圖片描述
[root@xuegod120 ~]# netstat -antup | grep 443 #查看是否從阿里雲的docker鏡像下載
在這裏插入圖片描述
在這裏插入圖片描述

方法2:從其他下載站點下載鏡像
[root@xuegod63 ~]# docker pull hub.c.163.com/library/tomcat:latest #從163下載

8) 查看下載的docker鏡像文件
[root@xuegod120 ~]# docker images
在這裏插入圖片描述
5、 開啓動態網絡轉發功能
[root@xuegod120 ~]# echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
[root@xuegod120 ~]# sysctl -p
net.ipv4.ip_forward = 1

不開啓網絡轉發功能,會出現如下錯誤:
在這裏插入圖片描述

6、 將本地的tar包鏡像上傳到服務,並加到docker images
[root@xuegod120 ~]# ls
anaconda-ks.cfg docker.io-centos-lastest-image.tar
[root@xuegod120 ~]# docker load -i docker.io-centos-lastest-image.tar
在這裏插入圖片描述

查看上傳的鏡像
在這裏插入圖片描述
注:之前通過阿里雲的鏡像下的鏡像名稱和標籤同我們上傳的名稱和標籤一樣,所以之前的標籤變更爲none。

三、 Docker平臺基本使用方法

1、 docker的常用參數和語法
語法:docker run -it 鏡像名字:標籤 命令
-i:已交互式運行容器,通常與-t同時使用;
-t:爲容器重新分配一個僞輸入終端,通常與-i同時使用;
-d:後臺運行容器,並返回容器ID;
-c:後面跟待完成的命令

例1:啓動一個交互式的進程
[root@xuegod120 ~]# docker run -it centos:latest bash
在這裏插入圖片描述
例2:在container中啓動一個長久運行的進程,不斷向stdin輸出hello workd。模擬一個後臺運行的服務
[root@xuegod120 ~]# docker run -d centos:latest /bin/sh -c “while true;do echo hello world;sleep 1;done”
在這裏插入圖片描述
加上-d參數後,實例後臺運行中,例1的交互式啓動,退出後實例自動關閉。

2、 查看容器的日誌
[root@xuegod120 ~]# docker logs 9bd8271268e0 #後跟容器ID
在這裏插入圖片描述
注:容器ID可寫全,也可以不寫全。保持唯一性就行。

3、 查看容器
查看運行中的容器
[root@xuegod120 ~]# docker ps
查看所有容器
[root@xuegod120 ~]# docker ps -a
在這裏插入圖片描述

4、 殺死一個容器
殺死容器,只能是運行中容器,其它狀態的,無法殺死。
[root@xuegod120 ~]# docker kill 9bd8271268e0
在這裏插入圖片描述

5、 啓動、停止、重啓container容器實例
[root@xuegod120 ~]# docker start 9bd8271268e0 #啓動容器實例
[root@xuegod120 ~]# docker stop 9bd8271268e0 #停止容器實例
[root@xuegod120 ~]# docker restart 9bd8271268e0 #重啓容器實例

6、 刪除指定的容器實例
刪除運行中的容器實例
[root@xuegod120 ~]# docker rm -f 9bd8271268e0 #加上-f,強制刪除,可以先停止在刪除
在這裏插入圖片描述
刪除休眠或停止的容器實例
[root@xuegod120 ~]# docker rm 5cfa067e7b44
在這裏插入圖片描述

四、 Docker鏡像製作方法

Docker Image的兩種製作方法
方法1:docker commit
保存container的當前狀態到image後,然後生成對應的image
語法:docker commit 容器實例ID 新image的名稱和標籤
方法2:docker build
使用Dockerfile文件自動化製作image
語法:docker build -t 父鏡像名:鏡像的標籤 Dockerfile文件所在路徑

1、 使用docker commit製作鏡像
1) 創建一個安裝好apache的容器實例
[root@xuegod120 ~]# docker run -it centos:latest bash
[root@3dc4fe8d7390 /]# yum -y install httpd
[root@aeb1c34ee4c0 /]# exit

2) 查看images鏡像列表
[root@xuegod120 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 49f7960eb7e4 15 months ago 200MB

3) 使用commit創建包含apache的鏡像
[root@xuegod120 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND EATED STATUS PORTS NAMES
aeb1c34ee4c0 centos:latest “bash” 2 hours ago Up 2 hours unruffled_cannon
[root@xuegod120 ~]# docker commit aeb1c34ee4c0 centos:apache
[root@xuegod120 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos apache 16a7923155b7 10 seconds ago 343MB
centos latest 49f7960eb7e4 15 months ago 200MB
注:centos:apache就是在centos:latest啓動容器實例的基礎上創建的一個鏡像文件
4) 使用新創建的鏡像,啓動一個實例
[root@xuegod120 ~]# docker run -it centos:apache bash
[root@5ec3243b085b /]# rpm -qa httpd #啓動的實例,包含之前創建的apache
httpd-2.4.6-89.el7.centos.1.x86_64

2、 使用docker build創建docker鏡像
1) 創建工作目錄
[root@xuegod120 ~]# mkdir /docker-build && cd /docker-build/
[root@xuegod120 docker-build]# touch Dockerfile

2) 編輯Dockerfile
[root@xuegod120 docker-build]# vim Dockerfile
FROM centos:latest
MAINTAINER [email protected]
RUN yum -y install httpd
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh

註釋:
FROM centos:latest #FROM基於哪個鏡像
MAINTAINER [email protected] #MAINTAINER鏡像創建者
RUN yum -y install httpd #RUN安裝軟件用
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh
#ADD將文件拷貝到新產生的鏡像的文件系統對應的路徑。所有拷貝到新鏡像中的文件和文件夾權限爲0755,uid和gid爲0
CMD /usr/local/bin/start.sh#當docker實例啓動成功後,會執行CMD 後面的命令。所以CMD後面一般跟需要開機啓動的服務或腳本。一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD.

3) 創建腳本內的相關文件
[root@xuegod120 docker-build]# echo “/usr/sbin/httpd -DFOREGROUND” > start.sh
[root@xuegod120 docker-build]# chmod +x start.sh #增加腳本執行權限
[root@xuegod120 docker-build]# echo “docker image build test” > index.html

4) 使用docker build 來創建新的image
[root@xuegod120 docker-build]# docker build -t centos:httpd ./

5) 查看創建的鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 16a7923155b7 10 seconds ago 343MB
centos latest 49f7960eb7e4 15 months ago 200MB
3、 Docker Image的發佈
方法1:Save Image To TarBall
方法2:Push Image To Docker Hub

方法1:Save Image To TarBall #導出鏡像到本地
保存Image 到tar包
語法:docker save -o 導出的鏡像名.tar 本地鏡像名:鏡像標籤
[root@xuegod120 ~]# docker save -o centos-httpd-image.tar centos:latest [root@xuegod120 ~]# ls
anaconda-ks.cfg centos-httpd-image.tar docker.io-centos-lastest-image.tar

導入鏡像到docker
[root@xuegod120 ~]# docker images
REPOSITORY TAG MAGE ID CREATED SIZE
centos latest 1ee86a2b64e4 12 minutes ago 343MB
[root@xuegod120 ~]# docker rmi 1ee86a2b64e4 #刪除原鏡像
[root@xuegod120 ~]# docker images #發現已經被刪除
[root@xuegod120 ~]# docker load -i centos-httpd-image.tar #導入鏡像
[root@xuegod120 ~]# docker images #已經導入到docker
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1ee86a2b64e4 14 minutes ago 343MB

方法2:Push Image To Docker Hub #將鏡像發佈到外網
1)Signup on docker hub & create repo註冊一個帳號
https://hub.docker.com/
2)Login to docker hub
#docker login -u userabc -p abc123 -e [email protected]
3)Push image to docker hub #上傳鏡像
#docker push centos:httpd
4)Pull image from docker hub #下載鏡像
#docker pull userabc/centos:httpd#用戶名/鏡像名
##後面詳細介紹將鏡像發佈到外網的發佈

五、 Container容器端口映射

1、 啓動一個容器實例,並將容器實例的80端口映射到宿主機
[root@xuegod120 ~]# docker run -dit -p 80:80 centos:latest bash
[root@xuegod120 ~]# docker ps -a
在這裏插入圖片描述

查看映射的端口
[root@xuegod120 ~]# netstat -antup
tcp6 0 0 :::80 ::😗 LISTEN 21192/docker-proxy

使用瀏覽器訪問測試
在這裏插入圖片描述

2、 在啓動的容器實例上,安裝sshd服務,將22端口映射宿主機,通過sshd直接登錄容器實例
方法1:將安裝sshd容器實例打包成鏡像,重新啓動實例後進行映射。
[root@xuegod120 ~]# docker commit 6bdaf6247d73 centos-ssh
[root@xuegod120 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-ssh latest e6bfe70dd4e2 10 seconds ago 455MB
centos latest 1ee86a2b64e4 45 minutes ago 343MB
[root@xuegod120 ~]# docker run --privileged --cap-add SYS_ADMIN -dit -p 222:22 centos:ssh-apache /usr/sbin/init
註釋:
–privileged:以特權模式運行容器實例
–cap-add:以系統最高權限運行容器實例
在這裏插入圖片描述
[root@xuegod120 ~]# docker exec -it 4287412a620d bash #進入啓動後的實例
[root@4287412a620d /]# yum -y install net-tools #安裝網絡工具
在這裏插入圖片描述
[root@4287412a620d /]# passwd root #給root用戶配置密碼

使用宿主機登錄到容器實例
[root@4287412a620d /]# systemctl start sshd #容器實例必須要用最高權限啓動,否則無法運行systemctl命令
[root@4287412a620d /]# netstat -antup | grep 22 #sshd服務已啓動
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 88/sshd

測試網絡連通性,在宿主機上ping容器實例
在這裏插入圖片描述
使用ssh登錄服務器測試
在這裏插入圖片描述

方法2:直接在iptables防火牆中添加nat端口映射
首先查看本機iptables防火牆的NAT的列表
[root@xuegod120 ~]# iptables -t nat --list-rules POSTROUTING
-P POSTROUTING ACCEPT
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 22 -j MASQUERADE

然後仿照上上面的NAT端口映射,添加一條到容器實例IP地址的端口映射
例如將宿主機的8080端口映射到容器實例的80端口,如下:
[root@xuegod120 ~]# iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE

再次查看NAT的列表
[root@xuegod120 ~]# iptables -t nat --list-rules POSTROUTING
-P POSTROUTING ACCEPT
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 22 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE

進入容器實例,啓動httpd服務
[root@4287412a620d /]# systemctl start httpd
[root@4287412a620d /]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 102/httpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 50/sshd

寫入測試頁面,進行訪問測試
[root@4287412a620d /]# echo “hello world xuegod110” > /var/www/html/index.html

使用本地物理機的瀏覽器,訪問宿主機IP地址的8080端口,看能否訪問到網頁
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章