Docker簡明基礎教程
Docker是基於 Google 公司推出的 Go 語言實現。
首先,Docker 容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。
Docker的基本概念
Docker 包括三個基本概念
- 鏡像(Image)
- 容器(Container)
- 倉庫(Repository)
1. Docker鏡像
Docker 鏡像(Image)就是一個只讀的模板。鏡像可以用來創建 Docker 容器,鏡像與容器的關係就是程序與進程的關係。
2. Docker容器
容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
鏡像是隻讀的,容器在啓動的時候創建一層可寫層作爲最上層。
Docker倉庫
倉庫(Repository)是集中存放鏡像文件的場所。
Docker 目前只能安裝在 64 位平臺上,並且要求內核版本不低於 3.10,實際上內核越新越好,過低的內核版本容易造成功能的不穩定。
通過命令$ uname -a
或者cat /proc/version
查看內核版本。
爲非 root 用戶授權:
# 如果沒有就建立一個 Docker 組
$ sudo groupadd docker
# 增加一個用戶(用真實的名字替換下面的 ${USER})到 Docker 組,需重登陸來生效
$ sudo gpasswd -a ${USER} docker
# 重啓 Docker 服務
$ sudo service docker restart
獲取鏡像
可以使用 docker pull
命令來從倉庫獲取所需要的鏡像。
下面的例子將從 Docker Hub 倉庫下載一個 Ubuntu 12.04 操作系統的鏡像。
sudo docker pull ubuntu:12.04
這條命令實際上相當於:
$ sudo docker pull registry.hub.docker.com/ubuntu:12.04
即從註冊服務器 registry.hub.docker.com 中的 ubuntu 倉庫來下載標記爲 12.04 的鏡像。
完成後,即可隨時使用該鏡像了,例如創建一個容器,讓其中運行 bash 應用。
$ sudo docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#
使用 docker images
顯示本地已有的鏡像。
創建鏡像
使用下載的鏡像啓動容器:
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
對容器做一些改變,當結束後,我們使用 exit 來退出,使用 docker commit 命令來提交更新後的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;-a 可以指定更新的用戶信息;之後是用來創建鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 信息。創建成功後會返回這個鏡像的 ID 信息。其中-a就是author的意思。
再次docker images
就可以看到新的鏡像了。
利用 Dockerfile 來創建鏡像,Dockerfile 中每一條指令都創建鏡像的一層,例如:
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <[email protected]>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
編寫完成 Dockerfile 後可以使用 docker build 來生成鏡像。
$ sudo docker build -t="ouruser/sinatra:v2" .
其中 -t 標記來添加 tag,指定新的鏡像的用戶信息。 “.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換爲一個具體的 Dockerfile 的路徑。
此外,還可以利用 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"]
可以用 docker tag 命令來修改鏡像的標籤。
sudo docker tag 5db5f8471261 ouruser/sinatra:devel
其中5db5f8471261
是docker的commit ID。
從本地文件系統導入,下載了一個 ubuntu-14.04 的鏡像,之後使用以下命令導入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
保存和加載鏡像
如果要保存鏡像到本地文件,可以使用 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.04
可以使用 docker load 從導出的本地文件中再加載到本地鏡像庫,例如
$ sudo docker load --input ubuntu_14.04.tar
或者:
$ sudo docker load < ubuntu_14.04.tar
sava到本地的鏡像比export的要大,因爲save到本地的鏡像有歷史信息。
移除本地鏡像
如果要移除本地的鏡像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
在刪除鏡像之前要先用 docker rm 刪掉依賴於這個鏡像的所有容器。
清理所有未打過標籤的本地鏡像:
docker images 可以列出本地所有的鏡像,其中很可能會包含有很多中間狀態的未打過標籤的鏡像,大量佔據着磁盤空間。
使用下面的命令可以清理所有未打過標籤的本地鏡像
$ sudo docker rmi $(docker images -q -f "dangling=true")
Docker 容器
簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另外一個是將在終止狀態(stopped)的容器重新啓動。
新建並啓動:
所需要的命令主要爲 docker run。
啓動已終止容器:
可以利用 docker start 命令,直接將一個已經終止的容器啓動運行。
後臺(background)運行
對比容器後臺和前臺運行的差別:
$ sudo docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
容器會把輸出的結果(STDOUT)打印到宿主機上面
如果使用了 -d 參數運行容器。
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
此時容器會在後臺運行並不會把輸出的結果(STDOUT)打印到宿主機上面(輸出結果可以用docker logs 查看)。
容器是否會長久運行,是和docker run指定的運行命令有關,和 -d 參數無關
終止容器
可以使用 docker stop 來終止一個運行中的容器。
處於終止狀態的容器,可以通過 docker start 命令來重新啓動。
docker restart 命令會將一個運行態的容器終止,然後再重新啓動它。
進入容器
在使用 -d 參數時,容器啓動後會進入後臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。
$ 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:/#
導入導出容器
使用docker export 和docker import 命令。
用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息。
刪除容器
可以使用 docker rm 來刪除一個處於終止狀態的容器。 例如
$sudo docker rm trusting_newton
trusting_newton
如果要刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送 SIGKILL 信號給容器。
注意:docker images列表的是鏡像;docker ps -a列表的是容器。