Ubuntu 安裝 docker

1. Ubuntu獲取社區(qū)版docker(Docker CE锐涯,企業(yè)版Docker EE)

安裝Docker之前栗涂, 先確認(rèn)自己的機(jī)器是否滿(mǎn)足條件

前提條件

為了安裝Docker,你需要是Ubuntu任意64版本
輸入一下命令:

$ uname -a
Ubuntu版本

刪除之前的老版本

$ 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ù)組。官方文檔

  1. 創(chuàng)建 docker 用戶(hù)組槽华;

     $ sudo groupadd docker
    
  2. 將你的當(dāng)前用戶(hù)添加到 docker 用戶(hù)組壹蔓;(可能會(huì)失敗, 我在Azure上操作就報(bào)錯(cuò))

     $ sudo usermod -aG docker $USER
    
  3. 注銷(xiāo)之后重新登錄猫态, 使剛剛的權(quán)限設(shè)置生效佣蓉;

  4. 驗(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玖翅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子割以,更是在濱河造成了極大的恐慌金度,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件严沥,死亡現(xiàn)場(chǎng)離奇詭異猜极,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)消玄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)跟伏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丢胚,“玉大人,你說(shuō)我怎么就攤上這事受扳⌒辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵勘高,是天一觀的道長(zhǎng)峡蟋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)华望,這世上最難降的妖魔是什么蕊蝗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮立美,結(jié)果婚禮上匿又,老公的妹妹穿的比我還像新娘方灾。我一直安慰自己建蹄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布裕偿。 她就那樣靜靜地躺著洞慎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘿棘。 梳的紋絲不亂的頭發(fā)上劲腿,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音鸟妙,去河邊找鬼焦人。 笑死,一個(gè)胖子當(dāng)著我的面吹牛重父,可吹牛的內(nèi)容都是我干的花椭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼房午,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矿辽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起郭厌,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袋倔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后折柠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宾娜,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年扇售,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前塔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贾陷。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘱根,靈堂內(nèi)的尸體忽然破棺而出髓废,到底是詐尸還是另有隱情,我是刑警寧澤该抒,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布慌洪,位于F島的核電站,受9級(jí)特大地震影響凑保,放射性物質(zhì)發(fā)生泄漏冈爹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一欧引、第九天 我趴在偏房一處隱蔽的房頂上張望频伤。 院中可真熱鬧,春花似錦芝此、人聲如沸憋肖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岸更。三九已至,卻和暖如春膊升,著一層夾襖步出監(jiān)牢的瞬間怎炊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工廓译, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留评肆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓非区,卻偏偏與公主長(zhǎng)得像瓜挽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子院仿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件秸抚?Google Compute Engi...
    ahohoho閱讀 15,547評(píng)論 15 147
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,510評(píng)論 0 120
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,759評(píng)論 1 21
  • 夜雨急如潮 臥念 花消 清波照新影 風(fēng)度搖花高 悅鳥(niǎo)生欽意 舒客起離騷 一樹(shù)紅云展 他日鎖吾巢
    念觀詩(shī)詞文化閱讀 194評(píng)論 1 1
  • 本文目錄如下: 什么是 jQuery歹垫; 文檔就緒函數(shù)剥汤; 基本語(yǔ)法; 命名沖突問(wèn)題排惨。 什么是 jQuery吭敢? jQu...
    AshengTan閱讀 284評(píng)論 0 1