What is the docker?
docker是一個能讓你的server中,擁有乾淨的環境,以及運行各種的linux
平台,例如你開啟很多web service,可能有python、php、tomcat…,這時你可透過docker,讓這些web service,都擁有各自的環境,最後透過server的apache
,proxy到各項服務,至於docker跟vm有什麼不同,可以參考這篇。
Pull images
在docker
中要使用哪個作業系統,可以透過pull
這個指令,直接抓取你所需要的image
來源。
假設要抓取ubuntu:
1 | sudo docker pull ubuntu |
之後在用images
這指令去查詢目前以抓下來的source:
1 | sudo docker images |
會顯示以下載的image
列表:1
2
3ubuntu latest 8dbd9e392a96 4 months ago 131.5 MB (virtual 131.5 MB)
learn/tutorial latest 8dbd9e392a96 2 months ago 131.5 MB (virtual 131.5 MB)
learn/ping latest effb66b31edb 10 minutes ago 11.57 MB (virtual 143.1 MB)
Run
這個指令主要用來執行image
裡面的指令,換句話說image
已經安裝ubuntu,就可以選擇目前已經安裝的指令去執行。
像是執行linux中,拿來下指令的bash
:1
sudo docker run -i -t ubuntu /bin/bash
執行之後就可以隨意在ubuntu下任何指令,像是常用的apt-get
,安裝一些web server,如apache、nginx等的。
若是要開一個常駐的程式,只要在run
加上-d
,此時docker執行的指令就會變成常駐程式。
例如執行一個無窮迴圈的shell:
1 | $JOB = $(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done") |
$JOB會取得到一個實際執行的
container id
。
如果要看到目前的執行狀況,可透過logs
這個指令:
1 | sudo docker logs $JOB |
要刪除這個只要透過剛剛取得的container id
即可:1
sudo docker kill $JOB
假設要開啟一個tcp的服務,可以在開啟的時候就輸入對內port號(docker開啟的ubuntu port):
1 | $JOB=$(sudo docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444) |
docker會將正在執行的port號,對應實體機器目前的port,例如docker中的4444 port,對到目前機器的127.0.0.1:49011(port範圍落在49000..49900)。
取得目前機器正在運行的port:1
PORT=$(sudo docker port $JOB 4444 | awk -F: '{ print $2 }')
利用實際的port將訊息丟到docker的container
中:1
echo hello world | nc 127.0.0.1 $PORT
在透過logs
查詢即可:1
echo "Daemon received: $(sudo docker logs $JOB)"
Commit
docker中運行到一半的container
,如果已經安裝或配置完畢,要保留目前的狀態,此時必須要把他存成一個image
。
先查詢目前的正在執行的container id
:
1 | sudo docker ps |
在commit
成image檔案:1
sudo docker commit fb66b3 nginx/ubuntu
若是忘記就離開container
也沒關係,可以透過ps -a
的指令找到:1
sudo docker ps -a
Exec
當你已經運行了一個docker image,此時可透過docker exec
進入到運行中的container。
1 | docker exec nginx/ubuntu /bin/sh |
Ps
查詢目前在正運行的container:1
sudo docker ps
輸入參數-a
,會將停止運行的container
一起顯示出來:1
sudo docker ps -a
Images
查詢目前擁有的images
檔案,像是透過pull
和自己commit
:1
sudo docker images
Inspect
如果要查詢正在運行的container資訊,可以透過inspect
,可以將目前container正在運行的資訊顯示出來,例如docker提供的虛擬的ip。
可以先透過sudo docker ps
查詢container id
,在執行inspect
:1
sudo docker inspect a5e78640ece4
Dockerfile
如果是要下一連串的指令,而且每次都必須去執行的話,可透過dockerfile
這個檔案,把你要執行的動作寫在上面,類似的案例像是,要佈署新版project時,那這時要做的可能是抓取project,執行一些build的動作,這時透過dockerfile
就可以一鍵執行完,而不需要每次登到container
中去修改。
首先要先建立一個,dockerfile
:
1 | # Nginx |
透過FROM
去決定執行哪個image
來源,然後可使用RUN
或CMD
,去對目前的image去執行目前的bash
指令。
執行dockerfile
裡面內容,其中-t
是要存的image
目標的名稱:1
sudo docker build -t shykes/myapp .
Export and import
如果要存成檔案可直接透過export
,要匯入則是import
。
將目前正在運行的container id
匯出成檔案:1
docker export a1bcbabsdhb323h2b > myfile.tar
import目前的檔案,存成image
來源:
1 | cat myfile.tar | docker import - newimagelocal |
還有滿多沒介紹的,例如push
可以發布自己的image
供其他人下載等的,有興趣可以深入研究。