Docker从入门到实践笔记(一)
為什么80%的碼農都做不了架構師?>>> ??
1. 修改已有鏡像
先使用下載的鏡像啟動容器。
$ sudo docker run -t -i training/sinatra /bin/bash root@0b2616b0e5a8:/#在容器中添加 json 和 gem 兩個應用。
root@0b2616b0e5a8:/# gem install json當結束后,我們使用 exit 來退出,現在我們的容器已經被我們改變了,使用docker commit命令來提交更新后的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c其中,-m來指定提交的說明信息,跟我們使用的版本控制工具一樣;-a可以指定更新的用戶信息;之后是用來創建鏡像的容器的 ID;最后指定目標鏡像的倉庫名和 tag 信息。創建成功后會返回這個鏡像的 ID 信息。
使用docker images來查看新創建的鏡像。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB之后,可以使用新的鏡像來啟動容器
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root@78e82f680994:/#2. 利用 Dockerfile 來創建鏡像
使用docker commit來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享。我們可以使用docker build來創建一個新的鏡像。為此,首先需要創建一個 Dockerfile,包含一些如何創建鏡像的指令。
新建一個目錄和一個 Dockerfile
$ mkdir sinatra $ cd sinatra $ touch DockerfileDockerfile 中每一條指令都創建鏡像的一層,例如:
# This is a comment FROM ubuntu:14.04 MAINTAINER Docker Newbee <newbee@docker.com> RUN apt-get -qq update RUN apt-get -qqy install ruby ruby-dev RUN gem install sinatraDockerfile 基本的語法是
- 使用#來注釋
- FROM指令告訴 Docker 使用哪個鏡像作為基礎
- 接著是維護者的信息
- RUN開頭的指令會在創建中運行,比如安裝一個軟件包,在這里使用 apt-get 來安裝了一些軟件
編寫完成 Dockerfile 后可以使用docker build來生成鏡像。
$ sudo docker build -t="ouruser/sinatra:v2" . 其中-t標記來添加 tag,指定新的鏡像的用戶信息。 “.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑。*注意一個鏡像不能超過 127 層
此外,還可以利用ADD命令復制本地文件到鏡像;用EXPOSE命令來向外部開放端口;用CMD命令來描述容器啟動后運行的程序等。例如
# put my local web site in myApp folder to /var/www ADD myApp /var/www # expose httpd port EXPOSE 80 # the command to run CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]現在可以利用新創建的鏡像來啟動一個容器。
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root@8196968dac35:/#還可以用docker tag命令來修改鏡像的標簽。
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel $ sudo docker images ouruser/sinatra REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB*注:更多用法,請參考 Dockerfile 章節。
3. 存出鏡像
如果要導出鏡像到本地文件,可以使用docker save命令。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB ... $sudo docker save -o ubuntu_14.04.tar ubuntu:14.044. 載入鏡像
可以使用docker load從導出的本地文件中再導入到本地鏡像庫,例如
$ sudo docker load --input ubuntu_14.04.tar或
$ sudo docker load < ubuntu_14.04.tar這將導入鏡像以及其相關的元數據信息(包括標簽等)。
5. 移除本地鏡像
如果要移除本地的鏡像,可以使用docker rmi命令。注意docker rm命令是移除容器。
$ sudo docker rmi training/sinatra*注意:在刪除鏡像之前要先用docker rm刪掉依賴于這個鏡像的所有容器。
6. 新建并啟動
所需要的命令主要為docker run。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash root@af8bae53bdd3:/#其中,-t選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上,-i則讓容器的標準輸入保持打開。
當利用docker run來創建容器時,Docker 在后臺運行的標準操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創建并啟動一個容器
- 分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
- 從地址池配置一個 ip 地址給容器
- 執行用戶指定的應用程序
- 執行完畢后容器被終止
7. 啟動已終止容器
可以利用docker start命令,直接將一個已經終止的容器啟動運行。
容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其它的資源。可以在偽終端中利用ps或top來查看進程信息。
root@ba267838cc1b:/# psPID TTY TIME CMD1 ? 00:00:00 bash11 ? 00:00:00 ps可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。
8. 守護態運行
更多的時候,需要讓 Docker 容器在后臺以守護態(Daemonized)形式運行。此時,可以通過添加-d參數來實現。
例如下面的命令會在后臺運行容器。
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147容器啟動后會返回一個唯一的 id,也可以通過docker ps命令來查看容器信息。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage要獲取容器的輸出信息,可以通過docker logs命令。
$ sudo docker logs insane_babbage hello world hello world hello world . . .9. 終止容器
可以使用docker stop來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。 例如對于上一章節中只啟動了一個終端的容器,用戶通過exit命令或Ctrl+d來退出終端時,所創建的容器立刻終止。
終止狀態的容器可以用docker ps -a命令看到。例如
sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton 98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike處于終止狀態的容器,可以通過docker start命令來重新啟動。
此外,docker restart命令會將一個運行態的容器終止,然后再重新啟動它。
10. attach 命令進入容器
docker attach是Docker自帶的命令。下面示例如何使用該命令。
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia $sudo docker attach nostalgic_hypatia root@243c32535da7:/#但是使用attach命令有時候并不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。
11. 導出和導入容器
導出容器
如果要導出本地某個容器,可以使用docker export命令。
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test $ sudo docker export 7691a814370e > ubuntu.tar這樣將導出容器快照到本地文件。
導入容器快照
可以使用docker import從容器快照文件中再導入為鏡像,例如
$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB此外,也可以通過指定 URL 或者某個目錄來導入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo*注:用戶既可以使用docker load來導入鏡像存儲文件到本地鏡像庫,也可以使用docker import來導入一個容器快照到本地鏡像庫。這兩者的區別在于容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。
12. 刪除容器
可以使用docker rm來刪除一個處于終止狀態的容器。 例如
$sudo docker rm trusting_newton trusting_newton如果要刪除一個運行中的容器,可以添加-f參數。Docker 會發送SIGKILL信號給容器。
轉載于:https://my.oschina.net/renguijiayi/blog/353835
總結
以上是生活随笔為你收集整理的Docker从入门到实践笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox OS, 向jQuery中
- 下一篇: 怎样在谷歌浏览器上加载金山词霸的取词插件