1. 程式人生 > >docker安裝以及一些操作

docker安裝以及一些操作

num release 是否 資源隔離 driver cgroup stopped pos dns

介紹
什麽是容器
容器技術是一種虛擬化的方案

傳統虛擬機是通過中間層,將一臺或多臺獨立的機器虛擬運行在硬件之上

而容器時直接運行在系統內核之上的用戶空間

因此,容器虛擬化也被稱為操作系統虛擬化

由於運行在操作系統上,所以容器只能運行相同或相似內核的操作系統

容器:docker , k8s

什麽是docker

docker是能將開發的應用程序自動部署到容器的開源引擎。

Github地址:https://github.com/docker/docker

docker是docker.lnc公司開源的一個基於LXC技術之上構建的Container容器引擎,源代碼托管在GitHub上,基於Go語言並遵從Apache2.0協議開源

docker是通過內核虛擬化技術(namespaces(命令空間)及cgroups(控制組)等)來提供容器的資源隔離與安全保障等,由於docker通過操作系統層的虛擬化實現隔離,所以docker容器在運行時,不需要虛擬機(VM)額外的操作系統開銷,提高資源利用率。

註:此內核是linux內核

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裏面運行的是應用(APP),這個應用可以是 tomcat、nginx、apache等服務。

docker組成:
1、docker客戶端/守護進程
cs架構(客戶端架構)
docker client
docker server

bs架構:web架構
web網站網頁
服務器

一般使用客戶端與服務端交互

2、docker組件:
鏡像(image)
docker容器的基石。容器基於鏡像啟動和運行,鏡像就好比容器的源代碼,保存了用於啟動容器的各種條件。
層疊的只讀文件系統。
聯合加載

B
最底端是引導文件系統,即bootfs。實際上,當一個容器啟動後,引導文件系統就卸載
第二層是root文件系統,位於bootfs之上。它可以是一種或者多種文件系統

容器(Container)

倉庫(Repository)
公有倉庫 docker hub
私有倉庫


centos版本中安裝docker:

docker容器的安裝

建議在linux環境下安裝Docker,window環境搭建比較復雜且容易出錯,使用Centos7+yum來安裝Docker環境很方便。

安裝Docker,這是一種操作系統級的虛擬化工具,可以在容器中自動部署應用程序。

Docker 軟件包已經包括在默認的 CentOS-Extras 軟件源裏。因此想要安裝 docker,只需要運行下面的 yum 命令:

註: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

2.安裝docker

yum -y install docker

檢查有木有安裝方法:
docker version

3.啟動並設置開啟自啟動

systemctl enable docker
systemctl start docker

到此,docker容器安裝完成,並且啟動成功。

鏡像操作:

查找鏡像(默認從Docker Hub查詢)
docker search httpd     //查找所有httpd相關的鏡像
docker pull httpd      //下載鏡像
查看本機鏡像列表
docker images   //查看所有鏡像  (也可以單獨查詢 後面跟倉庫名稱和標簽)
docker inspect 2211e1f06c4e    //指定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容器操作


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 -itd 鏡像名(ID)
啟動容器: docker start 容器名(ID)
停止容器:docker stop 容器名(ID)
暫停:docker pause 容器名(ID)
取消暫停:docker unpause 容器名(ID)
刪除:docker rm -f 容器名(ID)

none網絡

在這個網絡下只有容器的lo網卡,在創建容器時可以使用--network=none指定使用none網絡

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

指定網絡為none的情況下:
docker  run  -it  --network=none  --name  network1    busybox

只有一個lo網卡

一般來講,這個封閉的網絡有什麽用處呢?

可用於一些安全性較高的並且不需要聯網的應用可以使用none網絡,比如:某個容器唯一用途就是生成隨機密碼,就可以放到none網絡中避免密碼被竊取;但是大部分容器是需要網絡的

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。

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

自定義網絡

通常默認的情況下使用的是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刪除

小結:

註:如果報這樣的錯用以下命令{Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-01f51f70d9a8 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))}
pkill docker

iptables -t nat -F
ifconfig docker0 down
systemctl start docker

使用指定網絡創建容器:
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 網絡名稱

docker安裝以及一些操作