這些docker知識你必須知道!

Docker

容器技術已經成爲應用程序封裝和交付的核心技術
容器技術的核心有以下幾個內核技術組成:
Cgroups(control groups) 資源管理
namespace 進程隔離
selinux 安全
docker是完整的一套容器管理系統, 提供了一組命令, 讓用戶更加方便直接的使用容器技術, 而不需要過多關心底層內核技術

docker的優點:
相比與傳統的虛擬化技術, 更加簡介高效
傳統虛擬機需要給每個VM安裝操作系統, docker不需要
容器使用的共享公共庫和程序
docker的缺點:
容器的隔離性沒有虛擬化強
公用linux內核, 安全性有先天缺陷
selinux難以駕馭
監控容器和容器排錯是挑戰

鏡像:

在docker中容器是基於鏡像啓動的
鏡像是啓動容器的核心
鏡像採用分層設計
使用快照的COW技術, 確保底層數據不丟失

在這裏插入圖片描述
部署Docker

  • 需要64位操作系統,必須7以上的版本,而且要卸載防火牆。
  • 配置yum源,docker的軟件包位於光盤RHEL7-extras.iso CentOS-7.5-1804.iso
    - mount -t iso9660 -o ro,loop CentOS-7.5-1804.iso /var/ftp/centos-1804
    - mount -t iso9660 -o ro,loop RHEL7-extras.iso /var/ftp/extras
    - yum remove firewalld-* //卸載防火牆
    - yum -y install docker
    - systemctl start docker //啓動docker
    - systemctl enable docker

相關命令:
docker images //查看已有的鏡像
docker search busybox //要求虛擬機可以上網,下載鏡像。 帶ok字樣的是官方的
docker pull docker.io/busybox //下載鏡像
docker push docker.io/busybox //上傳鏡像
docker images //再次查看
文件名REPOSITORY 標籤TAG 編號ID IMAGE ID CREATED SIZE
docker.io/busybox latest 83aa35aa1c79 7 days ago 1.22 MB

鏡像的備份與恢復:

  • 鏡像如果不寫 標籤默認就是latest
    鏡像名稱(文件名) + 標籤 == 唯一!
    docker save docker.io/busybox:latest -o busybox.tar -o 輸出爲文件 文件名任意 //鏡像打包
    scp busybox.tar [email protected]:/root
    docker load -i busybox.tar -i爲input爲導入 可以docker load --help查看 //鏡像導入

容器的鏡像採用分層設計最大255層,下面的層都是隻讀的
docker history docker.io/busybox:latest //查看鏡像歷史 瞭解鏡像製作過程
docker inspect docker.io/busybix:latest //查看鏡像底層信息
docker tag //創建鏈接,複製
docker rmi //刪除本地鏡像
鏡像裏面可以是服務和系統,服務和系統是一種應用

六個命名空間:

  • 隔離主機名
  • 隔離文件系統 在容器裏創建文件,源主機看不見
  • 隔離用戶
  • 隔離網絡 ip地址不同但是可以ping通
  • 隔離進程 進程的pid是跟真機不同
  • 信號相量

啓動容器相關命令:

docker run -參數 鏡像名稱:標籤 啓動命令

  • 交互參數 -i
  • 終端參數 -t
  • 後臺參數(服務) -d
[root@kubenode-01 ~]# docker run -it docker.io/centos:latest  /bin/bash
#這樣就進入到容器裏了
[root@5bf2300e4a43 /]# hostname
5bf2300e4a43

隔離用戶

[root@kubenode-01 ~]# cat /etc/passwd | wc -l
43
[root@5bf2300e4a43 /]# cat /etc/passwd | wc -l
15

隔離網絡

[root@kubenode-01 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.21  netmask 255.255.255.0  broadcast 192.168.1.255

        
[root@5bf2300e4a43 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
       

隔離文件系統

[root@5bf2300e4a43 /]# mkdir test ; ls /
bin  dev  etc  home  lib  lib64  media  mnt  opt  proc
root  run  sbin  srv  sys  test  tmp  usr  var

[root@kubenode-01 ~]# ls /
bin   dev  file  lib    media  opt   root  sbin  sys  usr
boot  etc  home  lib64  mnt    proc  run   srv   tmp  var  
kubenode1上並沒有剛纔創建的test目錄

隔離進程

[root@5bf2300e4a43 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 10:16 ?        00:00:00 /bin/bash
root         79      1  0 10:27 ?        00:00:00 ps -ef
#一個系統不可能有兩個PID一樣的進程
[root@kubenode-01 ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 17:13 ?        00:00:03 /usr/lib/systemd/systemd --switched-root --system --des
root          2      0  0 17:13 ?        00:00:00 [kthreadd]

啓動nginx鏡像創建容器

[root@kubenode-01 ~]# docker run -itd docker.io/nginx:latest 
fd43bf1bf45e6777fa9b0b08d24d2a316cda8fd5f0b7f74f2588025f469e9f26
[root@kubenode-01 ~]# docker ps  查看啓動的容器
CONTAINER ID
fd43bf1bf45e (容器ID)
[root@kubenode-01 ~]# docker inspect fd	  查看容器的相關信息,得知IP地址
.....
 "IPAddress": "172.17.0.2",
.....

[root@kubenode-01 ~]# curl http://172.17.0.2
<!DOCTYPE html>
....
<title>Welcome to nginx!</title>  #啓動成功
......

docker ps 查看正在運行的容器 加 -a 是查看所有容器
docker ps -aq 查詢所有運行容器的id
docker stop //關閉容器
docker run -itd docker.io/nginx:latest //加-d選項在後臺運行
docker inspect 容器id //查詢容器的詳細信息
docker start 容器id //開啓容器
docker stop 容器id
docker restart //重啓容器
docker top 容器id //查看容器中的進程
docker rm 容器id //刪除容器,刪除啓動中的容器時要加-f選項
docker rm $(docker ps -q) //刪除括號命令中的執行結果
docker exec -it 容器id /bin/bash //進入容器。
echo $$ //顯示當前的pid號
docker attch 容器id //以上帝身份進入容器(一般排錯用,儘量不用)
如果pid是1 exit容器回被關閉!

自定義鏡像

  • 先進入一個容器
  • 可以在容器裏下載軟件包等操作。。
  • 退出容器
  • 執行docker commit 容器ID 鏡像名稱:標籤名稱

dockerfile關鍵詞:

  • FROM:基礎鏡像
  • ADD:複製文件到鏡像 宿主機的文件放到容器裏去
  • RUN:在容器內執行命令
  • CMD :容器啓動時執行的命令
  • ENV:設置變量
  • EXPOSE:開放的端口
  • WORLDIR :定義容器默認工作目錄,作用相當於cd
  • CMD的語法格式
    /bin/ls -l -a
    CMD [ “/bin/ls”, “-l”,"-a"]

書寫dockerfile:

[root@kubenode-01] # mkdir demo ; touch local.repo  dockerfile
[root@kubenode-01 demo]# ls
dockerfile  local.repo
#local.repo 必須在跟 Dockerfile文件的相同目錄中
[root@kubenode-01 demo]# vim dockerfile
FROM  docker.io/centos:latest		//基於centos:latest 鏡像做
RUN  rm -rf /etc/yum.repos.d/*.repo	//RUN表示在容器內執行命令
ADD  local.repo  /etc/yum.repo.d/local.repo	//將真機的local.repo文件拷貝到容器裏
#local.repo 必須在跟 Dockerfile文件的相同目錄中
RUN yum -y install net-tools bash-completion iproute vim psmisc 

[root@kubenode-01 demo]#   docker build  -t new.io:test .   #必須在dockerfile所在目錄下操作
Sending build context to Docker daemon 3.584 kB
Step 1 : FROM docker.io/centos:latest
 ---> 76d6bc25b8a5
Step 2 : RUN rm -rf /etc/yum.repos.d/*.repo
 ---> Running in afd64221b997
 ---> 02c37cc3f241
 .......
[root@kubenode-01 demo]# docker images
REPOSITORY          TAG               IMAGE ID            CREATED             
new.io              test             f1b594b99f70        7 minutes ago       

書寫dockerfile自定義web網站

先啓動一個容器測試:
[root@kubenode-01 web]# docker run -it my.io:test
[root@e0edacd90733 /]# yum -y install httpd
[root@e0edacd90733 /]# systemctl restart httpd #報錯,容器裏自己是沒無法啓動服務
[root@e0edacd90733 /]# rpm -ql httpd | grep service
/usr/lib/systemd/system/htcacheclean.service
/usr/lib/systemd/system/httpd.service
[root@e0edacd90733 /]# cat /usr/lib/systemd/system/httpd.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd #運行環境
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND #啓動命令

[root@e0edacd90733 /]# cat /etc/sysconfig/httpd #查看運行環境需要的變量
[root@e0edacd90733 /]# exit #退出容器


[root@kubenode-01 ~ ]# mkdir web
[root@kubenode-01 web]# touch dockerfile
[root@kubenode-01 web]# vim dockerfile
FROM my.io:test
RUN yum -y install httpd
ENV LANG=C
WORKDIR /var/www/html
EXPOSE 80
CMD ["/usr/sbin/httpd"," -DFOREGROUND"]
RUN echo ‘Hello world’ > /var/www/html/index.html
:wq
[root@kubenode-01 web]# docker build -t myweb.io:httpd .
[root@kubenode-01 web]# docker images
REPOSITORY TAG IMAGE ID CREATED
myweb.io httpd 8696c3f5e63d 20 seconds ago

[root@kubenode-01 web]# docker run -itd myweb.io:httpd
cb73c033eff96867b22537e3fd14df1dd740822cbc34ac0ba3897c0a98e1a25e
[root@kubenode-01 web]# docker inspect cb
[root@kubenode-01 web]# curl http://172.17.0.3
Hello world


自定義私有倉庫

1.安裝軟件包並啓動私有倉庫
[root@kubenode-01 ~]# yum -y install docker-distribution.x86_64
[root@kubenode-01 ~]# systemctl start docker-distribution.service
[root@kubenode-01 ~]# systemctl enable docker-distribution.service
[root@kubenode-01 ~]# ss -ntulp | grep 5000
tcp LISTEN 0 128 :::5000 ::😗 users:
[root@kubenode-01 ~]# curl http://192.168.1.100:5000/v2/_catalog //訪問私有倉庫
{“repositories”:[]}

2.宣告docker的倉庫地址(修改所有docker主機的配置文件)

  • 停止所有容器

[root@kubenode-01 ~]# vim /etc/sysconfig/docker //修改主配置文件
修改13,23行
INSECURE_REGISTRY=’–insecure-registry 192.168.1.100:5000’ //允許非加密方式訪問倉庫
ADD_REGISTRY=’–add-registry 192.168.1.100:5000’ //docker倉庫地址
:wq
[root@kubenode-01 ~]# systemctl restart docker
curl http://192.168.1.100:5000/v2/_catalog //訪問測試
[root@kubenode-01 ~]# rsync -av /etc/sysconfig/docker [email protected]:/etc/sysconfig/docker
[root@kubenode-02 ~]# systemctl restart docker
curl http://192.168.1.100:5000/v2/_catalog //訪問測試

3.上傳鏡像到私有倉庫(必須打標籤)
docker tag myos:httptest 192.168.1.100:5000/myos:httptest //打標籤
docker push 192.168.1.100:5000/myos:httptest //上傳鏡像
curl http://192.168.1.100:5000/v2/_catalog
curl http://192.168.1.100:5000/v2/myos/tags/list //查看標籤
4. 使用鏡像啓動容器
docker02利用倉庫中的鏡像啓動容器
docker run -it 192.168.1.100:5000/myos:latest //下載鏡像生成容器
/var/lib/registry/ //存放鏡像的目錄,要刪除鏡像進入目錄裏

持久化存儲

卷的概念:

  • docker容器不保持任何數據

  • 重要數據請使用外部卷存儲

  • 容器可以掛在真實機目錄或共享存儲爲卷

    docker run -it -v 宿主機目錄或文件:容器內目錄或文件 myos:latest

映射目錄

修改主機的映射目錄就是修改容器裏被映射的目錄

[真機: ] #docker run -itd -v /tmp:/httpd myos.httpd 將宿主機的tmp目錄映射到容器裏叫httpd
[真機: ] #docker exec -it 00 /bin/bash
[容器 00:] # cp /etc/httpd/conf/httpd.conf /httpd
[容器 00:] # exit
[真機: ] # vim /tmp/httpd.conf 將端口改爲8080
[真機: ] # docker run -it -v /tmp/httpd.cof: /etc/httpd/conf/httpd.conf myos.httpd
[真機: ] #docker exec -it ac /bin/bash
[容器 ac:] # ss -ntulp | grep 8080 發現端口已被改成8080

使用NFS共享存儲:

Docker主機掛在共享目錄,在將共享目錄映射到容器中。
在這裏插入圖片描述
[root@module ~]# rpm -qa | grep nfs-utils 下載NFS軟件提供服務
nfs-utils-1.3.0-0.54.el7.x86_64
[root@module ~]# vim /etc/exports
/var/webhome *(rw)
:wq
root@module ~]# mkdir /var/webhome 將/var/webhome共享出去
[root@module ~]# chmod 777 /var/webhome
[root@module ~]# systemctl restart nfs
[root@module ~]# echo Hello world > /var/webhome/index.html


[root@kubenode-01 ]# yum -y install nfs
[root@kubenode-01 ]#showmount -e 192.168.1.100
[root@kubenode-01 ]#mount -t nfs 192.168.1.100:/var/webhome /mnt
[root@kubenode-01 ]#docker run -it docker.io/nginx:latest /bin/bash 進容器加/bin/bash
[root@kubenode-01 ]#docker run -itd -v /mnt:/usr/share/nginx/html docker.io/nginx 啓動服務不加
[root@kubenode-01 ]#docker inspect 3e 查看IP地址
[root@kubenode-01 ]#curl -i 172.17.0.2
[root@kubenode-01 tmp]# curl -i 172.17.0.2
HTTP/1.1 200 OK
Server: nginx/1.15.8

hellow world


[root@kubenode-2 ]# yum -y install nfs
[root@kubenode-2 ]#showmount -e 192.168.1.100
[root@kubenode-2 ]#mount -t nfs 192.168.1.100:/var/webhome /mnt
[root@kubenode-2 ]# docker run -itd -v /mnt:/var/www/html/ 192.168.1.100:5000/web2:test2 直接使用倉庫裏的鏡像啓動容器
[root@kubenode-2 ]#docker inspect 14
[root@kubenode-2 ]# curl -i 172.17.0.3
[root@kubenode-02 ~]# curl -i 172.17.0.3
HTTP/1.1 200 OK
Date: Fri, 26 Jun 2020 14:26:07 GMT
Server: Apache/2.4.6 (CentOS)

hellow world


自定義網橋

在docker中利用鏡像生成的容器默認是接在docker0上
可以將docker0想象成一個虛擬的交換機
[root@kubenode-01 ~]# docker network ls #查看docker網絡
NETWORK ID NAME DRIVER SCOPE
2b4687baca4f bridge bridge local
47cd23c7c75b host host local
80e09e8993fe none null local
[root@kubenode-01 ~]# docker network create --subnet 10.10.10.0/24 docker1 生成docker1爲10網段
81d2964dfaf2e87d6b88dcc33be9aac67dbfae84cf9f04f483ef4d2b7446e459
[root@kubenode-01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2b4687baca4f bridge bridge local
81d2964dfaf2 docker1 bridge local

[root@kubenode-01 ~]# docker run -it --network=docker1 new.io:test 指定網絡創建容器
[容器: ]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.10.2 netmask 255.255.255.0 broadcast 0.0.0.0

利用docker1網絡創建的容器不能與docker0的容器互通,在有網絡需求的架構中可以使用這種方法
[root@kubenode-01 ~]# docker network rm docker1 刪除


對外發布服務:

  • 默認容器可以訪問外網
  • 但外部網絡的主機不可以訪問容器內的資源
  • 容器的特徵是可以把宿主機變成對應的服務
  • 我們可以使用-p 參數把容器端口和宿主機的端口做綁定
    • -p 宿主機端口:容器端口
    • 例如把docker1 變成httpd
      • docker run -itd -p 80:80 docker.io/myos:httpd
    • 例如把docker1 變成nginx
      • docker run -itd -p 80:80 docker.io/nginx:latest

[root@kubenode-01 ~]# docker run -itd -p80:80 docker.io/nginx:latest
61808de85e36d20c6fe85230f1798754d319c08a4f927443ff79f81902a9a47d
[root@kubenode-01 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255

  • 使用瀏覽器訪問 192.168.1.21
    在這裏插入圖片描述
    [root@kubenode-01 ~]# docker run -itd -p8080:80 web2:test 利用端口綁定啓動httpd容器
    • 使用瀏覽器訪問 192.168.1.21
      在這裏插入圖片描述

[root@kubenode-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34d68a846541 docker.io/nginx:latest “nginx -g 'daemon off” 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp big_ramanujan
3dd247af8b7f web2:test “/usr/sbin/httpd -DFO” About a minute ago Up About a minute 0.0.0.0:8080->80/tcp big_mclean

談談我對docker的理解:

  • docker的重點在於鏡像的編排,可以把各種服務放到容器中,很輕便
  • 利用docker save 保存鏡像,或者搭建私有倉庫實現批量部署
  • 鏡像的編排就像蓋房子一樣,鏡像的後端盤都是隻讀的,利用docker commit 容器ID 鏡像:標籤 生成新的鏡像
  • 假如需要部署10臺DNS,直接利用dockerfile寫一個DNS鏡像,在所有機器上執行端docker 的綁定端口將容器的服務寄生在宿主機上
  • docker的難點我覺得在於鏡像的編排…
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章