docker基礎管理和一些內容

docker的介紹:

容器:容器技術是一種虛擬化的方案
容器:docker , k8s
docker:docker是能將開發的應用程序自動部署到容器的開源引擎。
Github地址:https://github.com/docker/docker
docker官網:www.docker.com
hub.docker.com  上傳下載docker鏡像的網站
docker的特別之處:
docker在虛擬化的容器執行環境中,增加了一個應用程序部署引擎。
該引擎的目標:
提供一個輕量快速的環境,能夠運行開發者的程序,便於方便高效的從開發者環境部署到測試環境,然後再部署到生產環境。
docker的優點:
1、提供簡單輕量的建模方式,運行秒級
2、職責的邏輯分離。開發人員只需要關係容器中運行的程序,而運維人員只需要關心如何管理程序。docker設計的目的性就是加強開發人員寫代碼的開發環境與應用環境要部署的生產環境的一致性。
3、快速高效的開發生命週期。縮短代碼從開發到測試,再到上線運行的生命週期。讓應用和程序具備可移植性。在容器中開發,以容器的形式去交付。
4、鼓勵使用面向服務的架構。docker推薦單個容器只運行一個程序或者一個進程。這樣就形成了一個分佈式的應用程序模型。
在這種模型下,應用程序或服務都可以表示爲一系列內部互聯的容器,從而使分佈式互聯的程序擴展或調試應用程序都變得非常簡單。
這就是在開發中常用的思想:高內聚低耦合
docker的使用場景:
1、使用docker容器開發、測試、部署服務;
2、創建隔離的運行環境
3、搭建測試環境
4、構建多用戶的平臺即服務(PaaS)基礎設施
5、提供軟件即服務(SaaS)應用程序
6、高性能、超大規模的宿主機部署
三大核心理念:
構建   基於鏡像構建容器
運輸   傳輸到系統中
運行    運行於容器

docker容器的安裝:

安裝docker容器:
注:centos虛擬機必須要聯網,不然無法安裝。
1.配置repo倉庫
cd /etc/yum.repos.d/

vi docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

yum clean all
yum makecache

2.安裝docker
yum -y install docker
cd
檢查有木有安裝方法:
docker version

3.啓動並設置開啓自啓動
systemctl start docker
systemctl enable docker
docker version
到此,docker容器安裝完成,並且啓動成功。

docker鏡像操作:

獲取鏡像的三種方式:
1)下載鏡像(默認從Docker Hub下載)
2)把容器轉換爲鏡像
3)製作鏡像(通過dockerfile生成鏡像)

查找鏡像(默認從Docker Hub查詢)
docker search httpd     //查找所有httpd相關的鏡像

下載鏡像(默認從Docker Hub查詢)
docker pull docker.io/httpd

查看本機鏡像列表
docker images   //查看所有鏡像  (也可以單獨查詢 後面跟倉庫名稱和標籤)
docker inspect  2211e1f06c4e或docker.io/httpd    //指定ID號查看 詳細信息

REPOSITORY:表示鏡像的倉庫源docker.io
TAG:表示鏡像的標籤
IMAGE ID:表示鏡像的ID
CREATED:表示鏡像創建時間
SIZE:表示鏡像大小

添加新名稱  新標籤 ,用於改名稱
docker tag httpd  httpd:centos

刪除鏡像
刪除之前確保沒有被容器使用,若有容器使用需要先刪除容器。  
docker rmi 鏡像名稱 或者鏡像id
鏡像沒有使用才能刪除成功,且只是刪除名稱

docker  rmi  -f   鏡像ID //永久刪除
docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}") 
刪除所有沒有使用的鏡像

存出鏡像和載入鏡像
docker save -o httpd httpd    //將本地鏡像存爲文件httpd,保存在當前所在的目錄中
docker save -o 文件名   鏡像名稱
docker load < cobbler     //將鏡像文件導入到docker鏡像中

小結:

鏡像操作:
搜索 : docker search 關鍵字
下載 : docker pull 關鍵字
查看:docker images
查看鏡像內容信息:docker inspect 鏡像名(ID)
刪除:docker rmi 鏡像名(ID)
導出鏡像:docker sava -o 保存的文件名 鏡像名(ID)
導入鏡像:docker load < 保存的文件
更改鏡像名稱及標籤docker tag 鏡像id 新的鏡像名: 標籤

docker容器操作:

docker容器操作
容器是鏡像的一個運行實例。所不同的是,鏡像是靜態的只讀文件,而容器帶有運行時需要的可寫文件層。如果認爲虛擬機是模擬運行的一整套操作系統(包括內核、應用運行態環境和其他系統環境)和跑在上面的應用,那麼Docker容器就是獨立運行的一個(或一組)應用,以及它們必需的運行環境。

創建容器
對容器進行操作就跟直接操作應用一樣簡單、快速。Docker容器實在太輕量級了,用戶可以隨時創建或刪除容器。

1.新建容器
可以使用docker create命令新建一個容器,例如:
docker create -it ubuntu:latest   //基於鏡像創建容器,默認是沒有運行的
docker ps -a   //查看所有容器

使用docker create命令新建的容器處於停止狀態,可以使用docker start命令來啓動它。
create命令和後續的run命令支持的選項都十分複雜,主要包括如下幾大類:與容器運行模式相關、與容器和環境配置相關、與容器資源限制和安全保護相關。

create命令與容器運行模式相關的選項:
選項  說明
-a,--attach=[]  是否綁定到標準輸入、輸出和錯誤
-d,--detach=true|false  是否在後臺運行容器,默認爲否
--detach-keys=""    從attach模式退出的快捷鍵
--expose=[] 指定容器會暴露出來的端口或端口範圍
--group-add=[]  運行容器的用戶組
-i,--interactive=true|false 保持標準輸入打開,默認爲false
--ipc=""    容器IPC命名空間,可以爲其它容器或主機
--isolation="default"   容器使用的隔離機制
--log-driver="json-file"    指定容器的日誌驅動類型,可以爲json-file,syslog,journald,gelf,fluentd,awslogs,splunk,etwlogs,gcplogs或none
--log-opt=[]    傳遞給日誌驅動的選項
--net="bridge"  指定容器網絡模式,包括bridge,none,其它容器網絡,host的網絡或者某個現有網絡
--net-alias=[]  容器在網絡中的別名
-P,--publish-all=true|false 通過NAT機制將容器標記暴露的端口自動映射到本地主機的臨時端口
-p,--publish=[] 指定如何映射到本地主機端口,例如-p 11234-12234:1234-2234
--pid=host  容器的PID命名空間
--userns="" 啓用userns-remap時配置用戶命名空間的模式
--uts=host  容器的PID命名空間
--restart="no"  容器的重啓策略,包括no、on-failure[:max-retry]、always、unless-stopped等
--rm=true|false 容器退出後是否自動刪除,不能跟-d同時使用
-t,--tty=true|false 容器運行時指定僞終端
--tmpfs=[]  掛載臨時文件系統到容器
-v|--volume  host-dir:container-dir 掛載主機上的文件捲到容器內
--volume-driver=""  掛載文件卷的驅動類型
--volumes-from=[]   從其他容器掛載卷
-w,--workdir="" 容器內的默認工作目錄

create命令與容器環境和配置相關的選項:
選項 說明
--add-host=[ ] 在容器內添加一個主機名到IP地址的映射關係(通過/etc/hosts文件)
--device=[ ] 映射物理機上的設備到容器內
--dns-search=[ ] DNS搜索域
--dns-opt=[ ] 自定義的DNS選項
--dns=[ ] 自定義的DNS服務器
-e,--env=[ ] 指定容器內環境變量
--env-file=[ ] 從文件中讀取環境變量到容器內
-h,--hostname="" 指定容器內的主機名
--ip=“” 指定容器的IPv4地址
--ip6="" 指定容器的IPv6地址
--link=[ <name or id>:alias] 連接到其它容器
--mac-address="" 指定容器的Mac地址
--name="" 指定容器的別名

create命令與容器資源限制和安全保護相關的選項:
選項    說明
--blkio-weight=10~1000  容器讀寫塊設備的I/O性能權重,默認爲0
--blkio-weight-device=[device_name:weight]  指定各個塊設備的I/O性能權重
--cpu-shares=0  允許容器使用CPU資源的相對權重,默認一個容器能用滿一個核的CPU
--cap-add=[ ]   增加容器的linux指定安全能力
--cap-drop=[ ]  移除容器的linux指定安全能力
--cgroup-parent=""  容器cgroups限制的創建路徑
--cidfile=""    指定容器的進程ID號寫到文件
--cpu-period=0  限制容器在CFS調度器下的CPU佔用時間片
--cpuset-cpus=""    限制容器能使用哪些CPU核心
--cpuset-mems=""    NUMA架構下使用哪些核心的內存
--device-read-bps=[ ]   掛載設備的讀吞吐率(以bps爲單位)限制
--device-write-bps=[ ]  掛載設備的寫吞吐率(以bps爲單位)限制
--device-read-iops=[ ]  掛載設備的讀速率(以每秒i/o次數爲單位)限制
--device-write-iops=[ ] 掛載設備的寫速率(以每秒i/o次數爲單位)限制
--kernel-memory=""  限制容器使用內核的內存大小,單位可以是b,k,m或g
-m,--memory=""  限制容器內應用使用的內存,單位可以是b、k、m或g
--memory-reservation="" 當系統中內存過低時,容器會被強制限制內存到給定值,默認情況下等於內存限制值
--memory-swap="LIMIT"   限制容器使用內存和交換區的總大小
--oom-kill-disable=true|false   內存耗盡(out-of-memory)時是否殺死容器
--oom-score-adj=""  調整容器的內存耗盡參數
--pids-limit="" 限制容器的pid個數
--privileged=true|false 是否給容器以高權限,這意味着容器內應用將不受權限下限制,一般不推薦
--read-only=true|false  是否讓容器內的文件系統只讀
--security-opt=[ ]  指定一些安全參數,包括權限、安全能力、apparmor等
--stop-signal=STGTERM   指定停止容器的系統信號
--shm-size=""   /dev/shm的大小
--sig-proxy=true|false  是否代理收到的信號給應用,默認爲true,不能代理SIGCHLD、SIGSTOP和SIGKILL信號
--memory-swappiness="0-100" 調整容器的內存交換區參數
-u,--user=""    指定在容器內執行命令的用戶信息
--ulimit=[ ]    通過ulimit來限制最大文件數、最大進程數等

其他比較重要的選項還包括:
·-l,--label=[]:以鍵值對方式指定容器的標籤信息;
·--label-file=[]:從文件中讀取標籤信息。
啓動容器
使用docker start命令來啓動一個已經創建的容器:
docker start 容器ID       //開啓容器
docker stop 容器ID       //關閉容器

docker容器的狀態:
up   開啓狀態
Exited    終止狀態
Create    創建狀態
(Paused)   暫停狀態
狀態沒有        停止狀態

docker pause/unpause centos/httpd    //暫停docker容器
docker stop  centos/httpd      //停止指定docker容器
新建並啓動容器
除了創建容器後通過start命令來啓動,也可以直接新建並啓動容器。所需要的命令主要爲docker run,等價於先執行docker create命令,再執行docker start命令。

docker run centos/lamp /bin/bash -c ls / 
//創建容器的同時啓動並運行相關程序,命令完成容器就停止。

啓動一個bash終端,允許用戶進行交互:
docker run -it ubuntu:14.04 /bin/bash

root@af8bae53bdd3:/#

其中,-t選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上,-i則讓容器的標準輸入保持打開。

更多的命令選項可以通過man docker-run命令來查看。在交互模式下,用戶可以通過所創建的終端來輸入命令。

守護態運行
更多的時候,需要讓Docker容器在後臺以守護態(Daemonized)形式運行。此時,可以通過添加-d參數來實現。

下面的命令會在後臺運行容器:
docker run -d ubuntu  /bin/sh -c "while true; do echo hello world; sleep 1; done"

進入運行中的容器中,對容器做各種操作:
docker exec -it 容器id  /bin/bash    進入容器中
退出方法:
1、輸入exit
2、Ctrl+p, Ctrl+q鍵返回主機控制檯

連接到容器的會話
docker attach 容器id號

//將容器導出成文件
docker export 13198d132fbe > centoslamp
將指定容器導出成名爲centoslamp的文件,該文件爲docker鏡像文件

//將容器文件生成鏡像
docker import  文件名  鏡像名:標籤

//刪除容器
docker rm d4e863a654aa  指定刪除某個容器
docker rm -f d4e863a654aa  
強制刪除運行中的容器,不建議
docker container prune   刪除所有停止的容器
docker rm $(docker ps -qf status=exited)    刪除指定狀態的容器
擴展:
硬件資源相關
1、 顯示容器硬件資源使用情況
docker stats [選項] [0個或多個正在運行容器]
docker stats          不指定容器時顯示所有正在運行的容器

2、更新容器的硬件資源限制
docker update [選項]
有可能報錯:
vi   /etc/default/grub
GRUB_CMDLINE_LINUX="...   cgroup_enable=memory swapaccount=1"

3、使用壓力測試工具 stress 驗證效果
使用已有的stress鏡像 progrium/stress, 開兩個終端, 在一個終端中執行下面命令
docker run -m 100m --rm -it progrium/stress --cpu 2 --io 1 --vm 10 --vm-bytes 9M

在另一個終端執行 docker stats 進行監控
再開一個終端執行

9eb0爲容器id開頭, 請根據實際情況替換。內存限制只能調大不能調小
docker update -m 200m 9eb0

小結:

容器操作:
創建:docker create -it 鏡像名(ID) /bin/bash
啓動容器: docker start 容器名(ID)
停止容器:docker stop 容器名(ID)
暫停:docker pause 容器名(ID)
取消暫停:docker unpause 容器名(ID)
刪除:docker rm -f 容器名(ID)
刪除所有停止的容器:docker container prune
查看容器詳細信息:docker inspect 容器id
查看容器列表:docker ps -a
創建並運行:docker run -itd 鏡像id /bin/bash
將容器存入文件:docker export 容器id > 文件名
將容器文件導入鏡像:docker import 文件名 鏡像名: 標籤

docker網絡:

docker 網絡覆蓋範圍可分爲:單個host上的容器網絡和跨多個host的網絡
docker 安裝時會自動在host上創建三個網絡,可以使用docker network ls查看到  none 、host、bridge
此外還有另外兩種方式
1、none網絡
在這個網絡下只有容器的lo網卡,在創建容器時可以使用--network=none指定使用none網絡

正常不指定網絡的情況下:
eth0    inet  addr:172.17.0.7

指定網絡爲none的情況下:
docker  run  -it  --network=none  --name  network1    busybox
只有一個lo網卡
一般來講,這個封閉的網絡有什麼用處呢?
可用於一些安全性較高的並且不需要聯網的應用可以使用none網絡,比如:某個容器唯一用途就是生成隨機密碼,就可以放到none網絡中避免密碼被竊取;但是大部分容器是需要網絡的
2、host網絡:
連接到host網絡的容器共享docker host的網絡棧,容器的網絡配置與host完全一致,可以通過--network=host指定host網絡
docker  run  -it  --network=host  --name  network2    busybox

在容器中可以看到真機的所有網卡,並且連hostname也是真機的
host網絡的使用場景是什麼呢?
host網絡的最大好處就是:性能;
如果容器對網絡傳輸效率要求較高,則可以選擇host網絡。
但是host網絡也有缺點:靈活性不高,比如:要考慮多口靈活性的問題,docker host上已經使用的端口容器就不能使用了
doker host另一個用途就是:讓容器可以直接配置host網絡,比如:一些跨host的網絡解決方案,本身也是以容器運行的,這些方案需要對網絡進行配置,比如,iptables。
3、bridge網絡:
容器默認使用的時bridge網絡
docker安裝時會創建一個 命令爲docker0的linux bridge。如果不指定--network=,運行的容器會默認掛到docker0上
可以用“brctl   show”命令查看橋接的網卡

容器中“eth0”——》真機的 veth9cfd9f7
——橋接——》docker0  

注:interface一列就是容器的虛擬網卡,如果容器都處於關閉的狀態,會沒有網卡信息
需要docker在開啓狀態下才能看到接口網卡

如:看到interfaces一列是veth48a8eca
進入容器中可以看一下網卡的信息eth0

其實:eth0和veth48a8eca是一對veth pair。veth pair是一種成對出現的特殊網絡設備,可以把他想像成由一根虛擬網線連起來的一對網卡,網卡的一頭叫做:eth0@if315,另一頭是veth48a8eca掛在了docker0上,其效果就是將eth0@if315掛在了docker0上

看到eth0@if315配置了172.17.0.2/16的ip,再運行一個容器,看看他的ip是否也是同樣的

新運行的容器的IP由172.17.0.3順延下去了,而不是一個獨立的網段,而且都是172.17.0的網段的

爲什麼都是這個網段上面的呢?

可以通過docker network inspect bridge

看到網卡的配置信息:subnet是172.17.0.0/16,gateway是172.17.0.1,這個網管來自哪呢?

可以看到host主機上面的docker0的ip就是172.17.0.1,所以這個網管就是docker0
4、自定義網絡:
通常默認的情況下使用的是docker的bridge的網絡,用戶也可以根據自己的業務需要,創建user-defined

docker 提供三種user-defined網絡驅動:bridge,overlay,macvlan。

其中overlay和macvlan用於創建跨主機的網絡

可以通過bridge驅動創建類似前面默認的bridge網絡docker0

docker network create --driver bridge brnet1

通過brctl show看到我們新建的網絡

新增加了一個網橋br-32a5cb322311 ,這裏的32a5cb322311正好是新建的brnet1的容器ID

通過docker network inspect brnet1查看

可以看到新建的brnet1的subnet是172.18.0.0/16,網關是172.18.0.1,這裏的172.18.0.0/16網段是docker自動分配的網段

也可以自己指定網段和網關:--subent和--gateway

docker   network  create  --driver  bridge  --subnet   192.168.2.0/24   --gateway  192.168.2.1  brnet2

容器要使用新的網絡,需要在新建運行(docker run)的時候,通過--network=去指定

指定一個靜態ip地址
可以通過--ip指定

docker  run -it  --network=brnet2  --ip   192.168.2.222   busybox

注:只有通過--subnet創建的網絡才能指定靜態IP。

最好不要將容器設置成與host相同網段的,否則host的主機將被幹擾,當然如果收到了干擾也不用怕,可以使用docker network rm <自己設置的bridge的名稱>  將這個bridge刪除

小結:

使用指定網絡創建容器:
docker run -it --network bridge 鏡像id /bin/bash
docker網絡查看:
docker network ls
創建docker網絡:
docker network create --driver=bridge 自定義的網絡名稱
創建docker網絡並且自定義可分配的網段和網關:
docker network create --driver=bridge --subnet 192.168.80.0/24 --gateway 192.168.80.1 自定義的網絡名稱
使用指定網絡創建容器並且分配一個靜態IP地址:
docker run -it --network 網絡名稱(自定義) --ip 192.168.80.100 鏡像名 /bin/bash
注意:靜態IP地址只要自定義網段並且使用“--subnet”指定網段才能分配
查看docker網絡的詳細信息:
docker network inspect 網絡名稱
刪除docker網絡:
docker network rm 網絡名稱

端口映射:

1、容器訪問外部網絡
容器默認指定了網關爲docker0網橋上的docker0內部接口。docker0內部接口同時也是宿主機的一個本地接口。因此,容器默認情況下是可以訪問到宿主機本地的。更進一步,容器要想通過宿主機訪問到外部網絡,需要宿主機進行轉發。 

# sysctl  net.ipv4.ip_forward    查看轉發是否打開,1代表打開
net.ipv4.ip_forward = 1

如果爲0,則沒有開啓轉發,則需要手動打開:

# sysctl -w net.ipv4.ip_forward=1 

更簡單的,在啓動Docker服務的時候設定--ip-forward=true,Docker服務會自動打開宿主機系統的轉發服務。
2、端口映射
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P(大寫) 或 -p (小寫) 參數來指定端口映射。

1、當使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口
2、-p(小寫)則可以指定要映射的IP和端口,但是在一個指定端口上只可以綁定一個容器。
支持的格式有 :真機Port:容器Port 

        hostPort:containerPort(映射所有接口地址)
        將本地的 5000 端口映射到容器的 5000 端口:
        docker run -d -p 5000:5000 training/webapp   /bin/bash
        此時默認會綁定本地所有接口上的所有地址。

        ip:hostPort:containerPort (映射指定地址的指定端口)
        指定映射使用一個特定地址,比如 localhost 地址 127.0.0.1
        docker run -d -p 127.0.0.1:5000:5000 training/webapp /bin/bash

        ip::containerPort (映射指定地址的任意端口)
        綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
        docker run -d -p 127.0.0.1::5000 training/webapp  /bin/bash
        還可以使用 udp 標記來指定 udp 端口
        docker run -d -p 127.0.0.1:5000:5000/udp training/webapp  /bin/bash

    查看映射端口配置
    使用 docker port 來查看當前映射的端口配置,也可以查看到綁定的地址
    docker  ps  -a
端口——>端口
注:
容器有自己的內部網絡和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個可變的網絡配置。)
    -p 標記可以多次使用來綁定多個端口
    例如:
    docker run -d -p 5000:5000 -p 3000:80 training/webapp  /bin/bash

容器互聯:

1、必須兩個容器處於同一網段,同時制定統一網絡
2、DNS:只用自定義的網絡並且自定義的網段才能使用dns

如何讓兩個不同的網段之間能夠ping通

1.增加路由:
如果host上對每個網絡都有一個路由,同時操作系統上打開了ip forwarding,host就成了一個路由,掛在不同的網橋上的網絡就能夠互相ping通
可以看一下host上是否滿足這個條件
ip r查看host上的路由表
打開路由轉發功能
centos7版本:
vi   /etc/sysctl.conf
net.ipv4.ip_forward = 1

centos  6版本:
echo  1  >  /proc/sys/net/ipv4/ip_forward
sysctl  -p

cat   /proc/sys/net/ipv4/ip_forward      看是不是1

但是iptables DROP 掉了網橋 docker0 與 br-5d863e9f78b6 之間雙向的流量。 
從規則的命名 DOCKER-ISOLATION 可知 docker 在設計上就是要隔離不同的 netwrok。 
2、通過docker另外的增加網卡的辦法來解決:
使用docker network connect給容器增加一塊新的網卡   
docker  network   connect  brnet2   --ip  192.168.2.22   容器ID
通過docker network connect 這個命令給容器添加網卡eth1,並讓這個網卡使用另外的bridge,現在不同bridge之間的容器建可以進行通信
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章