1. 程式人生 > >手把手帶你體驗 Docker HelloWorld

手把手帶你體驗 Docker HelloWorld

課程目標

[ ]  Mac Pro 上如何安裝Docker

[ ]  概念:Docker 引擎,宿主機,映象(Image),容器(Container)

[ ]  在 Docker 上如何執行 Nginx

[ ]  容器的管理:檢視,進入,stop, start, restart, kill, 刪除

[ ] 怎麼釋出自己的一個 Docker Image ?

提醒:急速閱讀,請直接看第六節“總結(簡版操作)”,詳細閱讀請按序。

一、 Mac 上安裝Docker 

   關於mac下安裝docker,搜尋下會有一大堆,你只需瞭解4點:

   (1)最早最早Docker不能在mac下執行,只能在Linux執行;

   (2)過了不久,得安裝 boot2docker 就能在mac下跑docker;

   (3)再過了不久,來了個更簡單易用的 Docker Toolbox 就能在mac下跑docker;

   (4)到了現在,大概是2016年3月(記不清具體時間了),有了 Docker for mac 這種“三點兩不點”這樣傻瓜式的安裝包。

圖1:  Docker for mac 傻瓜式的安裝包

於是你需要做的是:

   (1)歷史的就讓它成為歷史,不要碰了。

   (2)下載個 Docker for mac , 儘管它是beta。但是,官方下載特別慢!請去網盤 https://pan.baidu.com/s/1i47ylkp   (無需提取密碼,100來兆)

   (3)能不能命令列? brew install docker ?  截止發稿不能,安裝出來的結果跟“docker for mac”的東西不一樣多。

提醒:

如果你的系統裡之前安裝過 virtualbox ,而且版本不夠高,docker for mac 會提示你必須“徹底刪除”,或者升級,才能安裝 docker for mac. 

二、概念:Docker 引擎,宿主機,映象(Image),容器(Container)

       安裝好了 docker for mac, 你的mac機器叫宿主機,執行著的那個帶介面的docker for mac 叫 Docker 引擎,也有命令列。比如:

$ docker images

就是檢視本地已經下載了多少映象(Image)。什麼是映象(Image)和容器(Container)呢?

docker與“映象”的關係,可以不嚴格但便於類比的理解為Linux的yum和軟體包(或者Mac的brew和軟體包,或者Maven的jar包)。

於是你可以聯想到:

$ docker images                顯示本地已下載的映象,類比 brew list;

$ docker inspect $image   顯示映象的詳細資訊,類比 brew info $some_app

$ docker search $image    搜尋某個映象,比如 nginx。 類比 brew search nginx

$ docker pull $image        下載某個映象,類比 brew install nginx

$ docker push $image      上傳某個映象。

問題來了,你可能發現,你執行 docker images 時,啥也沒有,因為你沒裝。你再發現 docker search nginx的時候,半天沒結果!!!

因為預設管理這些映象的倉庫(稱為 Docker Hub 或者 Docker registry 或者 Docker repository)在國外。

那麼國內有映象(Mirrors)站點嗎?

開啟 Docker for mac -> preference -> advanced ,如圖新增 Registry mirrors 。

另外,如果你上外網需要走代理伺服器,請設定代理伺服器,否則HTTP Proxy不必設定。

圖2:設定Docker Registry mirrorsApp

設定完後,你執行搜尋一下 nginx的映象,會顯示很多,排第一的是 daocloud.io 官方製作的。

$ docker search nginx

NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

nginx                     Official build of Nginx.                        4489      [OK]

jwilder/nginx-proxy       Automated Nginx reverse proxy for docker c...   848                  [OK]

……  此處省略很多行

接著,下載它,注意在前面新增 daocloud.io 字首。

$ docker pull daocloud.io/nginx

……

下載完成後,檢視一下:

$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

daocloud.io/nginx    latest              067c8da9d5ab        11 days ago         181.5 MB

截止現在,瞭解了什麼叫Image,但是什麼是容器(Container)呢? 我們執行一下剛才下載的nginx image就知道了。

三、在 Docker 上執行 Nginx

執行nginx很簡單,只需要 docker run daocloud.io/nginx 。

當然我們也可以更復雜一點,加點引數,比如:

$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

4871c4b47f830a73fa8133f125e63d4a5871dac3a887567d5eb54ea7f8d8ac6c

接著,

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   2 minutes ago       Up 2 minutes        443/tcp, 0.0.0.0:8080->80/tcp   hello world

命令docker ps 顯示的是正在執行的Container列表,裡面出現了剛才執行的nginx。於是可以把“容器(Container)”理解為映象(Image)的一次執行。

這個概念可以類比為“程序”與“程式”的關係。不信,你再看:

$ docker run --name helloworld2 -d -p 9090:80 daocloud.io/nginx

c1d93fbaa49ed16ce7da4cc90cbeba7f1279c15cf849dc5682d84985d3be3c3a

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   19 seconds ago      Up 18 seconds       443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        443/tcp, 0.0.0.0:8080->80/tcp   helloworld

出現了第2個Container,Command都是nginx -g ,名字一個叫helloworld,另一個叫helloworld2.

如何訪問它們呢?

$ curl http://localhost:8080

會顯示 “Welcome to nginx!” 的頁面。

$ curl http://localhost:9090

結果一樣,只是訪問了另外一個容器罷了。

你或許很著急希望知道:

(1)docker run的那些引數是什麼意思?

(2)怎麼看nginx的日誌呢?

以第一個命令:$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx 來說,”—name” 是給容器起了一個名字;-d 表示容器執行在後臺,如果前臺,用-i表示互動式;-p 8080:80 表示埠對映,將宿主機的8080埠轉發到容器內的80埠;daocloud.io/nginx 表示剛才下載的映象(Image)。

看日誌? 用命令,docker logs $container_id  或者 docker logs $container_name

➜  ~ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   8 minutes ago       Up 8 minutes        443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   15 minutes ago      Up 15 minutes       443/tcp, 0.0.0.0:8080->80/tcp   helloworld

➜  ~ docker logs 4871c4b47f83

172.17.0.1 - - [02/Nov/2016:13:04:16 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

172.17.0.1 - - [02/Nov/2016:13:05:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

➜  ~ docker logs helloworld

172.17.0.1 - - [02/Nov/2016:13:04:16 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

172.17.0.1 - - [02/Nov/2016:13:05:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" “-"

四、容器的管理:檢視,進入,stop, start, restart, kill, 刪除

檢視宿主機執行著多少個容器,剛才已經用到過 docker ps 命令。

進入容器內,用 docker attach helloworld命令。

$ docker attach helloworld

發現什麼動靜都沒有? 如果我們用curl 再訪問以下nginx 8080口子,進入容器的狀態下會出現一條日誌:

$ docker attach helloworld

172.17.0.1 - - [02/Nov/2016:13:18:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" “-"

如果我們要檢視容器內運行了哪些程序呢? 用 docker top $container  命令:

$ docker top helloworld

PID                 USER                TIME                COMMAND

1889                root                0:00                nginx: master process nginx -g daemon off;

1905                104                 0:00                nginx: worker process

停掉一個容器,可以用stop或kill,區別是stop是優雅關閉,可以做一些收尾工作,kill是強制關閉。

➜  ~ docker stop helloworld

helloworld

➜  ~ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   20 minutes ago      Up 20 minutes       443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

docker ps 顯示的是正在執行的容器,如果要顯示所有容器(包括停止執行的),需要docker ps -a 引數。

~ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   23 minutes ago      Up 23 minutes              443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   30 minutes ago      Exited (0) 3 minutes ago                                   hello world

如何再次啟動helloworld這個容器呢? 直接 docker start helloworld,並不需要像最開始那樣docker run了。

docker restart 和  kill 自行試試看。如果我們徹底不要hello world這個容器呢?用docker rm $container命令(執行的前提是容器先停止,或者-f強行刪除一個正在執行的容器)。

➜  ~ docker rm helloworld

helloworld

➜  ~ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   26 minutes ago      Up 26 minutes       443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

名字叫”helloworld”的容器再也不存在了。

五、釋出自己的一個 Docker Image 

時間不早了,下次再說吧~~

劇透下實驗內容,下載一個centos的映象,然後執行起來,進入這個容器,在容器內,就跟我們平時進入的centos作業系統沒啥區別。

不過這個簡單的centos容器裡面,什麼工具都沒有,比如常用的nc命令呀,curl命令呀,都沒有。我們會進入容器,在容器內手動安裝nc命令(當然也可以類似Linux的Bash一樣弄個指令碼,這指令碼叫Dockerfile )。

接著我們會想,我們不希望後來者這麼麻煩,需要手動安裝nc命令,能做到嗎?

可以。我們把安裝了nc命令的centos容器,儲存為一個映象,然後起個名字叫centos-with-nc,併發布到docker 倉庫,

後來者就可以下載並執行centos-with-nc這個映象了。他們進入容器時,就能直接用nc命令了。

六、總結(簡版操作)

[x]  Mac Pro 上如何安裝Docker

[ ]  概念:Docker 引擎,宿主機,映象(Image),容器(Container)

     $ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

     $ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   2 minutes ago       Up 2 minutes        443/tcp, 0.0.0.0:8080->80/tcp   hello world

mac 機器叫宿主機,docker命令工具集叫docker引擎,docker run 的daocloud.io/nginx 叫映象,docker ps列表顯示的叫容器。

[ ]  在 Docker 上如何執行 Nginx

   $ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

[ ]  容器的管理:檢視,進入,stop, start, restart, kill, 刪除

   檢視:docker ps  或 docker ps -a

   進入: docker attach $container

   docker start/stop/kill/restart/rm  $container 等

[ ] 怎麼釋出自己的一個 Docker Image ?

    下次再說

相關推薦

手把手體驗 Docker HelloWorld

課程目標[ ]  Mac Pro 上如何安裝Docker[ ]  概念:Docker 引擎,宿主機,映象(Image),容器(Container)[ ]  在 Docker 上如何執行 Nginx[ ]  容器的管理:檢視,進入,stop, start, restart, kill, 刪除[ ] 怎麼釋出自己

手把手體驗Stream流

前言 只有光頭才能變強。 文字已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇講解到了Lambda表示式的使用《最近學到的Lambda表示式基礎知識》,還沒看的同學可以先去閱讀一下哈~ 相信也有不少的同學想要知道:Lambda

手把手體驗鴻蒙 harmonyOS

wNlRGd.png 前言 本文已經收錄到我的 Github 個人部落格,歡迎大佬們光臨寒舍: 我的 GIthub 部落格 學習導圖 image.png 一、為什麼要嚐鮮 harmonyos? wNlfxI.png 9月10日,華為在 HDC 2020 大會上宣佈正式開源鴻蒙作業系統(Harm

手把手畫一個 時尚儀表盤 Android 自己定義View

androi alias 屬性 extend 三角函數 blank xutils content 還在 拿到美工效果圖。咱們程序猿就得畫得一模一樣。 為了不被老板噴,僅僅能多練啊。 聽說你認為前面幾篇都so easy,那今天就帶你做個相對照較復雜的。

別怕,手把手撕、拉、扯下SpringMVC的外衣

ons mvc springmvc test stp 實的 per war sdi 提到框架,就不得不提一下看源碼,我們平時總是想求大神帶我們飛,然而看源碼就是一個向大神學習的最直接的一種方式,然而我們每次鼓起勇氣看源碼前是這樣的但是一點開源碼,頓時代碼如洪流湧入,你的內心

Android性能優化:手把手全面了解 內存泄露 & 解決方案

new t 簡單介紹 新建 cti 接口 stat you bit ray . 簡介 即 ML (Memory Leak)指 程序在申請內存後,當該內存不需再使用 但 卻無法被釋放 & 歸還給 程序的現象2. 對應用程序的影響 容易使得應用程序發生內存溢出,即 OO

手把手入坑H5與小程序直播開發視頻課程直播的工作原理教程

直播 H5 微信 第1章 課程介紹對於課程整體以及直播行業的現狀進行介紹第2章 直播工作原理所謂知其然也要知其所以然,只會用別人總結好的東西很難有質的進步,只有深諳背後的工作原理才能進一步吃透到進階。本章從直播協議入手到工作原理詳解,步步為營,化繁為簡,極易吸收。第3章 Video詳解video

手把手擼一套Android簡易ORM框架

ORM概念 實體模型建立 註解列 ID 主鍵 自增長 資料表的列

手把手抓取智聯招聘的“資料分析師”崗位!

前言 很多網友在後臺跟我留言,是否可以分享一些爬蟲相關的文章,我便提供了我以前寫過的爬蟲文章的連結(如下連結所示),大家如果感興趣的話也可以去看一看哦。在本文中,我將以智聯招聘為例,分享一下如何抓取近5000條的資料分析崗資訊。 往期爬蟲連結 上海歷史天氣和空氣質量資料獲取(Pyth

手把手搭建百萬PV網站架構

簡介 PV( page view),即頁面瀏覽量,或點選量;通常是衡量一個網路新聞頻道或網站甚至一條網路新聞的主要指標。對PV的解釋是,一個訪問者在24小時(0點到24點)內到底看了你網站幾個頁面。這裡需要強調:同一個人瀏覽你網站同一個頁面,不重複計算PV量,點100次也算1次。說白了pV就是一個訪問者打開

手把手玩轉 Git

目前國內開發人員普遍都開始使用 Git 進行專案的版本管理,如果說你還在使用 SVN 並且對 Git 一無所知的話,那我的這個 Chat 將會幫助到你。 我將手把手教你入門,並且巡迴漸進的帶入到工作的實際應用中。 在本場 Chat 中我將分享: Git 由來和 Git 的作用以及 Git

Android:手把手 深入讀懂 Retrofit 2.0 原始碼

前言 在Android開發中,網路請求十分常用 而在Android網路請求庫中,Retrofit是當下最熱的一個網路請求庫 Github截圖 今天,我將手把手帶你深入剖析Retrofit v2.0的原始碼,希望你們會喜歡 請儘量在PC端

手把手做專案,3周學會小程式

初衷 自微信小程式出道以後不斷升溫,各行各業都在嘗試使用小程式。所以小編特此把自己編寫小程式過程中遇到的問題,心得,和技巧分享給大家,希望可以幫助在路上和準備上路的“碼”友。 “極客衝頂”是小編在業餘時間編寫的一款答題小程式,期間遇到了很多問題,特此歸納總結,做了一系列的文章分享給大家。為了大家更好的理解小

手把手打造一個 Android 熱修復框架(上篇)

本文來自網易雲社群作者:王晨彥前言熱修復和外掛化是目前 Android 領域很火熱的兩門技術,也是 Android 開發工程師必備的技能。目前比較流行的熱修復方案有微信的 Tinker,手淘的 Sophix,美團的 Robust,以及 QQ 空間熱修復方案。QQ 空間熱修復方

區塊鏈能養貓養狗了?!手把手復現AI+區塊鏈寫碼全過程!(附程式碼)

區塊鏈養貓養狗、區塊鏈遊戲、區塊鏈遊戲,區塊鏈旅遊……打著區塊鏈名頭的專案蜂擁上線。 如何將區塊鏈和AI兩種不同技術結合?如何在python中編寫工作證明演算法?一致性演算法有哪些? 雷鋒字幕組特別編譯了本期「區塊鏈一致性演算法和人工

現場玩轉兒IoT資料?百度雲手把手”!

話說,如今發展勢頭火熱的物聯網,其資料究竟有何special? 每分鐘數百萬條事件,還有大量間歇資料流? 時序資料是常態,還有可能出現“易逝”現象? 各種資料來源產生,從“感測器讀數”到“現場視訊流”簡直應有盡有? 好吧!如此看來,再加上日漸增長的互聯裝置,爆炸式擴容

手把手畫一個動態錯誤提示 Android自定義view

嗯。。再差1篇就可以獲得持之以恆徽章了,今天帶大家畫一個比較簡單的view。 轉載請註明出處:http://blog.csdn.net/wingichoy/article/details/50477108 廢話不多說,看效果圖: 首先 建構函式 測量... 這裡就一筆帶

一個炫字都不夠??!!!手把手打造3D自定義view

分享一則最近流行的笑話: 最新科學研究表明:寒冷可以使人保持年輕,樓下的王大爺表示雖然今年已經60多歲了,但是仍然冷的跟孫子一樣。 呃。好吧,這個冬天確實有點冷,在廣州活生生的把我這個原生北方人,凍成一條狗。(研究表明:寒冷可以讓人類基因突變。。。。)

手把手畫一個 時尚儀表盤 Android 自定義View

拿到美工效果圖,咱們程式設計師就得畫得一模一樣。 為了不被老闆噴,只能多練啊。 聽說你覺得前面幾篇都so easy,那今天就帶你做個相對比較複雜的。 轉載請註明出處:http://blog.csdn.net/wingichoy/article/details/50468

Swift-->R.swift體驗Android中R類的便利

安裝需要2點: 1:需要執行一段指令碼 "$PODS_ROOT/R.swift/rswift" "$SRCROOT" 2:指令碼生成的檔案R.generated.swift,需要複製到專案中, 這樣才能愉快的使用R.swift 使