Docker 使用總結
來自: http://blog.csdn.net/liukun321/article/details/50770356
從貼出Docker 資料匯總那篇水帖, 到現在已經完整的做過一個用Docker部署的小型website集群并且已經上線運行了。 對docker的使用也有了些許體會(不過現在對Docker的理解還停留在一個輕度使用者的角度去理解)。這個項目從負載均衡 、反向代理、及app server全都是跑在Docker容器上。為什么使用Docker? 也許是時候好好想想這個問題了。最開始用Docker只是為了快速部署,以及docker能對不同服務進行很好的隔離,還有更多的優秀特性并不了解。也許使用Docker更多驅動來自于對新事物的好奇。
- 為什么用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的安全性。
- 基本操作常用命令
查看容器的root用戶密碼
docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1
因為docker容器啟動時的root用戶的密碼是隨機分配的。所以,通過這種方式就可以得到對應容器名的容器的root用戶的密碼了。
查看容器日志
docker logs -f <容器名orID>
查看正在運行的容器
docker ps docker ps -a為查看所有的容器,包括已經停止的。
刪除所有容器
docker rm $(docker ps -a -q)
刪除單個容器
docker rm <容器名orID>
停止、啟動、殺死一個容器
docker stop <容器名orID> docker start <容器名orID> docker kill <容器名orID>
查看所有鏡像
docker images
- 刪除所有鏡像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
運行一個新容器,同時為它命名、端口映射、文件夾映射。以
tengine
鏡像為例docker run -d -v /opt/nginx/tengine.conf:/usr/local/nginx/conf/nginx.conf -p 80:80 --name=nginx liukunmcu/tengine
一個容器連接到另一個容器(父子鏈接)
docker run -i -t --name <容器名> -d -link mongodb:db <鏡像名> sonar
這里列舉的是將當前容器連接到mongodb的過程,名為mongodb的容器已提前在本地啟動,并將mongodb容器映射為db。這樣,當前啟動的容器就可以使用db的相關的環境變量了。
拉取鏡像
docker pull <鏡像名:tag>
如
docker pull liukunmcu/tengine
當需要把一臺機器上的鏡像遷移到另一臺機器的時候,需要保存鏡像與加載鏡像。
機器adocker save busybox-1 > /home/save.tar
使用scp將save.tar拷到機器b上,然后:
docker load < /home/save.tar
構建自己的鏡像
docker build -t <鏡像名> <Dockerfile路徑>
如Dockerfile在當前路徑:
docker build -t xx/gitlab .
- 重新查看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
后臺運行(-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的文件拷貝出來
- 網絡部分常用命令:
- 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