1. Ubuntu獲取社區(qū)版docker(Docker CE锐涯,企業(yè)版Docker EE)
安裝Docker之前栗涂, 先確認(rèn)自己的機(jī)器是否滿(mǎn)足條件
前提條件
為了安裝Docker,你需要是Ubuntu任意64版本
輸入一下命令:
$ uname -a
刪除之前的老版本
$ sudo apt-get remove docker docker-engine docker.io
安裝Docker CE
$ sudo apt-get update # 1. 更新源
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common ## 允許apt通過(guò)HTTPS安裝工具包
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
## 3. 添加Docker的官方 GPG key
現(xiàn)在依啰, 驗(yàn)證一下你已經(jīng)擁有GPG Key:
$ sudo apt-key fingerprint 0EBFCD88
>>>>>>>>>>>>>>>>>>>>>
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
添加docker庫(kù)到apt源:
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
執(zhí)行安裝:
$ sudo apt-get update
$ sudo apt-get install docker-ce
生產(chǎn)環(huán)境需要固定安裝某一版本奋献,而不是安裝最新版本, 需要使用
sudo apt-get install docker-ce=<VERSION>
測(cè)試Docker安裝是否正確
sudo docker run hello-world
這條命令下載了一個(gè)測(cè)試鏡像凡傅, 并且把它運(yùn)行在一個(gè)docker容器里辟狈, 這個(gè)容器打印出一條信息就退出了。
你也可以輸入:
$ sudo docker version
# 或者
$ sudo docker info
查看docker的相關(guān)版本信息
2. Docker配置
Docker 需要用戶(hù)具有 sudo 權(quán)限夏跷,為了避免每次命令都輸入sudo哼转,可以把用戶(hù)加入 Docker 用戶(hù)組。官方文檔
-
創(chuàng)建
docker
用戶(hù)組槽华;$ sudo groupadd docker
-
將你的當(dāng)前用戶(hù)添加到
docker
用戶(hù)組壹蔓;(可能會(huì)失敗, 我在Azure上操作就報(bào)錯(cuò))$ sudo usermod -aG docker $USER
注銷(xiāo)之后重新登錄猫态, 使剛剛的權(quán)限設(shè)置生效佣蓉;
-
驗(yàn)證權(quán)限,這次不再需要
sudo
開(kāi)頭了亲雪。$ docker run hello-world
啟動(dòng)docker服務(wù)
命令行運(yùn)行docker命令的時(shí)候勇凭,需要本機(jī)有 Docker 服務(wù)。如果這項(xiàng)服務(wù)沒(méi)有啟動(dòng)义辕,可以用下面的命令啟動(dòng)
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker
3. image文件
Docker 把應(yīng)用程序及其依賴(lài)虾标,打包在 image 文件里面。只有通過(guò)這個(gè)文件灌砖,才能生成 Docker 容器璧函。image 文件可以看作是容器的模板。Docker 根據(jù) image 文件生成容器的實(shí)例基显。同一個(gè) image 文件蘸吓,可以生成多個(gè)同時(shí)運(yùn)行的容器實(shí)例。
image 是二進(jìn)制文件续镇。實(shí)際開(kāi)發(fā)中美澳,一個(gè) image 文件往往通過(guò)繼承另一個(gè) image 文件销部,加上一些個(gè)性化設(shè)置而生成摸航。舉例來(lái)說(shuō)制跟,你可以在 Ubuntu 的 image 基礎(chǔ)上,往里面加入 Apache 服務(wù)器酱虎,形成你的 image雨膨。
# 列出本機(jī)的所有 image 文件。
$ docker image ls
# 刪除 image 文件
$ docker image rm [imageName]
image 文件是通用的读串,一臺(tái)機(jī)器的 image 文件拷貝到另一臺(tái)機(jī)器聊记,照樣可以使用。一般來(lái)說(shuō)恢暖,為了節(jié)省時(shí)間排监,我們應(yīng)該盡量使用別人制作好的 image 文件,而不是自己制作杰捂。即使要定制舆床,也應(yīng)該基于別人的 image 文件進(jìn)行加工,而不是從零開(kāi)始制作嫁佳。
為了方便共享挨队,image 文件制作完成后,可以上傳到網(wǎng)上的倉(cāng)庫(kù)蒿往。Docker 的官方倉(cāng)庫(kù) Docker Hub 是最重要盛垦、最常用的 image 倉(cāng)庫(kù)。此外瓤漏,出售自己制作的 image 文件也是可以的腾夯。
4. 運(yùn)行簡(jiǎn)單實(shí)例 hello world
首先,運(yùn)行下面的命令蔬充,將 image 文件從倉(cāng)庫(kù)抓取到本地
docker image pull library/hello-world
Docker 官方提供的 image 文件俯在,都放在library
組里面
現(xiàn)在本地可以看到這個(gè)hello-world鏡像
$ docker image ls
運(yùn)行鏡像
$ docker container run hello-world
如果運(yùn)行成功,你會(huì)在屏幕上讀到下面的輸出娃惯。
Hello from Docker!
This message shows that your installation appears to be working correctly.
輸出這段提示以后跷乐,hello world就會(huì)停止運(yùn)行,容器自動(dòng)終止趾浅。
有些容器不會(huì)自動(dòng)終止愕提,因?yàn)樘峁┑氖欠?wù)。比如皿哨,安裝運(yùn)行 Ubuntu 的 image浅侨,就可以在命令行體驗(yàn) Ubuntu 系統(tǒng)。
> $ docker container run -it ubuntu bash
對(duì)于那些不會(huì)自動(dòng)終止的容器证膨,必須使用docker container kill
命令手動(dòng)終止如输。
$ docker container kill [containID]
5. 容器文件
image 文件生成的容器實(shí)例,本身也是一個(gè)文件,稱(chēng)為容器文件不见。也就是說(shuō)澳化,一旦容器生成,就會(huì)同時(shí)存在兩個(gè)文件: image 文件和容器文件稳吮。而且關(guān)閉容器并不會(huì)刪除容器文件缎谷,只是容器停止運(yùn)行而已。
# 列出本機(jī)正在運(yùn)行的容器
$ docker container ls
# 列出本機(jī)所有容器灶似,包括終止運(yùn)行的容器
$ docker container ls --all
如果擔(dān)心容器文件占據(jù)空間列林, 可以使用 docker container rm [containerID]
命令刪除
6. 制作自己的Docker容器
下面以阮一峰大師的koa-demos 項(xiàng)目為例,介紹怎么寫(xiě) Dockerfile 文件酪惭,實(shí)現(xiàn)讓用戶(hù)在 Docker 容器里面運(yùn)行 Koa 框架希痴。
作為準(zhǔn)備工作,請(qǐng)先下載源碼春感。
$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos
編寫(xiě)Dockerfile文件
首先润梯,在項(xiàng)目的根目錄下,新建一個(gè)文本文件.dockerignore
,寫(xiě)入下面的內(nèi)容。
.git
node_modules
npm-debug.log
上面代碼表示闪幽,這三個(gè)路徑要排除单芜,不要打包進(jìn)入 image 文件。如果你沒(méi)有路徑要排除,這個(gè)文件可以不新建。
然后,在項(xiàng)目的根目錄下竟纳,新建一個(gè)文本文件 Dockerfile,寫(xiě)入下面的內(nèi)容疚鲤。
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
上面代碼一共五行锥累,含義如下。
-
FROM node:8.4
:該 image 文件繼承官方的 node image集歇,冒號(hào)表示標(biāo)簽桶略,這里標(biāo)簽是8.4
,即8.4版本的 node诲宇。 -
COPY . /app
:將當(dāng)前目錄下的所有文件(除了.dockerignore
排除的路徑)际歼,都拷貝進(jìn)入 image 文件的/app
目錄。 -
WORKDIR /app
:指定接下來(lái)的工作路徑為/app
姑蓝。 -
RUN npm install
:在/app
目錄下鹅心,運(yùn)行npm install
命令安裝依賴(lài)。注意纺荧,安裝后所有的依賴(lài)旭愧,都將打包進(jìn)入 image 文件颅筋。 -
EXPOSE 3000
:將容器 3000 端口暴露出來(lái), 允許外部連接這個(gè)端口输枯。
創(chuàng)建 image 文件
有了 Dockerfile 文件以后议泵,就可以使用docker image build命令創(chuàng)建 image 文件了。
$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .
上面代碼中用押,-t參數(shù)用來(lái)指定 image 文件的名字肢簿,后面還可以用冒號(hào)指定標(biāo)簽靶剑。如果不指定蜻拨,默認(rèn)的標(biāo)簽就是latest。最后的那個(gè)點(diǎn)表示 Dockerfile 文件所在的路徑桩引,上例是當(dāng)前路徑缎讼,所以是一個(gè)點(diǎn)。
如果運(yùn)行成功坑匠,就可以看到新生成的 image 文件koa-demo
了血崭。
$ docker image ls
生成容器
docker container run命令會(huì)從 image 文件生成容器。
$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# 或者
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
上面命令的各個(gè)參數(shù)含義如下:
-
-p參數(shù)
:容器的 3000 端口映射到本機(jī)的 8000 端口厘灼。 -
-it參數(shù)
:容器的 Shell 映射到當(dāng)前的 Shell夹纫,然后你在本機(jī)窗口輸入的命令,就會(huì)傳入容器设凹。 -
koa-demo:0.0.1
:image 文件的名字(如果有標(biāo)簽舰讹,還需要提供標(biāo)簽,默認(rèn)是 latest 標(biāo)簽)闪朱。 -
/bin/bash
:容器啟動(dòng)以后月匣,內(nèi)部第一個(gè)執(zhí)行的命令。這里是啟動(dòng) Bash奋姿,保證用戶(hù)可以使用 Shell锄开。
如果一切正常,運(yùn)行上面的命令以后称诗,就會(huì)返回一個(gè)命令行提示符萍悴。
root@66d80f4aaf1e:/app#
這表示你已經(jīng)在容器里面了,返回的提示符就是容器內(nèi)部的 Shell 提示符寓免。執(zhí)行下面的命令退腥。
root@66d80f4aaf1e:/app# node demos/01.js
這時(shí),Koa 框架已經(jīng)運(yùn)行起來(lái)了再榄。打開(kāi)本機(jī)的瀏覽器狡刘,訪問(wèn) http://127.0.0.1:8000,網(wǎng)頁(yè)顯示"Not Found"困鸥,這是因?yàn)檫@個(gè) demo沒(méi)有寫(xiě)路由嗅蔬。
這個(gè)例子中剑按,Node 進(jìn)程運(yùn)行在 Docker 容器的虛擬環(huán)境里面,進(jìn)程接觸到的文件系統(tǒng)和網(wǎng)絡(luò)接口都是虛擬的澜术,與本機(jī)的文件系統(tǒng)和網(wǎng)絡(luò)接口是隔離的艺蝴,因此需要定義容器與物理機(jī)的端口映射(map)。
CMD命令
上一節(jié)的例子里面鸟废,容器啟動(dòng)以后猜敢,需要手動(dòng)輸入命令node demos/01.js。我們可以把這個(gè)命令寫(xiě)在 Dockerfile 里面盒延,這樣容器啟動(dòng)以后缩擂,這個(gè)命令就已經(jīng)執(zhí)行了,不用再手動(dòng)輸入了添寺。
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
上面的 Dockerfile 里面胯盯,多了最后一行CMD node demos/01.js,它表示容器啟動(dòng)后自動(dòng)執(zhí)行node demos/01.js计露。
你可能會(huì)問(wèn)博脑,RUN命令與CMD命令的區(qū)別在哪里?簡(jiǎn)單說(shuō)票罐,RUN命令在 image 文件的構(gòu)建階段執(zhí)行叉趣,執(zhí)行結(jié)果都會(huì)打包進(jìn)入 image 文件;CMD命令則是在容器啟動(dòng)后執(zhí)行该押。另外疗杉,一個(gè) Dockerfile 可以包含多個(gè)RUN命令,但是只能有一個(gè)CMD命令沈善。
注意乡数,指定了CMD命令以后,docker container run
命令就不能附加命令了(比如前面的/bin/bash)闻牡,否則它會(huì)覆蓋CMD命令【桓埃現(xiàn)在,啟動(dòng)容器可以使用下面的命令罩润。
$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1