25.1 docker簡介linux
25.2 安裝dockergit
25.3 鏡像管理github
25.4 經過容器建立鏡像docker
25.1 docker簡介apache
docker比如一個集裝箱,咱們能夠把全部的想要運行的環境、軟件包等等打包好,放到docker裏。那你就能夠把這個docker拿走,隨便裝到哪裏去,能夠裝到任何一臺服務器上去json
打包的東西包含了他依賴的環境,庫等等。主要就是移植方便,交付很快ubuntu
官網 www.docker.comwindows
github https://github.com/docker/docker.github.iocentos
開源的容器引擎,可讓開發者打包應用以及依賴的庫,而後發佈到任何流行的linux發行版上,移植很方便bash
由go語言編寫,基於apache2.0協議發佈
基於linux kernel,要想在win下運行須要藉助一個vm(虛擬機)來實現
自2013年開始,近些年發展迅猛
docker從1.13x開始,版本分爲社區版ce和企業版ee,而且基於年月的時間線形式,當前最新穩定版爲17.09 參考http://blog.csdn.net/chenhaifeng2016/article/details/68062414
Docker和傳統的虛擬化比較
相比傳統的虛擬化,docker少一層(Hypervisor),不須要操做系統(佔用CPU),輕量化。拉下來就能用
Docker的優點
1.啓動很是快,秒級實現
2.資源利用率高,一臺高配置服務器能夠跑上千個docker容器
#由於是輕量的虛擬化
3.更快的交付和部署,一次建立和配置後,能夠在任意地方運行
4.內核級別的虛擬化,不須要額外的hypevisor支持,會有更高的性能和效率
#不須要去虛擬化CPU、內存等等,不須要這些服務
5.易遷移,平臺依賴性不強
#能夠在linux下搞一個docker的鏡像,而後能夠在windows下運行
Docker核心概念
1.鏡像,是一個只讀的模板,相似於安裝系統用到的那個iso文件,咱們經過鏡像來完成各類應用的部署。
2.容器,鏡像相似於操做系統,而容器相似於虛擬機自己。它能夠被啓動、開始、中止、刪除等操做,每一個容器都是相互隔離的。
3.倉庫,存放鏡像的一個場所,倉庫分爲公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.2 安裝docker
1.curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
#首先下載repo的yum源
2.yum install -y docker-ce
速度比較慢,你們也能夠直接下載rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下載完,上傳到linux下
也須要用yum安裝,能夠自動解決依賴關係
yum install -y docker-ce-xxxx.rpm
3.systemctl start docker 啓動docker
實例:
1.[root@axinlinux-01 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2424 100 2424 0 0 1082 0 0:00:02 0:00:02 --:--:-- 1082
[root@axinlinux-01 ~]# cat !$ #也能夠看一下官方給咱們提供的這個yum源
cat /etc/yum.repos.d/docker.repo
[root@axinlinux-01 ~]# yum list |grep docker #能夠看一下系統自帶的docker
docker.x86_64 2:1.13.1-75.git8633870.el7.centos #1.13的,這個版本很老了
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable #這個是他的最新版,也是我麼要安裝的
2.[root@axinlinux-01 ~]# yum install -y docker-ce #然而報錯了
錯誤:docker-ce conflicts with 2:docker-1.13.1-88.git07f3374.el7.centos.x86_64
錯誤:docker-ce-cli conflicts with 2:docker-1.13.1-88.git07f3374.el7.centos.x86_64
[root@axinlinux-01 ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine #執行這一步,卸載以前的docker相關
[root@axinlinux-01 ~]# yum -y install docker-ce #再次執行
若是下載很慢,https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/25docker下載rpm包(docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm)。而後yum install 指定這個rpm包,就能夠了
3.[root@axinlinux-01 ~]# systemctl start docker
[root@axinlinux-01 ~]# ps aux |grep docker
[root@axinlinux-01 ~]# iptables -nvL #他會自動的幫咱們生成一些規則
[root@axinlinux-01 ~]# iptables -t nat -nvL #針對nat的
[root@axinlinux-01 ~]# cat /etc/sysconfig/iptables #這些規則不能幫咱們保存
[root@axinlinux-01 ~]# service iptables save #咱們要手動的保存一下
[root@axinlinux-01 ~]# iptables -t nat -F #作個試驗先把他清空掉
[root@axinlinux-01 ~]# iptables -t nat -nvL #再次查看就沒有規則了
[root@axinlinux-01 ~]# systemctl restart docker #咱們一旦重啓docker,這些規則就回來了
[root@axinlinux-01 ~]# iptables -t nat -nvL
由於重啓的時候,設計一些容器的啓動。他會自動把容器關閉,你還須要把容器再起來。因此通常做爲docker的服務器,iptables儘可能的不要動
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.3 鏡像管理
1.docker pull centos//能夠下載centos鏡像,速度很慢
配置docker加速器(參考 http://blog.csdn.net/xlemonok/article/details/71403534)
2.vi /etc/docker/daemon.json//加入以下內容
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
說明:這個url爲加速器地址,須要同窗們自行到阿里雲申請
3.配置完加速器,重啓docker服務,再次docker pull centos會快不少
4.docker images 查看本地的鏡像
5.docker search xxx //搜索鏡像,其中xxx是關鍵詞
6.docker tag centos aming123 //給鏡像打標籤 #冒號的用法
7.docker run -itd centos //把鏡像啓動爲容器,-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面
8.docker ps //查看運行的容器,加上-a選項後能夠查看全部容器,包括未運行的
9.docker rmi centos //用來刪除指定鏡像, 其中後面的參數能夠是tag,若是是tag時,其實是刪除該tag。當後面的參數爲鏡像ID時,則會完全刪除整個鏡像,全部標籤也會一同刪除
實例:
[root@axinlinux-01 ~]# docker pull centos #咱們直接拉取centos鏡像。由於在國外,很慢因此超時報錯了
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fcentos%3Apull&service=registry.docker.io: net/http: TLS handshake timeout
[root@axinlinux-01 ~]# vi /etc/docker/daemon.json #搞一個加速器
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
[root@axinlinux-01 ~]# systemctl restart docker #重啓一下docker
[root@axinlinux-01 ~]# docker pull centos #再次拉取鏡像
[root@axinlinux-01 ~]# docker images #看本地有哪些鏡像
REPOSITORY TAG(版本標籤) IMAGE ID(區分系統裏鏡像的惟一標示) CREATED SIZE
centos latest 1e1148e4cc2c 7 days ago 202MB
[root@axinlinux-01 ~]# docker search jumpserver #搜索jumpserver鏡像。直接pull就能夠直接使用了
[root@axinlinux-01 ~]# docker tag centos axinlinux_centos #給centos打標籤
[root@axinlinux-01 ~]# docker images #會生成一個跟centos同樣的鏡像出來。ID(惟一標示並無變)
REPOSITORY TAG IMAGE ID CREATED SIZE
axinlinux_centos latest 1e1148e4cc2c 7 days ago 202MB
centos latest 1e1148e4cc2c 7 days ago 202MB
ubuntu latest 93fd78260bd1 3 weeks ago 86.2MB
[root@axinlinux-01 ~]# docker tag centos test111:222222 #以冒號分隔可更改,左邊爲REPOSITORY,右邊爲TAG
[root@axinlinux-01 ~]# docker images #以上更改的結果。更改標籤的時候,以冒號分隔便可
REPOSITORY TAG IMAGE ID CREATED SIZE
axinlinux_centos latest 1e1148e4cc2c 7 days ago 202MB
centos latest 1e1148e4cc2c 7 days ago 202MB
test111 222222 1e1148e4cc2c 7 days ago 202MB
ubuntu latest 93fd78260bd1 3 weeks ago 86.2MB
[root@axinlinux-01 ~]# docker run -itd centos
55ad3e4d41d31abe444ffab8143245566b4b0e84704f241c14568e55849014a2
[root@axinlinux-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ad3e4d41d3 centos "/bin/bash" 5 seconds ago Up 4 seconds xenodochial_thompson
[root@axinlinux-01 ~]# docker ps -a #查看所有的容器,包括已經啓動的和中止的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ad3e4d41d3 centos "/bin/bash" About a minute ago Up About a minute xenodochial_thompson
[root@axinlinux-01 ~]# docker rmi test111 #刪除test111。報錯由於他默認會找test111:latest。而咱們剛纔建立的是test111:222222
Error: No such image: test111
[root@axinlinux-01 ~]# docker rmi test111:222222 #因此咱們要加上冒號222222,才能刪除
Untagged: test111:222222
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.4 經過容器建立鏡像
咱們能夠去官方直接拉取(pull)鏡像,也能夠自定義建立一個鏡像。好比我拉取了一個centos,可是這個鏡像的一些東西沒有,我想安裝一個jumpserver出來。這個時候就能夠在這個容器裏yum一些東西或者編譯一些東西。按完之後在把這個容器搞到鏡像裏去,建立一個鏡像出來,就能夠直接用這個鏡像
1.docker run啓動容器後,能夠經過下面命令進入容器
2.docker exec -it xxxxx bash//其中xxxxx爲容器id,這個id能夠用docker ps查看,最後面的bash爲進入容器後咱們要執行的命令,這樣就能夠打開一個終端
3.進入到該容器中,咱們作一些變動,好比安裝一些東西,而後針對這個容器進行建立新的鏡像
4.在容器中執行 yum install -y net-tools,而後ctrl d退出容器
5.docker commit -m "change somth" -a "somebody info" container_id new_image_name //container_id經過docker ps -a獲取,後面的new_image_name爲新鏡像名字
例如: docker commit -m "install net-tools" -a "Aming" 2c74d574293f centos_with_nettool 這個命令有點像svn的提交,-m 加一些改動信息,-a 指定做者相關信息 2c74d這一串爲容器id,再後面爲新鏡像的名字
實例:
[root@axinlinux-01 ~]# docker ps #查看一下開啓的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55ad3e4d41d3 centos "/bin/bash" 17 minutes ago Up 16 minutes xenodochial_thompson
[root@axinlinux-01 ~]# docker exec -it 55ad3e4d41d3 bash #進入這個開啓的容器。bash爲一個交互
[root@55ad3e4d41d3 /]# df -h #進去以後咱們能夠看他的裏面的東西
[root@55ad3e4d41d3 /]# free -h
[root@55ad3e4d41d3 /]# cat /proc/cpuinfo
[root@55ad3e4d41d3 /]# ifconfig #ifconfig用不了,安裝一個
bash: ifconfig: command not found
[root@55ad3e4d41d3 /]# yum install -y net-tools
[root@55ad3e4d41d3 /]# ifconfig #安裝完,就能夠用ifconfig看一下了
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 #這個是docker本身的一個網段
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 5419 bytes 8616331 (8.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3156 bytes 173704 (169.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@55ad3e4d41d3 /]# exit #退出來
exit
[root@axinlinux-01 ~]# ifconfig #看看系統的網卡,就多了這個docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:5ff:fe7e:1917 prefixlen 64 scopeid 0x20<link>
ether 02:42:05:7e:19:17 txqueuelen 0 (Ethernet)
RX packets 3156 bytes 129520 (126.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5411 bytes 8615683 (8.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
.。。。。
veth9f87026: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 #每開啓一個容器都會有一個這樣虛擬的網卡產生。這樣才能正常的跟宿主機正常的通訊
inet6 fe80::c8fc:9dff:feb7:e5cc prefixlen 64 scopeid 0x20<link>
ether ca:fc:9d:b7:e5:cc txqueuelen 0 (Ethernet)
RX packets 3156 bytes 173704 (169.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5419 bytes 8616331 (8.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@axinlinux-01 ~]# docker commit -m "install net-tools" -a "axinlinux" 55ad3e4d41d3 centos_with_net #作成鏡像。跟git很像,-a可理解爲做者,55ad3e4d41d3表示這個鏡像一開始的惟一ID,後面的就是這個新的鏡像的名字
sha256:9fe62e7d735523370bfb5c03029178f6edf92e4c4120e9adcfbf5a3fa637b49c
[root@axinlinux-01 ~]# docker images #就會有你這個鏡像出來。而後咱們跑一跑
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_with_net latest 9fe62e7d7355 3 minutes ago 272MB
axinlinux_centos latest 1e1148e4cc2c 7 days ago 202MB
centos latest 1e1148e4cc2c 7 days ago 202MB
ubuntu latest 93fd78260bd1 3 weeks ago 86.2MB
[root@axinlinux-01 ~]# docker run -itd centos_with_net #先打開
8028e7aa9820d9bf000a51fbad5cc3744fbf2134e3c5d388f33990e902d5a2d4
[root@axinlinux-01 ~]# docker exec -it 8028e7aa9820d9b bash #而後再進去
[root@8028e7aa9820 /]# ifconfig #就能夠運行ifconfig了
[root@8028e7aa9820 /]# ping www.baidu.com #也是能夠聯網的