一、Docker 簡介
lxc linux container,openvz
容器中各虛擬機只有一個內核,而是多個用戶空間
在庫中完成虛擬化,比如wine 或者在windows中運行bash
在應用程序的運行級別提供虛擬化,比如jvm
pstree , pid 為1 的進程 這個進程是直接和內核來打交道的
容器之間,和虛擬機之間隔離的技術
容器之間的隔離相對比較困難
NameSpace,(名稱空間)
內核級別,環境隔離
PID NameSpace: 用于隔離pid號的 Linux 2.6.24 PID隔離;
Network NameSpace : Linux 2.6.29 網絡名稱空間的隔離 網絡設備、網絡棧、端口等網絡設備隔離;
User NameSpace: Linux 用戶空間的隔離 Linux 3.8 甚至 3.10之后 用戶和用戶組資源隔離;
IPC NameSpace: 進程間通信技術 Linux 2.6.19 signal 信號量、消息隊列和共享內存的隔離;
UTS NameSpace: Linux 2.6.19 , 主機名和域名的隔離;
Mount NameSpace: Linux 2.4.19 掛載點(文件系統 )隔離;
API:clone()實現線程系統調用,用來創建新線程;
setns()設定一個新的屬性,將某(進程|或設備)加入到新的NameSpace中去的;
unshare()非共享機制,脫離NameSpace,而關聯至新NameSpace;
將NameSpace隔離開來沒有問題,而問題在于,惡意用戶強行調用資源,一個用戶完全可以將系統資源耗盡,cpu占用至100%;
因此帶來了另一種機制的出現;
CGroup: Linux Control Group,控制組 Linux 2.6.24被收入進內核
內核級別,限制、控制與一個進程組群的資源;
資源:CPU,內存,IO 級別來進行定義
google工程師:2006開始此技術,命令為進程容器而后命令為CGroup
功能:
Resource limitation:資源限制;
Prioritization:優先級控制;
Accounting:審計和統計,主要為計費;
Contorl:掛起進程,恢復進程;
CGroup 基于單根倒樹狀結構來實現
在CentOS7 中可以用mount 命令來查看其資源組的隔離技術已經被使用
/sys/fs/cgroup
mount
lssubsys -m
CGroup的子系統:
blkio:設定塊設備的IO限制,而設定的子系統;
cpu:設定CPU的限制;
cpuacct:報告cgroup中所使用的CPU資源;
cpuset:為cgroup中的任務分配 CPU和內存資源 ;
memory:設定內存的使用限制;
devices:控制cgroup中的任務對設備的訪問能務;
freezer: 掛起和恢復cgroup中的任務;
net_cls:(classid) ,使用等級級別標識符來標記網絡數據包;
tc: 流量整形命令 ;
perf_event:對用戶空間中任務,對用戶空間產生的進程進行分類;
使用后使cgrup中的任務可以進行統一的性能測試;
hugetlb:轉換后元緩沖區,對HugeTLB子系統進行限制;
CGroup中的術語:
task(任務):進程或線程;
cgroup:一個獨立的資源控制單位,可以包含一個或多個子系統;
subsystem:子系統,
hierarchy:層級
AUFS:UnionFS:
UnionFS:把不同的物理位置的目錄合并到同一個目錄中。
Another UFS,Alternative UFS,Adanced UFS 幾乎完全重寫了unix FS
命令 #tc # lssubsys -m
Device mapper:
linux 2.6內核引入的最重要的技術之一,用于在內核中支持邏輯卷管理的通用設備映射技術;
Mapped Device
Mapping Table
Target Device
在內核空間只能開啟一個端,但是可以映射至其它的用戶空間
Device mapper:
Linux2.6 內核引入的最重要的技術之一,用于在內核 中支持邏輯卷管理的通用設備映射機制;
Mapped Device
Mapping Table
Target Device
Docker
2013,GO,Apache 2.0,dotCloud
C/S:
Docker Client:發起docker相關的請求
Docker Server:窗口運行的節點;
Containers 容器
images docker映像文件 –> 存于倉庫之中
啟動docker容器需要加載鏡像文件 –> docker倉庫上的鏡像加載進來
docker允許我們創建私有倉庫
比較難的,如何創建映像文件
dockerfile:
namespace cgroup
解決方案
lxc,openvz
lxc,linux container
libcontainer
Host OS –> hypervisor –> Guest OS
Host OS –> hpervisor –> user space(n個)
核心組件:
docker client:docker的客戶端工具,是用戶使用docker的主要接口,docker client 與docker daemon通信并將結果返回給用戶
docker deamon:運行于宿主機上,Docker守護進程 ,用戶可通過docker client其交互
image:鏡像文件是只讀的;用來創建container,一個鏡像可以運行多個container;鏡像文件可以通過Dockerfile文件來創建,可以從docker hub/registry下載;
repository
公共倉庫:Docker hub/registry
私有倉庫:docker registry
倉庫可以存有:nginx image httpd image tomcat image
docker container: docker的運行實例,容器是一個隔離環境;
另外兩個重要組件:
docker link: 各docker容器這間能夠通信
docker volume:
二、Docker YUM源的安裝配置
安裝使用docker 通過使用epel源來實現, CentOS7 自帶的就有了
dockerfile 自定義的docker 源 [root@node1 ~]# vim /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg [jin] name=renjin2 baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/ gpgcheck=0 enabled=1 [extra] name=renjin3 baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/ gpgcheck=0 enabled=1 [epel] name=renji4 baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/ gpgcheck=0 enabled=1
或者可以使用自帶的源 https://mirrors.aliyun.com/centos/7.2.1511/extras/x86_64
查看docker版本的詳細信息
[root@node1 ~]# yum info docker-engine Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Installed Packages Name : docker-engine Arch : x86_64 Version : 17.04.0.ce Release : 1.el7.centos Size : 63 M Repo : installed From repo : dockerrepo Summary : The open-source application container engine URL : https://dockerproject.org License : ASL 2.0 Description : Docker is an open source project to build, ship and run any application as a : lightweight container. : : Docker containers are both hardware-agnostic and platform-agnostic. This means : they can run anywhere, from your laptop to the largest EC2 compute instance and : everything in between - and they don't require you to use a particular : language, framework or packaging system. That makes them great building blocks : for deploying and scaling web apps, databases, and backend services without : depending on a particular stack or provider. [root@node1 ~]# yum -y install docker-engine [root@node1 ~]# systemctl start docker.service
三、Dcoker 的簡單測試及使用
[root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [root@node1 ~]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 3239 [OK] jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8... 63 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.8 x86_64 - Apache / PHP-FPM / P... 25 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 24 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 24 [OK] gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 18 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 15 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] egyptianbman/docker-centos-nginx-php A simple and highly configurable docker co... 6 [OK] nathonfowlie/centos-jre Latest CentOS image with the JRE pre-insta... 5 [OK] centos/mariadb55-centos7 4 [OK] centos/redis Redis built for CentOS 2 [OK] harisekhon/centos-java Java on CentOS (OpenJDK, tags jre/jdk7-8) 2 [OK] harisekhon/centos-scala Scala + CentOS (OpenJDK tags 2.10-jre7 - 2... 2 [OK] blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] darksheer/centos Base Centos Image -- Updated hourly 1 [OK] freenas/centos Simple CentOS Linux interactive container 1 [OK] timhughes/centos Centos with systemd installed and running 1 [OK] januswel/centos yum update-ed CentOS image 0 [OK] kz8s/centos Official CentOS plus epel-release 0 [OK] grayzone/centos auto build for centos. 0 [OK] repositoryjp/centos Docker Image for CentOS. 0 [OK] otagoweb/centos Apache (with PHP7), built on CentOS 7 0 [OK] vcatechnology/centos A CentOS Image which is updated daily 0 [OK] grossws/centos CentOS 6 and 7 base images with gosu and l... 0 [OK] 之所以能搜索出來,是因為別人給我們做了公開的使用 [root@node1 ~]# docker search busybox NAME DESCRIPTION STARS OFFICIAL AUTOMATED busybox Busybox base image. 973 [OK] progrium/busybox 65 [OK] radial/busyboxplus Full-chain, Internet enabled, busybox made... 12 [OK] container4armhf/armhf-busybox Automated build of Busybox for armhf devic... 6 [OK] odise/busybox-python 4 [OK] multiarch/busybox multiarch ports of ubuntu-debootstrap 2 [OK] azukiapp/busybox This image is meant to be used as the base... 2 [OK] ofayau/busybox-jvm Prepare busybox to install a 32 bits JVM. 2 [OK] zanner/busybox https://github.com/sergej-kucharev/zanner-... 1 [OK] ofayau/busybox-libc32 Busybox with 32 bits (and 64 bits) libs 1 [OK] elektritter/busybox-teamspeak Leightweight teamspeak3 container based on... 1 [OK] getblank/busybox Docker container busybox for Blank 1 [OK] prom/busybox Prometheus Busybox Docker base images 1 [OK] skomma/busybox-data Docker image suitable for data volume cont... 1 [OK] odise/busybox-curl 1 [OK] jahroots/busybox Busybox containers 0 [OK] ggtools/busybox-ubuntu Busybox ubuntu version with extra goodies 0 [OK] cucy/busybox aouto build busybox 0 [OK] freenas/busybox Simple Busybox interactive Linux container 0 [OK] sdurrheimer/prom-busybox Moved to https://hub.docker.com/r/prom/bus... 0 [OK] jiangshouzhuang/busybox busybox 0 [OK] padcom/busybox-java Oracle Java on BusyBox 0 [OK] futurenda/busybox Mini busybox 0 [OK] hongtao12310/busybox for busybox image based on the gcr.io/goog... 0 [OK] ddn0/busybox fork of official busybox 0 [OK] [root@node1 ~]# docker pull buxybox [root@node1 ~]# docker pull busybox Using default tag: latest latest: Pulling from library/busybox 7520415ce762: Pull complete Digest: sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f 校驗碼 Status: Downloaded newer image for busybox:latest
[root@node1 ~]# docker pull hub.magedu.com:5000/busybox ##指定到哪臺服務器上獲取busybox [root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 00f017a8c2a6 3 weeks ago 1.11MB [root@node1 ~]# docker run -it busybox:latest /bin/sh ##啟動一臺虛擬機的實例 / # ls bin dev etc home proc root sys tmp usr var [root@node1 ~]# docker ps ##查看正在運行的主機 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7090d8fd9861 busybox:latest "/bin/sh" 2 minutes ago Up 2 minutes boring_archimedes
四、 docker的常用命令總結
環境信息相關: info version [root@node1 ~]# docker info ##查看docker的環境信息 [root@node1 ~]# docker version ##查看docker的版本號
系統維護相關:
images
inspect
build 創建映像文件
commint 基于運行中的容器創建映像文件
pause/unpause
ps
rm
rmi
run
start/stop/restart
top
kill
…
日志信息相關:
events
history
logs
Docer hub服務相關
login
logout
pull
push
search
基本操作:
獲取映像:pull 啟動容器:run [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7090d8fd9861 busybox:latest "/bin/sh" 17 minutes ago Up 17 minutes boring_archimedes [root@node1 ~]# docker kill 7090d8fd9861 7090d8fd9861 [root@node1 ~]# docker ps #結束一個docker進程 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@node1 ~]# docker ps -a #但不會刪除容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7090d8fd9861 busybox:latest "/bin/sh" 20 minutes ago Exited (137) 3 minutes ago boring_archimedes [root@node1 ~]# docker rm 7090d8fd9861 #此時會刪除container 7090d8fd9861 [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2bca1aa3d38d busybox:latest "/bin/sh" 4 minutes ago Up 4 minutes naughty_goldberg [root@node1 ~]# docker docker docker-containerd-ctr dockerd docker-proxy docker-containerd docker-containerd-shim docker-init docker-runc [root@node1 ~]# docker commit 2bca1aa3d38d centos:newuser sha256:08d1d05a6e490c31b0e4e3ffb9532a25bb3d9e8f588b30990338f1ae64b34286 [root@node1 ~]# docker docker docker-containerd-ctr dockerd docker-proxy docker-containerd docker-containerd-shim docker-init docker-runc [root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos newuser 08d1d05a6e49 9 seconds ago 1.11MB busybox latest 00f017a8c2a6 3 weeks ago 1.11MB [root@node1 ~]# docker run -it --rm centos:newuser /bin/sh / # [root@node1 ~]# docker kill fee1da85d418 fee1da85d418 [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
linux Kernel --> libcontainer --> (execdriver、networkdriver)--> Docker Daemon (GraphDB) --> API server --> 用戶
在docker 之外有個重要存儲還需要GraphDB GraphDB也稱為圖式數據庫
Docker應用:
鏡像:包含了啟動Docker容器所需要的文件系統層給及其內容;
基于UninFS采用分層結構實現;
bootfs,rootfs
registry:用于保存鏡像的元數據,保存docker鏡像層次結構和元數據;
reposistory:由具有某個功能的鏡像的所有相關版本構建成的集合;
index:管理用戶的賬號、訪問權限、鏡像及鏡像標簽等等相關的;
graph:從registry中下載的Docker鏡像需要保存在本地,此功能即由graph完成;
/var/lib/docker/graph;
與鏡像相關的命令:
docker images 列出本地的鏡像
docker search 搜索
docker pull 下載鏡像
docker push 上傳鏡像
docker login 登錄
docker logout 登出
創建鏡像:commint,build
刪除本地鏡像: rmi
容器:也可以想象成一個虛擬機
獨立運行的一個或一組應用,以及它們運行的環境
命令:
run,kill,stop,start,restart ,log,export,import
啟動方法:
通過鏡像創建一個新的容器: run
啟動一個處于停止狀態的容器: start
容器本來就是應用的,當應用結束時,程序也會結束的;
[root@node1 ~]# docker run busybox:latest /bin/echo "hello world" hello world [root@node1 ~]# docker run -it --name=busybox busybox:latest /bin/sh [root@node1 ~]# docker stop busybox ##正常停止一個容器,相當于正常關機
busybox
run命令:
–name= Assign a name to the container
-i,–interactive=false Keep STDIN open even if not attached
it,-tty=false Alocate a pseudo-TTY
–net=default Set the Network for the container
步驟:
檢查本地是否存在指定的鏡像,不存在則從registry下載;
利用鏡像啟動容器
分配一個文件系統,并且在只讀的鏡像層之外,掛載一個可讀寫層;
從宿主機配置的網橋口中,橋接一個虛擬接口給此容器;
從地址池中分配一個地址容器;
執行用戶指定的應用程序;
程序執行完成后,容器即終止;
logs命令:獲取一個容器的日志,獲取其輸出信息;
對于交互式模式啟動的容器,終止可以使用exit 命令或ctrl+d組合鍵;
attach 附加至一個運行中的容器;
[root@node1 ~]# docker start 31a67d66b2c2 [root@node1 ~]# docker attach busybox [root@node1 ~]# docker run busybox:latest /bin/echo "hello world" [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d35a2673722e busybox:latest "/bin/echo 'hello ..." 13 seconds ago Exited (0) 12 seconds [root@node1 ~]# docker start d35a2673722e d35a2673722e [root@node1 ~]# docker logs cabd0e52f8f8 ##可以查看執行命令后的輸出信息 hello world hello world hello world / # exit 終止當前容器 或者ctrl +d attach [root@node1 ~]# docker start -i busybox ##啟動一個交互式一個接口 [root@node1 ~]# docker start busybox [root@node1 ~]# docker attach busybox ##附加至一個運行中的容器; / #
Docker Hub:
registry有兩種;
docker hub:
private registry
# docker login
# docker push busybox:latest
[root@node2 yum.repos.d]# yum -y install docker-registry 上條命令實質上安裝的是另外的一個包 [root@node2 yum.repos.d]# yum -y installdocker-distribution-2.6.0-1.el7.x86_64 [root@node1 yum.repos.d]# systemctl start docker-distribution.service [root@node1 yum.repos.d]# ss -tnl | grep 5000 LISTEN 0 128 :::5000 :::* [root@node1 yum.repos.d]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos newuser 08d1d05a6e49 2 weeks ago 1.11MB centos latest 98d35105a391 5 weeks ago 192MB busybox latest 00f017a8c2a6 6 weeks ago 1.11MB [root@node1 yum.repos.d]# [root@node1 yum.repos.d]# docker tag 08d1d05a6e49 192.168.99.15:5000/centos:1.2.1 給一個鏡像打標簽 [root@node1 yum.repos.d]# docker push 192.168.99.15:5000/centos:1.2.1
原創文章,作者:kang,如若轉載,請注明出處:http://www.www58058.com/79168