在第一章介紹Docker架構時,我們介紹過Docker中鏡像和容器的關系。
我們再復習一遍,鏡像是模板,容器是具體實例。用Java語言中的概念來理解就是:鏡像是類,容器是對象。
So,當我們創建一個容器時,需要從鏡像倉庫中選擇自己需要的鏡像,然后創建容器並使用。當然,如果現有鏡像沒有能滿足我們需求的,我們也可以自己定義鏡像,再用自己的鏡像創建容器並使用。
首先我們講,用現有鏡像創建容器,並使用它。
使用現有鏡像創建容器的命令是:
docker run ubuntu:15.10
docker:是我們剛安裝好的docker軟件。
run:是docker的指令,表示啟動一個容器。
ubuntu:15.10:是鏡像名稱,表示我們要使用這個鏡像來啟動容器。Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。
注意:docker默認鏡像倉庫是官方的,在國外速度比較慢。我們可以修改倉庫,使用國內的。
修改鏡像倉庫:
編輯/etc/docker/daemon.json,如果不存在則創建:
vi /etc/docker/daemon.json
內容如下:
{ "registry-mirrors":[ "https://registry.docker-cn.com" ] }
修改保存,之后要重啟docker服務:
1 service docker restart
然后可以查看下變化,執行docker info命令,可以看到Registry Mirrors下已經有了我們剛配置的地址。
這里的registry-mirrors是一個數組,可以設置多個url,這里的https://registry.docker-cn.com是docker官方國內地址。還可以設置其他源:
Docker中國區官方鏡像
https://registry.docker-cn.com
網易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中國科技大學
https://docker.mirrors.ustc.edu.cn
ok,我們來使用現有鏡像啟動容器:
docker run ubuntu:15.10
不報錯就是啟動成功了。通過docker ps命令可以看到正在運行的容器:
docker ps
這里會顯示一個空列表,因為我們的容器ubuntu:15.10什么都沒做,所以進程就結束了,容器則關閉了。
我們可以通過docker ps -a命令看到已經關閉的容器:
docker ps -a
這樣就能看到剛才啟動過的容器了,在"created"字段可以看到容器創建的時間,“status”可以看到容器目前的狀態。
我們可以讓容器做點事,讓它別那么快結束:
docker run ubuntu:15.10 nohup sleep 10>/dev/null &
這里我們在容器中執行了sleep命令,然后再通過docker ps查看docker進程,就可以看到了:
container id:容器id,每次啟動容器時分配。
image:鏡像名稱。
command:當前運行的進程,一般指主進程,如果該主進程又啟動了其他子進程,不會顯示。
created:創建時間。
status:當前狀態。
ports:容器的端口信息和使用的連接類型(tcp\udp)
names:自動分配的容器名稱。
這里我們只sleep了10秒,10秒后在看docker ps就沒有了,用docker ps -a可以看到狀態是Exited。已停止。
我們也可以進入容器中,進入容器有四種方式:
1、使用docker attach命令進入容器
在容器運行5,通過docker ps查看容器的container id,使用命令進入容器:
docker attach 容器id
這種方式類似於共享屏幕,也就是我們可以看到當前運行容器的程序和輸出,但是我們對當前容器的操作也會影響到正在運行的程序。如果多個用戶使用docker attach進入同一個容器,那么他們之間的操作是會相互影響的,可以看到其他人的操作。如果其中一個用戶運行阻塞操作,那么其他用戶就會被阻塞不能操作。
2、容器內部運行ssh服務,外部通過ssh登錄進容器
但是不建議這么操作,請參考:https://www.oschina.net/translate/why-you-dont-need-to-run-sshd-in-docker?cmp
3、使用nsenter進入Docker容器
拿到docker容器進程的真實pid,使用nsenter進入進程命名空間。
4、使用docker exec進入容器
這個命令可以使用-it參數打開輸入輸出交互,然后運行/bin/bash,就啟動了一個新shell,可以看到正在運行的程序,進行其他操作也不會影響到其他進入的用戶。和ssh效果類似,每個用戶都會啟動一個shell進程。
docker exec -it 容器id /bin/bash
除了上面這4種,還有一種更加便捷的,就是在啟動容器時進入:
docker run -i -t ubuntu:15.10 /bin/bash
這樣,就是在啟動容器時,直接進入容器中,效果和docker exec類似。
至此,我們就講完了使用現有鏡像創建容器並進入容器查看和交互。
接下來,看如何創建自定義鏡像,並啟動。