docker命令??

 docker:是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
    docker有 以下缺點:
    Docker是基於Linux 64bit的,無法在32bit的linux/Windows/unix環境下使用
    LXC是基於cgroup等linux kernel功能的,因此container的guest系統只能是linux base的
    隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有container公用一部分的運行庫
    網絡管理相對簡單,主要是基於namespace隔離
    cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內存收費)
    docker對disk的管理比較有限
    container隨着用戶進程的停止而銷燬,container中的log等用戶數據不便收集


docker鏡像:
docker 鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的ubuntu的操作系統,裏面僅安裝了Apache或者你需要的其它應用程序。鏡像可以用來創建Docker容器。
Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,你甚至可以直接從其他人那裏下載一個`已經做好的鏡像來直接使用


docker容器
Docker利用容器來運行應用。
容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個應用程序。
*鏡像是隻讀的,容器在啓動的時候創建一層可寫層作爲最上層。

docker倉庫
倉庫是集中存放鏡像文件的場所,分爲公有倉庫和私有倉庫2種形式。
公有倉庫,目前僅有Docker Hub,提供了一個數量龐大的鏡像庫供用戶下載。當然,用戶也可以在本地網絡內創建一個私有倉庫。
當用戶創建了自己的鏡像之後就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了。
*Docker Hub的功能跟GitHub類似;push和pull操作跟git的操作類似。

1.先更新內核爲版本:3.10.0-327.el7.x86_64
 然後安裝
device-mapper-event-libs-1.02.107-5.el7.x86_64
device-mapper-event-1.02.107-5.el7.x86_64
libimobiledevice-1.1.5-6.el7.x86_64
device-mapper-libs-1.02.107-5.el7.x86_64
device-mapper-persistent-data-0.5.5-1.el7.x86_64
device-mapper-multipath-0.4.9-85.el7.x86_64
device-mapper-1.02.107-5.el7.x86_64
device-mapper-multipath-libs-0.4.9-85.el7.x86_64

或者直接更新機器的整個版本爲7.2:yum update *


docker 基礎命令

2.docker基礎配置:
 rpm  -ivh docker-engine-1.10.3-1.el7.centos.x86_64.rpm  docker-engine-selinux-1.10.3-1.el7.centos.noarch.rpm
 systemctl start docker
 docker version


wKioL1fSyDDjYnwiAABa_AVM1OM621.png-wh_50



 
 docker images    #列出鏡像 


$ sudo docker images # 顯示當前系統鏡像,不包括過渡層鏡像
$ sudo docker images -a # 顯示當前系統所有鏡像,包括過渡層鏡像
$ sudo docker images ubuntu # 顯示當前系統 docker ubuntu 庫中的所有鏡像 REPOSITORY


 docker search image_name  #檢索鏡像


docker pull image_name   #下載鏡像


docker rmi image_name   #刪除鏡像


docker history image_name  #顯示一個鏡像的歷史


docker run --rm rhel7 cat /etc/hosts    # 非交互式在容器中運行命令:


交互式運行容器:
# docker run -i -t rhel7 bash
bash-4.2# echo hello > /tmp/testfile
bash-4.2# exit

運行容器:
docker run -it -d --name vm1 rhel7 bash
docker start vm1
docker ps -a


docker restart vm1
docker kill vm1                   # kill 指定 docker 容器
docker pause vm1             # 暫停容器
docker unpause vm1          # 繼續暫停容器



要刪除一個容器
 docker run -it -d --name vm1 rhel7 bash
 docker stop vm1
 docker rm vm1  ##或者CONTAINER ID


 批量容器
docker ps -q
docker stop `docker ps -q`
docker rm `docker ps -aq`



docker run -it -d --name vm1 centos bash     ##vm1是指定的容器名
docker stop vm1
docker start vm1
docker attach vm1


 docker inspect vm1 | less        ##顯示容器的詳細信息

 docker diff vm1                 ##查看容器的變化


 docker attach vm1
[root@a4df1dc0b8e9 /]# touch file{1..2}
 docker diff vm1



wKiom1fSysvgID1zAAAShVLt2b4659.png-wh_50

wKioL1fSysygBDvVAAAWqirwGKM988.png-wh_50
 

導出容器:持久化容器(不是鏡像)
    docker export vm1 > vm1.tar

保存:持久化鏡像(不是容器)
    docker save centos > LINUX-1.TAR




 docker commit -m "add 3 file "  -p vm1 ubuntu:add    ##提交容器爲新的鏡像
 docker run -it --name vm1 ubuntuz:add bash
 docker commit -m "add 3 file"  -p vm1


 docker關於目錄掛載:


在真機上:
cd /tmp/
cp /etc/passwd  .

[注意]:容器目錄不能爲相對路徑即便容器銷燬了,新建的掛載目錄不會消失。進一步也可驗證,如果宿主機目錄的屬主和屬組發生了變化,容器銷燬後,宿主機目錄的屬主和屬組不會恢復到掛載之前的狀態。

容器啓動後,容器內會自動創建/data1的目錄。即-v參數中,冒號":"前面的目錄是宿主機目錄,後面的目錄是容器內目錄。

docker run -it --name vm1 -v /tmp/data1:/data1  rhel7  bash  

                                            ##將容器中的/data1掛載到真機/tmp/data1這個目錄下,並啓動容器
bash-4.2# ls
bash-4.2# cd /data1/
bash-4.2# pwd
/data1
bash-4.2# ls
passwd
bash-4.2#cp /etc/fstab  .       ##在真機上的/tmp下出現fstab文件

docker run -it --name vm1 -v /tmp/data1:/data2  rhel7  bash
bash-4.2# cd data2/
bash-4.2# ls
fstab  passwd

docker run -it --name vm1 -v /tmp/data1:/data1  -v /tmp/data2:/data2  rhel7 bash
bash-4.2# cd data2
bash-4.2# ls
bash-4.2# cd ..
bash-4.2# cd data1
bash-4.2# ls
fstab  passwd


docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro rhel7 bash
bash-4.2# cd /data2
bash-4.2# cp  /etc/hosts  .
cp: cannot create regular file './hosts': Read-only file system



docker還提供了一種高級的用法。叫數據卷。
數據卷:“其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的”。感覺像是由一個容器定義的一個數據掛載信息。其他的容器啓動可以直接掛載數據卷容器中定義的掛載信息。

創建一個普通的容器。用--name給他指定了一個名(不指定的話會生成一個隨機的名)。

docker create --name datavol -v /tmp/datavol:/sharedata  rhel7 bash

再創建一個新的容器,來使用這個數據卷。   --volumes-from用來指定要從哪個數據捲來掛載數據。
docker run -it --name vm1 --volumes-from datavol rhel7 bash
bash-4.2# cd /sharedata/
bash-4.2# ls
bash-4.2# pwd
/sharedata
bash-4.2# cp /etc/passwd .
bash-4.2# ls
passwd


docker run -it --name vm2 --volumes-from datavol rhel7 bash
bash-4.2# cd /sharedata/
bash-4.2# ls
passwd



docker下載軟件:
docker run -it --name vm1 -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/rhel7.repo rhel7 bash
wKiom1fSzpCCqYVKAABdilWVkDQ016.png-wh_50


yum install iputils  iproute -y
ip addr show
wKioL1fSzrvDfMVyAACIGM4dGUo740.png-wh_50


docker commit -p vm1 rhel7:tar
docker run --rm --volumes-from data -v /mnt/data:/data rhel7:tar tar cf /data/data.tar /sharedata  

                                         ##將/sharedata目錄打包在虛擬機/mnt/data/下,命名爲data.tar







Docker 四種網絡模式
     docker run 創建 Docker 容器時,可以用 --net 選項指定容器的網絡模式,Docker 有以下 4 種網絡模式:

    host 模式,使用 --net=host 指定。
    container 模式,使用 --net=container:NAMEorID 指定。
    none 模式,使用 --net=none 指定。
    bridge 模式,使用 --net=bridge 指定,默認設置。

host 模式

如果啓動容器的時候使用 host 模式,那麼這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。


container 模式

這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。

none模式

這個模式和前兩個不同。在這種模式下,Docker 容器擁有自己的 Network Namespace,但是,並不爲 Docker容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、IP、路由等信息。需要我們自己爲 Docker 容器添加網卡、配置 IP 等.


bridge模式
bridge 模式是 Docker 默認的網絡設置,此模式會爲每一個容器分配 Network Namespace、設置 IP 等,並將一個主機上的 Docker 容器連接到一個虛擬網橋上。當 Docker server 啓動時,會在主機上創建一個名爲 docker0 的虛擬網橋,此主機上啓動的 Docker 容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。接下來就要爲容器分配 IP 了,Docker 會從 RFC1918 所定義的私有 IP 網段中,選擇一個和宿主機不同的IP地址和子網分配給 docker0,連接到 docker0 的容器就從這個子網中選擇一個未佔用的 IP 使用。如一般 Docker 會使用 172.17.0.0/16 這個網段,並將 172.17.42.1/16 分配給 docker0 網橋(在主機上使用 ifconfig 命令是可以看到 docker0 的,可以認爲它是網橋的管理接口,在宿主機上作爲一塊虛擬網卡使用)



 systemctl stop docker

 ip link set dev docker0 down
 ip addr del 172.17.0.1/16 dev docker0
 ip addr add  172.17.0.1/24 dev docker0
 ip link set dev docker0 up


  systemctl start docker
 cp /lib/systemd/system/docker.service  /etc/systemd/system
 vim /etc/systemd/system/docker.service
wKiom1fSz8aDBIoKAABJZbF9MUc617.png-wh_50

ExecStart=/usr/bin/docker daemon -H fd://  --bip 172.17.0.1/24


 systemctl daemon-reload
 systemctl start docker


docker run -it --name vm1 --net host nginx bash
root@localhost:/# ip addr show
wKiom1fS0G3CFM9lAAFWnjBRtqA428.png-wh_50

wKiom1fS0KHxCVxGAACTVxR-edo651.png-wh_50
   真機ip 和容器ip 相同 ,容易導致資源的爭搶


  關閉真機上的httpd服務

  開啓容器裏的nginx

在網頁中打開:172.25.254.85
wKioL1fS0Mrj5g_AAABoaEVT8Uw687.png-wh_50



docker run -it --name vm1 ubuntu bash    ##開啓一個vm1容器
docker run -it --name vm2 --net container:vm1 ubuntu bash    ##和vm1共享資源,共同佔用端口

brctl show
wKiom1fS0PHQ3L5kAAA0LABRByk275.png-wh_50



 docker run -it --name vm3 --net none ubuntu bash
wKioL1fS0Sqi7xqpAABX40NkFck079.png-wh_50
 

  ip netns add test
  ip netns list

test

   cd /var/run/netns/
   ls

test

 
   ip netns del test

   docker inspect vm3  |  grep Pid
wKiom1fS0WPwo7AqAAAay2bw7j4897.png-wh_50
  docker inspect -f '``.`State`.`Pid`'  vm3
wKioL1fS0XqR_odKAAASuHXLKEY359.png-wh_50
 

 cd  /proc/5881/ns
  ll
wKioL1fS0ZiDMcqaAAAay2bw7j4052.png-wh_50


  ln -s /proc/5881/ns/net  /var/run/netns/5881
  ip netns list



  ip link add veth0 type veth peer name veth1

wKioL1fS0eXBq4mOAABD0XrXA2s825.png-wh_50

   brctl addif docker0 veth0
   brctl show
wKiom1fS0fmBRORbAAA7AmKMLAo385.png-wh_50
 
   ip link set veth1 netns 5881
   ip netns exec 5881  ip link set veth1 name eth1
   docker attach vm3

 
   ip netns exec 7546 ip link set eth1 up
   ip netns exec 7546 ip addr add 172.17.0.100/24 dev eth1
   ip netns exec 7546 ip route add default via 172.17.0.1
   ip link set veth0 up
 ping 172.17.0.100


   docker attach vm4


 
  docker run -P --name vm1 -d nginx    ##後臺運行容器vm1,-P隨即指定端口
 圖

  curl localhost:32769


  iptables -t nat -nL
 
  docker run -p 8080:80 -p 8081:443 --name vm1 -d nginx    ##-p自主指定端口號
  iptables -t nat -nL

 curl 172.25.254.45:8080




 
 






docker load -i redis.tar
docker run -d --name nosql redis
docker run --name webserver -it --link nosql:db nginx bash




 
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章