Docker快速入門

什么是Docker


Docker 是一個開源的應用容器引擎搁进,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux機器上,也可以實現(xiàn)虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口妻怎。

Docker和虛擬機最大的區(qū)別就是, Docker引擎是基于本地硬件的, Docker在本地硬件的基礎上運行一個Docker引擎, 然后基于該引擎創(chuàng)建相互隔離的環(huán)境, 在每個環(huán)境中運行各自的軟件, 互不影響, 如下圖所示。



Docker的組成


簡單來說,Docker是由鏡像, 倉庫, 容器組成
我們從倉庫(repository)下載鏡像(image), 然后通創(chuàng)建基于該鏡像的容器(container), 之后在容器中運行程序赞弥。


Docker鏡像的存儲方式


Docker鏡像是-分層存儲的, 我們安裝不同的軟件就相當于在鏡像中添加一層, 比如我們安裝一個linux, 這image就增加一層linux, 我們安裝一個apache tomcat, 鏡像中就新添加一層tomcat, 我們不但可以添加層, 還可以控制每層的元素。


Docker容器


Docker容器就相當于基于docker鏡像創(chuàng)建的環(huán)境中的一個進程, 每個容器之間是隔離的, 互相不影響, 只要我們使用的是同一個鏡像, 那么創(chuàng)建出來的容器的環(huán)境就是相同的, 這樣就保證了我們環(huán)境的統(tǒng)一性。

當我們創(chuàng)建一個容器, 就相當于在鏡像的最上面又增加了一個可讀可寫的層, 由于鏡像是只讀的, 所以我們對容器進行任何操作都不會影響到鏡像, 這就是Docker可以保證環(huán)境的統(tǒng)一性的原因嫁艇。


Docker倉庫


Docker倉庫就是存儲和管理鏡像的一個遠程服務器, 我們可以像倉庫中上傳我們自己的鏡像, 也可以下載別人創(chuàng)建好的鏡像。

Docker安裝


window和mac請直接在官網(wǎng)下載Docker客戶端, 下面我們用ubuntu為例, 來說明Docker的安裝

ubuntu
apt-get update
apt-get install -y docker.io
或者使用下列命令從docker.com獲取最新版本的安裝包自動安裝
curl -s https://get.docker.com | sh

安裝完成后使用下面命令查看版本
docker version

如果能看到版本說明安裝成功, 之后用下面的命令啟動docker服務
service docker start


第一個Docker容器


  1. 執(zhí)行下面命令從Docker官網(wǎng)獲取一個指定的鏡像
    docker pull [options] name[:tags]
    這里我們獲取一個叫hello-world的鏡像
    docker pull hello-world

  2. 使用下列命令查看本機鏡像
    docker images [options] [repository[:tag]]
    這里我們查看本機所有image
    docker imagesdocker image ls
    我們會看到以下內(nèi)容

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
hello-world         latest              326387cea398

  1. 使用下列命令創(chuàng)建一個容器
    docker run [options] imageName[:tag] [command] [args]
    這里我們只創(chuàng)建一個基于hello-world鏡像的容器, 不做任何操作
    docker run hello-world

通過上面的三步, 我們就創(chuàng)建了一個Docker容器

  1. 刪除容器
    docker container rm -r containerId

  2. 刪除鏡像
    docker rm imageId

實踐: 運行一個Nginx容器

運行Nginx容器時, 我們主要有以下三點要求:

  • 持久化運行容器
  • 后臺運行
  • 進入容器內(nèi)執(zhí)行操作
  1. 從倉庫下載Nginx鏡像
    docker pull nginx

  2. 運行Nginx容器, -d參數(shù)可以運行并返回容器的id, 用這種方式啟動的容器是后臺啟動的, 通過這種方式運行的容器, 會開一個持續(xù)運行的進程
    docker run -d -p 9999:80 nginx

  3. 查看正在運行的容器
    docker ps

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                 PORTS
1fa4ab2cf395        nginx       "ngix -g deamon of ..."     28 seconds ago       Up 2 minutes          0.0.0.0:9999->80/tcp

我們可以看到正在運行的容器的id, 端口映射, 運行狀態(tài)等信息

我們可以用下面的方法停止一個運行的容器
docker container containerId stopdocker stop containerId
同樣我們也可以打開指定的容器
docker container containerId startdocker start containerId

下面的命令可以查看本機所有容器, 包括正在運行的和沒有運行的
docker container ls -a

  1. 進入正在運行的指定容器中
    docker exec -it containerId command
    比如我們要使用bash進入當前正在運行的那個id為f1fa4ab2cf395的容器中, 這里id只輸入前幾位就行了
    docker exec -it 1fa4ab bash

通過上面這些命令, 我們就可以操作一個真實的nginx容器, 并將容器的80端口映射到我們電腦的4000端口上, 這樣我們就可以通過本機的9999端口訪問容器的80端口了

  1. 我們訪問本地的localhost:9999就會打開一個nginx頁面, 這就說明我們的容器創(chuàng)建并運行成功了


Docker容器的網(wǎng)絡


由于Docker的隔離性, 因此默認情況下Docker的網(wǎng)絡也是被隔離的, 我們需要對Docker的網(wǎng)絡進行一些配置, 才可以實現(xiàn)網(wǎng)絡通信

Docker網(wǎng)絡類型

  • Bridge 橋接模式
    默認模式, 也叫映射模式, 在橋接模式下, 容器擁有自己的網(wǎng)卡和ip及端口號, 容器通過虛擬的網(wǎng)橋和主機的網(wǎng)卡進行映射, 從而實現(xiàn)和外界通信, 默認情況下, 由于我們沒有設置映射關系, 所以docker不知道容器應該通過哪個端口來和主機映射, 所以默認情況下是沒有辦法訪問docker的網(wǎng)絡的
  • Host 主機模式
    docker容器和主機共用網(wǎng)絡, 容器內(nèi)看到的網(wǎng)卡就是主機的網(wǎng)卡
  • None 隔離模式
    不能訪問網(wǎng)絡

我們可以通過以下命令創(chuàng)建并后臺啟動一個配置映射的容器
docker run -d -p hostIp:containerIp imageName

創(chuàng)建后我們可以在本機上輸入下列命令看主機的對應端口是否被監(jiān)聽, 如果已經(jīng)被監(jiān)聽, 就說明我們創(chuàng)建映成功了
netstat -na | grep hostIp

通過上面的步驟我們就創(chuàng)建了一個可以網(wǎng)絡通信的Docker容器


Docker鏡像的創(chuàng)建


Docker鏡像的創(chuàng)建基于Dockerfile這個文件, 我們通過在該文件中配置, 然后就可以創(chuàng)建我們自己的容器了, 這里我們按照Docker官網(wǎng)的事例來一步一步創(chuàng)建自己的容器

  1. 創(chuàng)建一個目錄, 進入該目錄中, 在該目錄中創(chuàng)建一個Dockerfile文件
    Dockerfile
# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]
  1. 根據(jù)上面的文件描述, 我們需要一個requirements.txt來定義python安裝的依賴, 還需要一個app.py文件保存我們的代碼, 因此我們需要創(chuàng)建這兩個文件
    requirements.txt
Flask
Redis

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

這時我們的文件夾中應該有以下三個文件

$ ls
Dockerfile      app.py          requirements.txt
  1. 在本地創(chuàng)建Docker鏡像, 并用--tag命令為該鏡像命名和標簽
docker build --tag=friendlyhello .

創(chuàng)建后我們就會看到類似下面的文件, 這樣就說明我們本地創(chuàng)建鏡像成功了,

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398
  1. 之后我們就可以按照之前我們學過的命令創(chuàng)建容器和端口映射, 運行容器了
docker run -d -p 4000:80 friendlyhello
  1. 用瀏覽器訪問localhost:4000, 如果看到下面的頁面, 就說明我們?nèi)萜鲃?chuàng)建成功了


?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末为鳄,一起剝皮案震驚了整個濱河市裳仆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孤钦,老刑警劉巖歧斟,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偏形,居然都是意外死亡静袖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門俊扭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來队橙,“玉大人,你說我怎么就攤上這事【杩担” “怎么了仇矾?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長解总。 經(jīng)常有香客問我贮匕,道長,這世上最難降的妖魔是什么花枫? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任刻盐,我火速辦了婚禮,結果婚禮上劳翰,老公的妹妹穿的比我還像新娘敦锌。我一直安慰自己,他們只是感情好佳簸,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布乙墙。 她就那樣靜靜地躺著,像睡著了一般溺蕉。 火紅的嫁衣襯著肌膚如雪伶丐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天疯特,我揣著相機與錄音哗魂,去河邊找鬼。 笑死漓雅,一個胖子當著我的面吹牛录别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻吞,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼组题,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抱冷?” 一聲冷哼從身側響起崔列,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旺遮,沒想到半個月后赵讯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡耿眉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年边翼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸣剪。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡组底,死狀恐怖丈积,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情债鸡,我是刑警寧澤江滨,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厌均,受9級特大地震影響牙寞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜莫秆,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悔详。 院中可真熱鬧镊屎,春花似錦、人聲如沸茄螃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽归苍。三九已至用狱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拼弃,已是汗流浹背夏伊。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吻氧,地道東北人溺忧。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像盯孙,于是被迫代替她去往敵國和親鲁森。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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

  • 一振惰、概述 Docker is the world’s leading software container pla...
    凜_冬_將_至閱讀 294評論 0 0
  • docker底層原理 1.簡介 Docker是一個開源的容器引擎歌溉,它基于LXC容器技術,使用Go語言開發(fā)骑晶。源代碼托...
    大金葉子閱讀 604評論 0 0
  • Docker是什么 Docker 是一個開源的應用容器引擎痛垛,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器...
    beyound87閱讀 311評論 0 1
  • docker已經(jīng)是一年前的時候學習的了,當時透罢,不會go語言榜晦。工作中一直沒有使用,已經(jīng)忘光了羽圃。在放假前乾胶,sdk那邊說...
    若與閱讀 1,385評論 2 15
  • 生活中不難聽到媽媽們?nèi)逡蝗簝扇艘欢训挠懻撛鯓咏鉀Q孩子不愛吃飯的問題识窿,為了讓寶寶多吃一口斩郎,爸爸媽媽變著花樣的給孩子...
    GJ張大芳閱讀 256評論 0 3