容器虛擬化--docker

paas:平臺即服務html

docker三個重要概念:倉庫、鏡像、容器java

docker安裝:前提:關閉selinux,關閉firewalld,啓動iptables服務;建議:選擇統一版本(此處示例爲17.03.0)
官方下載地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/mysql

# yum update -y
# iptables -F && service iptables save

一、腳本安裝方式
# curl -sSL https://get.docker.com/  | sh
二、yum源安裝方式
# yum install -y yum-utils && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
三、rpm安裝方式(推薦 )
# yum install docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm -y

# systemctl start docker && systemctl enable docker
# docker run hello-world       測試調試

使用阿里雲docker鏡像加速:控制檯-容器鏡像服務-鏡像加速器linux

cp /lib/systemd/system/docker.service /etc/systemd/system/

# chmod +x /etc/systemd/system/docker.service
    vim /etc/systemd/system/docker.service   添加以下代碼進行加速
    ExecStart=/usr/bin/dockerd --registry-mirror=https://azvsxtuu.mirror.aliyuncs.com     
systemctl daemon-reload
sudo systemctl restart docker
    ps aux | grep docker        驗證是否加速成功

    docker經常使用命令:除了單條使用外,還支持賦值、解析變量、嵌套使用。
    --help     查看幫助信息
    -q           只顯示容器ID號
    --no-trunc    查看詳細信息
    info        守護進程的系統資源設置
    search    docker倉庫的查詢
    pull         docker倉庫的下載
    images   docker鏡像的查詢
    rmi          docker鏡像的刪除
    ps           容器的查詢
    run         容器的建立啓動
    stats       查看容器所佔的系統資源         
    start | stop     (啓動  |   中止) 容器
    inspect     查看容器對象的信息
    exec 容器名 容器內執行的命令         :容器執行命令(返回結果)
    exec -it 容器名  /bin/bash                  :登入容器的bash(交互式)
    tag 鏡像名:版本號     倉庫地址/鏡像名:版本號           :修改鏡像標籤

    如下爲run命令的延伸:
    run  --restart=always    容器自動隨docker啓動
    run  -h 主機名         :設置容器主機名
    run --add-host  hostname:ip       :在/etc/hosts注入主機名解析
    run --rm                         :容器中止時自動刪除

    嵌套例子:docker rm -f $(docker ps -a -q)      強制刪除全部容器

例子:docker run --name tomcat -p 80:8080 -d 倉庫地址/倉庫名/鏡像名:版本號nginx

docker-compose容器編排工具:容許用戶在一個模板(yaml格式)中定義一組相關聯的容器,會根據--link等參數對啓動的優先級進行排序。
下載地址:https://docs.docker.com/compose/install/
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version 驗證版本信息git

docker-compose經常使用命令:
    --help    查看幫助信息
    -f      指定使用的yaml文件位置
    ps    查看全部容器信息
    logs   查看日誌信息
    up -d    第一次啓動容器項目
    config -q   驗證yaml配置文件是否正確
    start  |   stop |  restart | pause  |  unpause  |  rm       (啓動 | 中止 | 重啓 | 暫停 | 恢復 | 刪除)容器

容器建立時須要制定鏡像,每一個鏡像都由惟一的標識image id,和容器的container id 同樣,默認128位,可使用前16爲縮略形式,也可使用鏡像名和版本號兩部分組合成惟一標識,若是省略版本號,默認使用最新版本標籤(latest)
鏡像的分層:docker的鏡像經過聯合文件系統(union filesystem)將各層文件系統疊加在一塊兒,特色:一、已有的分層只能讀不能修改。二、上層鏡像優先級大於底層鏡像。三、鏡像必須須要至少一個工做在前臺的守護進程。四、最大不超過128層。github

鏡像 》 容器
docker run 鏡像idsql

容器 》 鏡像
docker commit 容器ID 鏡像名:版本號 docker

dockerfile是一種被docker程序解釋的腳本,由一條一條的指令組成,相似於linux下的命令,根據指令生成特定的鏡像。指令最多不超過128行。
dockerfile 》 鏡像
docker build -t 鏡像名:版本號 .數據庫

常見語法:
一、FROM (指定基礎鏡像),有且只有一個。
example: FROM centos:7.2

二、MAINTAINER (用來指定鏡像建立者信息)
example: FROM lewis "a@163.com"

三、RUN (安裝軟件用)
example: RUN cd /tmp && wget 1.tar.gz | tar -xz

四、CMD (設置容器啓動時執行的操做),該命令只能在文件中存在一次,若是有多個,則只執行最後一個。
example:CMD echo "hello,world"

五、ENTRYPOINT (設置容器啓動時執行的操做),該指令的使用分爲兩種狀況:
一、獨自使用,跟CMD一塊兒的話,只生效按位置自上而下執行最後一個CMD或者ENTRYPOINT
example: 此處執行結果爲顯示456
CMD echo "123"
ENTRYPOINT echo "456"
二、配合CMD使用
example:此處執行爲 ls -l
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]

六、USER (設置啓動容器的用戶),默認爲root用戶
example: USER daemon = ENTRYPOINT ["memcached","-u","daemon"]

七、EXPOSE (顯示容器須要映射的端口,僅顯示提醒用途)
example: EXPOSE 22

八、ENV (設置環境變量)
example: ENV JAVA_HOME /path/to/java/dir

九、ADD (從src複製文件到容器內的dest路徑),默認解壓
example: ADD <src> <desc>
<src>:是相對被構建的源目錄的相對路徑,可使文件或目錄的路徑,也能夠是一個遠程的文件url
<desc>:是容器內的絕對路徑

十、COPY (從src複製文件到容器內的dest路徑),區別於ADD,默認不解壓,且不支持url。

十一、VOLUME (指定掛載點)
example: VOLUME ["/tmp/data"]

十二、WORKDIR (切換目錄,相似cd命令)
example: WORKDIR /tmp WORKDIR data RUN vim a.txt 等同於 RUN cd /tmp/data && vim a.txt

1三、ONBUILD (在子鏡像中執行),ONBUILD指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行。
example: ONBUILD ADD . /app/src

docker官方鏡像倉庫:https://hub.docker.com
第三方鏡像倉庫:
網易雲:https://c.163yun.com/hub
阿里雲: https://dev.aliyun.com/search.html

構建docker倉庫
一、官方倉庫構建,缺少認證
docker服務器配置:

docker run -d -v /myregistry:/var/lib/registry -p 5000:5000 --restart=always registry

vim /etc/docker/daemon.json

{
"insecure-registries": ["192.168.40.128:5000"]
}

systemctl restart docker、

上傳鏡像到自建倉庫,其格式爲:倉庫地址/用戶名/鏡像名:版本號

docker push 192.168.40.128:5000/nginx:v1

查看自建倉庫的鏡像

curl -XGET http://192.168.40.128:5000/v2/_catalog

客戶端使用自建倉庫的設置:

vim /etc/docker/daemon.json

{
"insecure-registries": ["192.168.40.128:5000"]
}

docker pull 192.168.40.128:5000/nginx:v1

二、harbor倉庫構建
官方網站 :https://goharbor.io

harbor組件介紹:
一、proxy:由nginx服務器構成的反向代理
二、registry:由docker官方的開源registry鏡像構成的容器實例
三、ui:即架構中的core services,構成此容器的代碼是harbor項目的主體
四、mysql:由官方mysql鏡像構成的數據庫容器
五、log:運行着rsyslogd的容器,經過log-driver的形式收集其餘容器的日誌

一、首先下載軟件安裝包,並進行解壓,此處示例版本爲1.2.0,下載地址:http://harbor.orientsoft.cn/harbor-1.2.0/harbor-offline-installer-v1.2.0.tgz

tar -xvf harbor-offline-installer-v1.2.0.tgz -C /usr/local/

二、建立https證書以及配置相關目錄權限

mkdir -pv /data/cert

cd /data/cert

生成證書私鑰

openssl genrsa -des3 -out server.key 2048

建立證書請求

openssl req -new -key server.key -out server.csr

因爲在容器內沒法輸入認證密碼,所以密鑰需回退

cp server.key server.key.org

openssl rsa -in server.key.org -out server.key

簽署證書請求並生成證書公鑰

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

配置文件並運行腳本安裝harbor

cd /usr/local/harbor/

vim harbor.cfg

hostname = hub.51dlx.com
ui_url_protocol = https
db_password = admin123
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
harbor_admin_password = admin123

./install.sh

三、上傳鏡像進行測試

vim /etc/docker/daemon.json

{
"insecure-registries":["hub.51dlx.com"]
}

systemctl restart docker

下載測試鏡像

docker pull hello-world

給鏡像從新打標籤

docker tag hello-world hub.51dlx.com/library/hello-world:latest

登陸進行上傳

docker login hub.51dlx.com

docker push hub.51dlx.com/library/hello-world

docker網絡管理:
一、容器之間通信:經過docker0網橋
二、容器訪問外部:經過主機snat
三、外部訪問容器:經過主機dnat

docker映射到主機端口
-p hostip:hostport:containerport
-p hostport:containerport

容器端口映射狀況查看
docker port containerid

--net用於指定容器的網絡通信方式,有以下4種
bridge:默認方式,網橋模式
none:無網卡模式
container:使用其餘容器的網絡棧
host:使用host的網絡

--network用於指定使用特定的網橋

修改默認docker0網橋的網絡參數

vim /etc/docker/daemon.json

{
"bip":"192.168.90.5/24", 指定docker0網橋的ip地址
"fix-cidr":"192.168.90.0/24", 限制ip地址的分配範圍
"mtu":"1500", 最大傳輸單元
"default-gateway":"192.168.90.1", 默認網關
"dns":"114.114.114.114" dns服務器地址
}

docker網絡隔離
網絡類型分類:
一、overlay network 覆蓋性網絡,用於不一樣主機間容器相互通訊
二、bridge network 網橋網絡

docker network list 查看當前可用的網絡類型

docker network create -d bridge 網橋名 容器內網橋建立

docker常見網絡隔離方式:
一、容器之間使用不一樣的網絡名稱空間,實現容器間的網絡隔離

docker network create -d bridge lamp 建立一個lamp的網橋

docker run --name tomcat1 --network=lamp -d tomcat 將容器tomcat1的網絡鏈接到lamp網橋

二、不一樣主機的容器以前實現通訊(此處示例爲經過給容器賦予外網IP進行通信)
(1)、宿主機建立網橋br0

cd /etc/sysconfig/network-scripts

cp ifcfg-ens33 ifcfg-br0

vim ifcfg-ens33

BOOTPROTO=static
    BRIDGE=br0

vim ifcfg-br0

TYPE=Bridge
    BOOTPROTO=static
    DEVICE=br0
    ONBOOT=yes
    IPADDR=192.168.40.128
    NETMASK=255.255.255.0
    GATEWAY=192.168.40.2
    DNS=114.114.114.114

systemctl restart network

(2)、安裝pipework工具

yum install git -y

git clone https://github.com/jpetazzo/pipework.git

cp pipework/pipework /usr/local/bin

chmod +x /usr/local/bin/pipework

(3)、啓動容器並經過pipework設置ip

docker run --name tomcat1 --net=none -d tomcat

pipework br0 tomcat1 192.168.40.180/24

docker數據存儲
1、數據卷特性
dokcer鏡像由多個只讀層疊加而成,啓動容器時,docker會加載只讀鏡像層並在鏡像棧頂部添加一個讀寫層(寫時複製機制)
存在的問題:
一、存在於聯合文件系統中,不易於宿主機訪問
二、容器間數據共享不方便
三、刪除容器會致使數據丟失

解決方案:卷,是容器上的一個或多個「目錄」,此類目錄可繞過聯合文件系統(ufs),與宿主機上的某目錄「綁定」。

2、容器中的數據卷
一、鏡像自帶管理卷
即在製做鏡像的時候,在dockerfile添加「volume 容器內的須要映射的路徑」,這樣鏡像轉變成容器會自動將路徑映射給宿主機的/var/lib/docker/volume/下的隨機字符串目中。在刪除容器裏,如須要同時永久刪除該卷資料,-v便可

二、容器啓動時手動綁定卷,優先級高於自帶管理卷。
docker run --name tomcat1 -d -v HOSTDIR:VOLUMEDIR tomcat 將宿主機的目錄映射給容器的目錄

三、借用自帶管理卷,實現容器間目錄共享。
docker run --name tomcat2 -d --volumes-from tomcat1 tomcat 容器tomcat2將綁定容器tomcat1的自帶管理卷

3、存儲驅動
一、device mapper(DM):性能和穩定性存在問題,不推薦生產環境使用
二、brtfs:社區實現了brtfs driver,穩定性和性能存在問題
三、overlayfs:內核3.18 overlayfs進入主線,性能穩定性優異,第一選擇。

docker info | grep "Storage Driver" 查看存儲驅動類型

修改存儲驅動類型爲overlay:

lsmod | grep overlay

echo "overlay" /etc/modules-load.d/overlay.conf

vim /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --storage-driver=overlay

systemctl daemon-reload

systemctl restart docker

docker info | grep "Storage Driver"

docker的資源限制(經過cgroup技術即control groups):默認狀況下,容器對宿主機的資源佔用沒有任何限制。
1、內存資源限制
OOME:out of memory exception;docker調整了docker daemon的OOME優先級,避免給內核關閉。
所以在生產環境中,必須對容器作如下驗證:
一、爲應用作內存壓力測試,理解正常業務需求下試用的內存狀況,而後才能進入生產環境使用。
二、必定要限制容器的內存使用上限。
三、儘可能保證主機的資源充足,一旦經過監控發現資源不足,就進行擴容或者對容器進行遷移。
四、若是能夠(內存資源充足的狀況),儘可能不要使用swap,swap的使用會致使內存計算複雜,對調度器很是不友好。

docker啓動參數中,關於內存的常見參數:
-m|--memory :設置容器可用物理內存的最大值。最小值爲4m
--memory-swap :設置容器可用的總空間,0和unset表明容器swap爲2倍的容器物理內存。-1表明爲容器swap爲宿主機的全部可用swap。
--memory-reservation:設置容器可用內存的最小值。
--kernel-memory:設置容器的內核可以使用的內存大小,最小值爲4m

2、CPU資源限制
限制方式:
一、有多個cpu密集型的容器競爭cpu時,設置各個容器能使用的cpu時間相對比例
二、以絕對的方式設置容器在每一個調度週期內最多能使用的cpu時間

docker啓動參數中,關於CPU的常見參數:
--cpuset-cpus 容許使用的cpu集
-c|--cpu-shares cpu共享權值(相對權重),默認值1024
--cpuset-mems 容許在上執行的內存節點(MEMs)
--cpu-period 設置調度週期,數值範圍爲1000-1000000,單位:微秒
--cpu-quota 設置在每一個調度週期內容器可以使用的cpu時間,單位:微秒
--cpus="" 設置容器可以使用宿主機cpu個數

3、限制實驗

docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2 限制內存爲256m

docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8 限制可用cpu爲2個

docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8 限制可用cpu爲宿主機的第一個cpu

docker遠程鏈接訪問
修改/etc/docker/daemon.json文件
"hosts":["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]

遠程訪問# docker -H ip:port command

相關文章
相關標籤/搜索