Docke技術應用

Docke技術應用html

1、理論講解
A、什麼是容器
• 容器技術已經成爲應用程序封裝和交付的核心技術
• 容器技術的核心有如下幾個內核技術組成:
– CGroups(Control Groups)-資源管理
– NameSpace-進程隔離
– SELinux安全
• 因爲是在物理機上實施隔離,啓動一個容器,能夠像啓動一個進程同樣linux

B、什麼是Docker
• Docker是完整的一套容器管理系統
• Docker提供了一組命令,讓用戶更加方便直接地使
用容器技術,而丌須要過多關心底層內核技術nginx

C、Docker優勢
• 相比於傳統的虛擬化技術,容器更加簡潔高效
• 傳統虛擬機須要給每一個VM安裝操做系統
• 容器使用的共享公共庫和程序docker

D、Docker的缺點
• 容器的隔離性沒有虛擬化強
• 共用Linux內核,安全性有先天缺陷
• SELinux難以駕馭
• 監控容器和容器排錯是挑戰json

F、什麼是鏡像
• 在Docker中容器是基於鏡像啓動的
• 鏡像是啓動容器的核心
• 鏡像採用分層設計
• 使用快照的COW技術,確保底層數據打開不丟失
Docker hub鏡像倉庫
https://hub.docker.com
• Docker官方提供公共鏡像的倉庫(Registry)vim

2、部署Dockcentos

安裝Docker安全

rpm -ivh docker-engine-1.12.1-1.el7.centos.x86_64.rpm

rpm -ivh docker-engine-selinux-1.12.1-1.el7.c

3、鏡像操做
• 下載鏡像(從鏡像倉庫中下載鏡像): #docker pull centos
• 上傳鏡像(上傳鏡像到倉庫): #docker push centos
• 導入鏡像(經過tar包文件導入鏡像): # docker load < xx.tar
• 導出鏡像(將本地鏡像導出爲tar文件):# docker save image_name > xx.tar
• 啓動鏡像生成一個容器:# docker run -it centos bash
• 重命名鏡像名稱:# docker tag centos:latest test:v1bash

鏡像經常使用命令:服務器

4、容器操做
容器經常使用命令

使用鏡像啓動容器
[root@jacob ~]# docker run -it centos bash //啓動後容器放在前臺運行
[root@jacob~]#docker run -itd centos bash //啓動後容器放在後臺運行

進入容器的三種方法
方法一:
– docker attach 進入容器,exit會致使容器關閉
[root@ms docker]# docker attach fb66c90f5bf9
[root@fb66c90f5bf9 /]# exit
Exit

方法二:
– docker exec 進入容器時後面必須執行一條命令 退出時不會關閉容器
[root@ms docker]# docker exec -it 01a7e3e5f71b bash
[root@01a7e3e5f71b /]# exit
exit

方法三:
–那麼經過容器的ID號進入容器
獲取容器的pid號:
[root@ms ~]#docker inspect --format "{{.State.Pid}}" fb66c90f5bf9
經過容器的pid號進入容器:
[root@ms ~]# nsenter -t 3974 -u -i -n -p
那麼經過容器的ID號進入容器能夠編寫腳本:
[root@ms docker]# vim ns.sh
#!/bin/bash

Use nsenter to access docker

docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
nsenter -t $PID -m -u -i -n -p
}
docker_in $1

刪除容器
刪除已經關閉的容器:
[root@ms docker]# docker rm 7313aebddfd7
刪除正在運行的容器命令
[root@ms docker]# docker rm -f 7313aebddfd7
利用docker作實驗時能夠加上--rm參數 容器執行完命令後自動刪除:
[root@ms docker]# docker run --rm centos /bin/echo "hehe"
只列出正在運行容器的ID號
[root@ms docker]# docker ps -a
殺死全部正在運行的容器
[root@ms docker]# docker kill $(docker ps -a -q)

5、製做自定義鏡像
1.1 問題
本案例要求製做自定義鏡像:
基於centos鏡像使用commit建立新的鏡像文件
基於centos鏡像使用Dockerfile文件建立一個新的鏡像文件
1.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:使用鏡像啓動容器
1)在該容器基礎上修改yum源
1.[root@docker1 docker_images]# docker run -it centos
2.[root@8d07ecd7e345 /]# rm -rf /etc/yum.repos.d/*
3.[root@8d07ecd7e345 /]# vi /etc/yum.repos.d/dvd.repo
4.[dvd]
5.name=dvd
6.baseurl=ftp://192.168.1.254/system
7.enabled=1
8.gpgcheck=0
9.[root@8d07ecd7e345 /]# yum clean all
10.[root@8d07ecd7e345 /]# yum repolist
2)安裝測試軟件
1.[root@8d07ecd7e345 /]# yum -y install net-tools iproute psmisc vim-enhanced
3)ifconfig查看
1.[root@8d07ecd7e345 /]# ifconfig
2.eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

  1. inet 172.17.0.3 netmask 255.255.0.0 broadcast 0.0.0.0
  2. inet6 fe80::42:acff:fe11:3 prefixlen 64 scopeid 0x20<link>
  3. ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
  4. RX packets 2488 bytes 28317945 (27.0 MiB)
  5. RX errors 0 dropped 0 overruns 0 frame 0
  6. TX packets 1858 bytes 130264 (127.2 KiB)
  7. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    10.[root@8d07ecd7e345 /]# exit
    11.exit
    步驟二:另存爲另一個鏡像
    1)建立新建鏡像
    1.[root@docker1 docker_images]# docker start 8d07ecd7e345        
    2.//能夠簡寫爲8d,要保證惟一性
    3.8d07ecd7e345
    4.[root@docker1 docker_images]# docker commit 8d07ecd7e345 myos:v1
    5.sha256:ac3f9c2e8c7e13db183636821783f997890029d687b694f5ce590a473ad82c5f
    2)查看新建的鏡像,如圖-1所示:

圖-1
3)驗證新建鏡像
1.[root@docker1 docker_images]# docker run -it myos:v1
2.[root@497c7b4664bf /]# ifconfig
3.eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

  1. inet 172.17.0.6 netmask 255.255.0.0 broadcast 0.0.0.0
  2. inet6 fe80::42:acff:fe11:6 prefixlen 64 scopeid 0x20<link>
  3. ether 02:42:ac:11:00:06 txqueuelen 0 (Ethernet)
  4. RX packets 0 bytes 0 (0.0 B)
  5. RX errors 0 dropped 0 overruns 0 frame 0
  6. TX packets 7 bytes 578 (578.0 B)
  7. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    步驟三:使用Dockerfile文件建立一個新的鏡像文件
    Dockerfile語法格式:
    – FROM:基礎鏡像
    – MAINTAINER:鏡像建立者信息(說明)
    – EXPOSE:開放的端口
    – ENV:設置環境變量
    – ADD:複製文件到鏡像
    – RUN:製做鏡像時執行的命令,能夠有多個
    – WORKDIR:定義容器默認工做目錄
    – CMD:容器啓動時執行的命令,僅能夠有一條CMD
    1)建立一個Apache的鏡像文件
    1.[root@docker1 ~]# mkdir oo
    2.[root@docker1 ~]# cd oo
    3.[root@docker1 oo]# touch Dockerfile    //Dockerfile文件第一個字母要大寫
    4.[root@docker1 oo]# cp /etc/yum.repos.d/local.repo ./
    5.[root@docker1 oo]# vi Dockerfile
    6.FROM myos:v1
    7.RUN yum -y install httpd
    8.ENV EnvironmentFile=/etc/sysconfig/httpd
    9.WORKDIR /var/www/html/            //定義容器默認工做目錄
    10.RUN echo "test" > /var/www/html/index.html
    11.EXPOSE 80                //設置開放端口號
    12.CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
    13.[root@docker1 oo]# docker build -t myos:http .
    14.[root@docker1 oo]# docker run -d myos:http
    15.d9a5402709b26b42cd304c77be442559a5329dc784ec4f6c90e4abac1c88e206
    16.[root@docker1 oo]# docker inspect d9
    17.[root@docker1 oo]# curl 172.17.0.7
    18.test
    六:建立私有鏡像倉庫
    2.1 問題
    本案例要求建立私有的鏡像倉庫:
    Docker主機:192.168.1.20
    鏡像倉庫服務器:192.168.1.10
    2.2 步驟
    實現此案例須要按照以下步驟進行。
    步驟一:自定義私有倉庫
    1)定義一個私有倉庫
    1.[root@docker1 oo]# vim /etc/docker/daemon.json    //不寫這個文件會報錯
    2.{
    3."insecure-registries" : ["192.168.1.10:5000"]    //使用私有倉庫運行容器
    4.}
    5.[root@docker1 oo]# systemctl restart docker
    6.[root@docker1 oo]# docker run -d -p 5000:5000 registry
    7.273be3d1f3280b392cf382f4b74fea53aed58968122eff69fd016f638505ee0e
    8.[root@docker1 oo]# curl 192.168.1.10:5000/v2/
    9.{}    //出現括號
    10.[root@docker1 oo]# docker tag busybox:latest 192.168.1.10:5000/busybox:latest
    11.//打標籤
    12.[root@docker1 oo]# docker push 192.168.1.10:5000/busybox:latest //上傳
    13.[root@docker1 oo]# docker tag myos:http 192.168.1.10:5000/myos:http
    14.[root@docker1 oo]# docker push 192.168.1.10:5000/myos:http
    2)在docker2上面啓動
    1.[root@docker2 ~]# scp 192.168.1.10:/etc/docker/daemon.json /etc/docker/
    2.[root@docker2 ~]# systemctl restart docker
    3.[root@docker2 ~]# docker images
    4.[root@docker2 ~]# docker run -it 192.168.1.10:5000/myos:http /bin/bash    
    5.//直接啓動
    步驟二:查看私有倉庫
    1)查看裏面有什麼鏡像
    1.[root@docker1 oo]# curl http://192.168.1.10:5000/v2/_catalog
    2.{"repositories":["busybox","myos"]}
    2)查看裏面的鏡像標籤
    1.[root@docker1 oo]# curl http://192.168.1.10:5000/v2/busybox/tags/list
    2.{"name":"busybox","tags":["latest"]}
    3.[root@docker1 oo]# curl http://192.168.1.10:5000/v2/myos/tags/list
    4.{"name":"myos","tags":["http"]}
    7、NFS共享存儲
    3.1 問題
    本案例要求建立NFS共享,能映射到容器裏:
    服務器建立NFS共享存儲,共享目錄爲/content,權限爲rw
    客戶端掛載共享,並將共享目錄映射到容器中
    3.2 方案
    本方案要求須要一臺NFS服務器(NFS用真機代替),ip爲192.168.1.254,一臺客戶端docker1主機,ip爲192.168.1.10,一臺戶端docker2主機,ip爲192.168.1.20,實現客戶端掛載共享,並將共享目錄映射到容器中,docker1更新文件時,docker2實現同步更新,方案如圖-2所示:

圖-2
3.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:配置NFS服務器
1.[root@room9pc01 ~]# yum -y install nfs-utils
2.[root@room9pc01 ~]# mkdir /content
3.[root@room9pc01 ~]# vim /etc/exports
4./content (rw,no_root_squash)
5.[root@room9pc01 ~]# systemctl restart nfs-server.service
6.[root@room9pc01 ~]# systemctl restart nfs-secure.service
7.[root@room9pc01 ~]# exportfs -rv
8.exporting
:/content
9.[root@room9pc01 ~]# chmod 777 /content
10.[root@room9pc01 ~]# echo 11 > /content/index.html
步驟二:配置客戶端
1.[root@docker1 oo]# yum -y install nfs-utils
2.[root@docker1 oo]# systemctl restart nfs-server.service
3.[root@docker1 oo]# showmount -e 192.168.1.254
4.Export list for 192.168.1.254:
5./content
6.[root@docker1 ~]# mkdir /mnt/qq
7.[root@docker1 ~]# mount -t nfs 192.168.1.254:/content /mnt/qq
8.[root@docker1 ~]# ls /mnt/qq
9.index.html
10.[root@docker1 ~]# cat /mnt/qq/index.html
11.11
12.[root@docker1 ~]# docker run -d -p 80:80 -v /mnt/qq:/var/www/html -it myos:http
13.224248f0df5d795457c43c2a7dad0b7e5ec86abdc3f31d577e72f7929f020e01
14.[root@docker1 ~]# curl 192.168.1.10
15.11
16.[root@docker2 ~]# yum -y install nfs-utils
17.[root@docker2 ~]# showmount -e 192.168.1.254
18.Export list for 192.168.1.254:
19./content

20.[root@docker2 ~]# mkdir /mnt/qq
21.[root@docker2 ~]# mount -t nfs 192.168.1.254:/content /mnt/qq
22.[root@docker2 ~]# docker run -d -p 80:80 -v /mnt/qq:/var/www/html -it 192.168.1.10:5000/myos:http
23.00346dabec2c7a12958da4b7fee6551020249cdcb111ad6a1058352d2838742a
24.[root@docker2 ~]# curl 192.168.1.20
25.11
26.[root@docker1 ~]# touch /mnt/qq/a.sh
27.[root@docker1 ~]# echo 22 > /mnt/qq/index.html
28.[root@docker2 ~]#ls /mnt/qq/
29.a.sh index.html
30.[root@docker2 ~]# cat /mnt/qq/index.html
31.22
8、建立自定義網橋
4.1 問題
本案例要求:
建立網橋設備docker01
設定網段爲172.30.0.0/16
啓動nginx容器,nginx容器橋接docker01設備
映射真實機8080端口與容器的80端口
4.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:新建Docker網絡模型
1)新建docker1網絡模型
1.[root@docker1 ~]# docker network create --subnet=172.30.0.0/16 docker01
2.c9cf26f911ef2dccb1fd1f670a6c51491e72b49133246f6428dd732c44109462
3.[root@docker1 ~]# docker network list
4.NETWORK ID NAME DRIVER SCOPE
5.bc189673f959 bridge bridge local
6.6622752788ea docker01 bridge local
7.53bf43bdd584 host host local
8.ac52d3151ba8 none null local
9.[root@docker1 ~]# ip a s
10.[root@docker1 ~]# docker network inspect docker01
11.[

  1. {
  2. "Name": "docker01",
  3. "Id": "c9cf26f911ef2dccb1fd1f670a6c51491e72b49133246f6428dd732c44109462",
  4. "Scope": "local",
  5. "Driver": "bridge",
  6. "EnableIPv6": false,
  7. "IPAM": {
  8. "Driver": "default",
  9. "Options": {},
  10. "Config": [
  11. {
  12. "Subnet": "172.30.0.0/16"
  13. }
  14. ]
  15. },
  16. "Internal": false,
  17. "Containers": {},
  18. "Options": {},
  19. "Labels": {}
  20. }
    32.]
    2)使用自定義網橋啓動容器
    1.[root@docker1 ~]# docker run --network=docker01 -id nginx
    3)端口映射
    1.[root@docker1 ~]# docker run -p 8080:80 -id nginx
    2.e523b386f9d6194e53d0a5b6b8f5ab4984d062896bab10639e41aef657cb2a53
    3.[root@docker1 ~]# curl 192.168.1.10:8080
    步驟二:擴展實驗
    1)新建一個網絡模型docker02
  21. [root@docker1 ~]# docker network create --driver bridge docker02
    2.//新建一個 名爲docker02的網絡模型
    3.5496835bd3f53ac220ce3d8be71ce6afc919674711ab3f94e6263b9492c7d2cc
    4.[root@docker1 ~]# ifconfig     
    5.//可是在用ifconfig命令查看的時候,顯示的名字並非docker02,而是br-5496835bd3f5
    6.br-5496835bd3f5: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
  22. inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
  23. ether 02:42:89:6a:a2:72 txqueuelen 0 (Ethernet)
  24. RX packets 8 bytes 496 (496.0 B)
  25. RX errors 0 dropped 0 overruns 0 frame 0
  26. TX packets 8 bytes 496 (496.0 B)
  27. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  28. 14.[root@docker1 ~]# docker network list            //查看顯示docker02(查看加粗字樣)
    15.NETWORK ID NAME DRIVER SCOPE
    16.bc189673f959 bridge bridge local
    17.5496835bd3f5 docker02 bridge local
    18.53bf43bdd584 host host local
    19.ac52d3151ba8 none null local
    2)若要解決使用ifconfig命令能夠看到docker02的問題,能夠執行如下幾步命令

  29. [root@docker1 ~]# docker network list //查看docker0的NETWORK ID(加粗字樣)
    2.NETWORK ID NAME DRIVER SCOPE
    3.bc189673f959 bridge bridge local
    4.5496835bd3f5 docker02 bridge local
    5.53bf43bdd584 host host local
    6.ac52d3151ba8 none null local
    3)查看16dc92e55023的信息,如圖-3所示:
    1.[root@docker2 ~]# docker network inspect bc189673f959

圖-3
4)查看圖片的倒數第六行有"com.docker.network.bridge.name": "docker0"字樣
5)把剛剛建立的docker02網橋刪掉
1.[root@docker1 ~]# docker network rm docker02 //刪除docker02
2.docker02
3.[root@docker1 ~]# docker network create \
4.docker02 -o com.docker.network.bridge.name=docker02
5.//建立docker02網橋
6.648bd5da03606d5a1a395c098662b5f820b9400c6878e2582a7ce754c8c05a3a
7.[root@docker1 ~]# ifconfig     //ifconfig查看有docker02
8.docker02: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500

  1. inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
  2. ether 02:42:94:27:a0:43 txqueuelen 0 (Ethernet)
  3. RX packets 0 bytes 0 (0.0 B)
  4. RX errors 0 dropped 0 overruns 0 frame 0
  5. TX packets 0 bytes 0 (0.0 B)
  6. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    6)若想在建立docker03的時候自定義網段(以前已經建立過docker01和02,這裏用docker03),執行如下命令
    1.[root@docker1 ~]# docker network create docker03 --subnet=172.30.0.0/16 -o com.docker.network.bridge.name=docker03
    2.f003aa1c0fa20c81e4f73c12dcc79262f1f1d67589d7440175ea01dc0be4d03c
    3.[root@docker1 ~]# ifconfig //ifconfig查看,顯示的是本身定義的網段
    4.docker03: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
  7. inet 172.30.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
  8. ether 02:42:27:9b:95:b3 txqueuelen 0 (Ethernet)
  9. RX packets 0 bytes 0 (0.0 B)
  10. RX errors 0 dropped 0 overruns 0 frame 0
  11. TX packets 0 bytes 0 (0.0 B)
  12. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
相關文章
相關標籤/搜索