Docker 使用總結

TerSnell 8年前發布 | 31K 次閱讀 Docker

來自: http://blog.csdn.net/liukun321/article/details/50770356


從貼出Docker 資料匯總那篇水帖, 到現在已經完整的做過一個用Docker部署的小型website集群并且已經上線運行了。 對docker的使用也有了些許體會(不過現在對Docker的理解還停留在一個輕度使用者的角度去理解)。這個項目從負載均衡 、反向代理、及app server全都是跑在Docker容器上。為什么使用Docker? 也許是時候好好想想這個問題了。最開始用Docker只是為了快速部署,以及docker能對不同服務進行很好的隔離,還有更多的優秀特性并不了解。也許使用Docker更多驅動來自于對新事物的好奇。
  • 為什么用Docker?

下面的資料來自大神們的總結:
當然這里說的是Docker的優點,我來總結一下網友們以及我個人對這個問題的看法:
1、虛擬化容器的優勢
隨著公有云的普及,開發者越來越需要一個快速遷移和高速構建應用的環境。 現在開發者需要能方便地創建運行在云平臺上的應用,也就是說應用必須能夠脫離底層機器。 而且同時必須是方便獲取的。因此,開發者們需要一種創建分布式應用程序的方式,這也是Docker所能夠提供的。
舉個例子: 我在項目中同一臺服務器中同時運行了nginx,forum&wiki(node.js),meteor server(meteor.js)。每個服務又依賴大量的第三方庫,如果用傳統的方式進行部署。則需要安裝大量的依賴模塊,費時費力。假如我需要在國外的AWS及國內的阿里云上同時部署多臺機器。或者從某個公有云服務商遷移到另外一個服務商。這中間的重復勞動是很讓人抵觸的。拋開讓人生厭的重復勞動,服務之間也有可能因此互相“污染”導致性能下降甚至服務異常。而Docker提供了一種更為聰明的方式,通過容器來打包應用,意味著遷移只需要在新的服務器上啟動需要的容器就可以了。這無疑將節約大量的寶貴時間,并降低部署過程出現問題的風險。

2、Docker在開發和運維中的優勢

對開發和運維(DevOps)人員來說,可能最夢寐以求的就是一次性地創建或配置,可以在任意環境、任意時間讓應用正常地運行。而Docker恰恰是可以實現這一終極目標的瑞士軍刀。

具體說來,Docker在開發和運維過程中,具有如下幾個方面的優勢。

更快速的交付和部署。使用Docker,開發人員可以使用鏡像來快速構建一套標準的開發環境;比如在項目開發過程中我會先用Docker將代碼部署到本地進行測試驗證。使用Docker在本地輕松搭建出的和服務器類似的架構,使開發環境中的測試更貼近于生產環境。開發完成之后,測試和運維人員可以直接使用相同環境來部署代碼。Docker可以快速創建和刪除容器,實現快速迭代,大量節約開發、測試、部署的時間。并且,各個步驟都有明確的配置和操作,整個過程全程可見,使團隊更容易理解應用的創建和工作過程。

更高效的資源利用。Docker容器的運行不需要額外的虛擬化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是內核級的虛擬化,可以實現更高的性能,同時對資源的額外需求很低。

更輕松的遷移和擴展。Docker容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 利用這種兼容性讓用戶可以在不同平臺之間輕松地遷移應用。

更簡單的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式進行分發和更新,從而實現自動化并且高效的容器管理。


3、Docker與虛擬機比較

作為一種輕量級的虛擬化方式,Docker在運行應用上跟傳統的虛擬機方式相比具有顯著優勢:

Docker容器很快,啟動和停止可以在秒級實現,這相比傳統的虛擬機方式要快得多。

Docker容器對系統資源需求很少,一臺主機上可以同時運行數千個Docker容器。

Docker通過類似Git的操作來方便用戶獲取、分發和更新應用鏡像,指令簡明,學習成本較低。

Docker通過Dockerfile配置文件來支持靈活的自動化創建和部署機制,提高工作效率。

Docker容器除了運行其中的應用之外,基本不消耗額外的系統資源,保證應用性能的同時,盡量減小系統開銷。傳統虛擬機方式運行N個不同的應用就要啟動N個虛擬機(每個虛擬機需要單獨分配獨占的內存、磁盤等資源),而Docker只需要啟動N個隔離的容器,并將應用放到容器內即可。

當然,在隔離性方面,傳統的虛擬機方式多了一層額外的隔離。但這并不意味著Docker就不安全。Docker利用Linux系統上的多種防護機制實現了嚴格可靠的隔離。從1.3版本開始,Docker引入了安全選項和鏡像簽名機制,極大地提高了使用Docker的安全性。


  • 基本操作常用命令
  1. 查看容器的root用戶密碼

    docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1

    因為docker容器啟動時的root用戶的密碼是隨機分配的。所以,通過這種方式就可以得到對應容器名的容器的root用戶的密碼了。

  2. 查看容器日志

    docker logs -f <容器名orID>
  3. 查看正在運行的容器

    docker ps
    docker ps -a為查看所有的容器,包括已經停止的。
  4. 刪除所有容器

    docker rm $(docker ps -a -q)

    刪除單個容器

    docker rm <容器名orID>
  5. 停止、啟動、殺死一個容器

    docker stop <容器名orID>
    docker start <容器名orID>
    docker kill <容器名orID>
  6. 查看所有鏡像

    docker images
  7. 刪除所有鏡像
    docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
  8. 運行一個新容器,同時為它命名、端口映射、文件夾映射。以tengine鏡像為例

    docker run -d -v /opt/nginx/tengine.conf:/usr/local/nginx/conf/nginx.conf -p 80:80 --name=nginx liukunmcu/tengine 
  9. 一個容器連接到另一個容器(父子鏈接)

    docker run -i -t --name <容器名> -d -link mongodb:db   <鏡像名>
    sonar

    這里列舉的是將當前容器連接到mongodb的過程,名為mongodb的容器已提前在本地啟動,并將mongodb容器映射為db。這樣,當前啟動的容器就可以使用db的相關的環境變量了。

  10. 拉取鏡像

    docker pull <鏡像名:tag>

    docker pull liukunmcu/tengine
  11. 當需要把一臺機器上的鏡像遷移到另一臺機器的時候,需要保存鏡像與加載鏡像。
    機器a

    docker save busybox-1 > /home/save.tar

    使用scp將save.tar拷到機器b上,然后:

    docker load < /home/save.tar
  12. 構建自己的鏡像

    docker build -t <鏡像名> <Dockerfile路徑>

    如Dockerfile在當前路徑:

    docker build -t xx/gitlab .
  13. 重新查看container的stdout
    # 啟動top命令,后臺運行
    $ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
    # 獲取正在running的container的輸出
    $ sudo docker attach $ID
    top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
    Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:    373572k total,   355560k used,    18012k free,    27872k buffers
    Swap:   786428k total,        0k used,   786428k free,   221740k cached
    ^C$
    $ sudo docker stop $ID
  14. 后臺運行(-d)、并暴露端口(-p)

    docker run -d -p 127.0.0.1:33301:22 centos6-ssh

從container中拷貝文件出來

sudo docker cp 7bb0e258aefe:/etc/debian_version .

拷貝7bb0e258aefe中的/etc/debian_version到當前目錄下。
注意:只要7bb0e258aefe沒有被刪除,文件命名空間就還在,可以放心的把exit狀態的container的文件拷貝出來


  • 網絡部分常用命令:

  1. docker0網橋配置

Docker 服務默認會創建一個 docker0 網橋(其上有一個 docker0 內部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到同一個物理網絡。

Docker 默認指定了 docker0 接口 的 IP 地址和子網掩碼,讓主機和容器之間可以通過網橋相互通信,它還給出了 MTU(接口允許接收的最大傳輸單元),通常是 1500 Bytes,或宿主主機網絡路由上支持的默認值。這些值都可以在服務啟動的時候進行配置。

  • --bip=CIDR -- IP 地址加掩碼格式,例如 192.168.1.5/24
  • --mtu=BYTES -- 覆蓋默認的 Docker mtu 配置

也可以在配置文件中配置 DOCKER_OPTS,然后重啟服務。 由于目前 Docker 網橋是 Linux 網橋,用戶可以使用brctl show 來查看網橋和端口連接信息。

$ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.3a1d7362b4ee no veth65f9 vethdda6

注:brctl 命令在 Debian、Ubuntu 中可以使用 sudo apt-get install bridge-utils 來安裝。

每次創建一個新容器的時候,Docker 從可用的地址段中選擇一個空閑的 IP 地址分配給容器的 eth0 端口。使用本地主機上 docker0 接口的 IP 作為所有容器的默認網關。

$ sudo docker run -i -t --rm base /bin/bash $ ip addr show eth0 24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::306f:e0ff:fe35:5791/64 scope link valid_lft forever preferred_lft forever $ ip route default via 172.17.42.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 $ exit

 本文由用戶 TerSnell 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!