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
# 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服務器配置:
{
"insecure-registries": ["192.168.40.128:5000"]
}
上傳鏡像到自建倉庫,其格式爲:倉庫地址/用戶名/鏡像名:版本號
查看自建倉庫的鏡像
客戶端使用自建倉庫的設置:
{
"insecure-registries": ["192.168.40.128:5000"]
}
二、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
二、建立https證書以及配置相關目錄權限
生成證書私鑰
建立證書請求
因爲在容器內沒法輸入認證密碼,所以密鑰需回退
簽署證書請求並生成證書公鑰
配置文件並運行腳本安裝harbor
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
三、上傳鏡像進行測試
{
"insecure-registries":["hub.51dlx.com"]
}
下載測試鏡像
給鏡像從新打標籤
登陸進行上傳
docker網絡管理:
一、容器之間通信:經過docker0網橋
二、容器訪問外部:經過主機snat
三、外部訪問容器:經過主機dnat
docker映射到主機端口
-p hostip:hostport:containerport
-p hostport:containerport
容器端口映射狀況查看
docker port containerid
--net用於指定容器的網絡通信方式,有以下4種
bridge:默認方式,網橋模式
none:無網卡模式
container:使用其餘容器的網絡棧
host:使用host的網絡
--network用於指定使用特定的網橋
修改默認docker0網橋的網絡參數
{
"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常見網絡隔離方式:
一、容器之間使用不一樣的網絡名稱空間,實現容器間的網絡隔離
二、不一樣主機的容器以前實現通訊(此處示例爲經過給容器賦予外網IP進行通信)
(1)、宿主機建立網橋br0
BOOTPROTO=static BRIDGE=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
(2)、安裝pipework工具
(3)、啓動容器並經過pipework設置ip
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進入主線,性能穩定性優異,第一選擇。
修改存儲驅動類型爲overlay:
ExecStart=/usr/bin/dockerd --storage-driver=overlay
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遠程鏈接訪問
修改/etc/docker/daemon.json文件
"hosts":["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
遠程訪問# docker -H ip:port command