一些docker的技巧和秘訣
關於docker容器和鏡像的關係
無論容器里做什麼操作,寫文件,刪文件。該容器的基本鏡像都不會有任何改變。這是因為Docker從父鏡像建立增量鏡像,只存儲每個容器的更改。因此,如果你有一個300MB的父鏡像,如果你在容器中安裝了50MB的額外應用或服務,你的容器只有50MB,父鏡像還是300MB。 但是可以使用Dockfile或commit命令來,把增量鏡像和父鏡像一起生成一個新的鏡像。
dock top -- 顯示容器中運行的進程
查看容器的root用戶名和密碼
docker logs <容器名orID> 2>&1 | grep "^User: " | tail -n1
因為docker容器啟動時的root用戶的密碼是隨機分配的。所以,通過這種方式就可以得到redmine容器的root用戶的密碼了。
實時查看容器日誌
docker logs -f <容器名orID>
刪除所有容器
docker rm $(docker ps -a -q)
停止、啟動、殺死一個容器
docker stop <容器名orID>
docker start <容器名orID>
docker kill <容器名orID>
查看所有鏡像
docker images
刪除所有鏡像
docker rmi $(docker images | grep none | awk "{print $3}" | sort -r)
移除所有的容器和鏡像(大掃除)
用一行命令大掃除:
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
註:shell 中的 $() 和command類似,會先執行這裡面的內容,上面的腳本會出現如下 docker kill "pids" ; docker kill 在 docker 中用於停止容器,docker rm 刪除容器, docker rmi 刪除鏡像
當沒有運行的容器或者是根本沒有容器的時候,這隻會提示一個警告信息。當你想嘗試的時候,這就是個非常好的單行命令。如果你僅僅想刪除所有的容器,你可以運行如下命令:
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
不在 Shell 上運行命令
如果你使用需要Shell 的擴展項的 docker run 命令處理某些事情,比如 docker run --rm busybox ls "/var/log/", 這個命令將失敗。這個失敗的原因我花了工夫才弄明白。這個陷阱在這裡:你原來沒有 Shell , 而 ``` 是 Shell 的擴展項,因此你需要一個能使用的 Shell 。正確方法為
docker run --rm busybox sh -c "ls /var/log/*"
多程序開機自動運行方法:
docker容器每次啟動時,開機自啟動的命令都要在啟動容器前指定。如 docker run -I -t debian /bin/bash命令,只會運行/bin/bash程序,其它的程序都不會運行,對於要跑多個程序的容器特別糾結。可把前面所說的啟動命令換成
dockerrun -I -t debian /etc/rc.local
在容器中把所有需要開機自的啟動命令放在/etc/rc.local中,就可以達到多程序開機自啟動了。
後台運行則是:
docker run -d -p 50001:22 debian /etc/rc.local
退出時刪除容器
如果你僅僅想在一個容器中快速的運行一個命令,然後退出,並且不用擔心容器狀態,把 --rm 參數加入 run 命令後面,這將結束很多你保存了的容器,並且清理它們。
docker run --rm -i -t busybox /bin/bash
運行一個新容器,同時為它命名、埠映射、文件夾映射。以redmine鏡像為例
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
一個容器連接到另一個容器
docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server
sonar
容器連接到mmysql容器,並將mmysql容器重命名為db。這樣,sonar容器就可以使用db的相關的環境變數了。
鏡像的保存與導入
當需要把一台機器上的鏡像遷移到另一台機器的時候,需要保存鏡像與載入鏡像。 機器a
docker 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.05Tasks: 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的文件拷貝出來
TAG:程序員小新人學習 |