docker第一次使用記錄

安裝docker

去官網(wǎng)上下載對(duì)應(yīng)的

第一次使用

  1. 查看版本
$ docker --version

Docker version 18.06.1-ce, build e68fc7a
  1. 查看docker信息
$ docker info

Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 18.06.1-ce
...
  1. hello world

運(yùn)行 hello-world 鏡像,如果沒(méi)有則下載并運(yùn)行

$ docker run hello-world

latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
  1. 查看鏡像
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        7 weeks ago         1.84kB
  1. 查看容器

如果容器還在運(yùn)行,就不需要--all參數(shù)

$ docker container ls --all

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
d2479723dcd4        hello-world         "/hello"            4 hours ago         Exited (0) 4 hours ago                       hardcore_cori

通過(guò)Dockerfile 來(lái)定義容器

Dockerfile

創(chuàng)建一個(gè)目錄,在此目錄下新建一個(gè)Dockerfile文件

# 將官方 Python 運(yùn)行時(shí)用作父鏡像
FROM python:2.7-slim

# 將工作目錄設(shè)置為 /app
WORKDIR /app

# 將當(dāng)前目錄內(nèi)容復(fù)制到位于 /app 中的容器中
ADD . /app

# 安裝 requirements.txt 中指定的任何所需軟件包
RUN pip install -r requirements.txt

# 使端口 80 可供此容器外的環(huán)境使用
EXPOSE 80

# 定義環(huán)境變量
ENV NAME World

# 在容器啟動(dòng)時(shí)運(yùn)行 app.py
CMD ["python", "app.py"]

其中涉及應(yīng)用的文件還未創(chuàng)建

應(yīng)用文件

  1. requirements.txt
Flask
Redis
  1. 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)

構(gòu)建應(yīng)用

  1. 查看應(yīng)用目錄
$ ls

Dockerfile      app.py          requirements.txt
  1. 運(yùn)行構(gòu)建命令祸泪,創(chuàng)建Docker鏡像,使用-t對(duì)鏡像起別名
$ docker build -t friendlyhello
  1. 查看構(gòu)建好的鏡像
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
friendlyhello       latest              4e3e33fac3e2        21 minutes ago      131MB
python              2.7-slim            99079b24ed51        7 days ago          120MB
hello-world         latest              fce289e99eb9        7 weeks ago         1.84kB

運(yùn)行應(yīng)用

正常模式

  1. 運(yùn)行應(yīng)用,使用-p將本機(jī)的4000端口映射到容器向外暴露的80端口
$ docker run -p 4000:80 friendlyhello
  1. 瀏覽器訪問(wèn) http://localhost:4000或者使用curl
$ curl http://localhost:4000

<h3>Hello World!</h3><b>Hostname:</b> 65c750525420<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
  1. 終止應(yīng)用CTRL+C

分離模式

  1. 通過(guò)-d將docker啟動(dòng)的應(yīng)用在后臺(tái)運(yùn)行
$ docker run -d -p 4000:80 friendlyhello

63463f542b5c6dd2aa2840a1798272d4934982b3fdc2277befe5c6221e9a6c4d

返回的是應(yīng)用的容器完整ID

  1. 查看應(yīng)用
$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
7bfc58a8896a        friendlyhello       "python app.py"     3 seconds ago       Up 2 seconds        0.0.0.0:4001->80/tcp   heuristic_galileo

CONTAINER ID 與 頁(yè)面上顯示的Hostname值一致

  1. 終止應(yīng)用

docker stop 根據(jù) CONTAINER ID去終止應(yīng)用

$ docker stop 7bfc58a8896a

將應(yīng)用推送到鏡像庫(kù)

Docker Hub地址

  1. 本機(jī)登錄
docker login
  1. 標(biāo)記鏡像

docker tag image username/repository:tag

$ docker tag friendlyhello zsq/hello-world:first
  1. 查看標(biāo)記鏡像
$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
friendlyhello        latest              4e3e33fac3e2        2 hours ago         131MB
zsq/hello-world      first               4e3e33fac3e2        2 hours ago         131MB
python               2.7-slim            99079b24ed51        7 days ago          120MB
hello-world          latest              fce289e99eb9        7 weeks ago         1.84kB
...

4.發(fā)布鏡像

$ docker push zsq/hello-world:first
  1. 從遠(yuǎn)程鏡像庫(kù)拉取到本地并運(yùn)行鏡像

如果存在直接運(yùn)行饰序,否則將從遠(yuǎn)程拉取并運(yùn)行

$ docker run -p 4000:80 zsq/hello-world:first

相關(guān)命令

docker build -t friendlyname .# 使用此目錄的 Dockerfile 創(chuàng)建鏡像
docker run -p 4000:80 friendlyname  # 運(yùn)行端口 4000 到 90 的“友好名稱(chēng)”映射
docker run -d -p 4000:80 friendlyname         # 內(nèi)容相同,但在分離模式下
docker ps                                 # 查看所有正在運(yùn)行的容器的列表
docker stop <hash>                     # 平穩(wěn)地停止指定的容器
docker ps -a           # 查看所有容器的列表规哪,甚至包含未運(yùn)行的容器
docker kill <hash>                   # 強(qiáng)制關(guān)閉指定的容器
docker rm <hash>              # 從此機(jī)器中刪除指定的容器
docker rm $(docker ps -a -q)           # 從此機(jī)器中刪除所有容器
docker images -a                               # 顯示此機(jī)器上的所有鏡像
docker rmi <imagename>            # 從此機(jī)器中刪除指定的鏡像
docker rmi $(docker images -q)             # 從此機(jī)器中刪除所有鏡像
docker login             # 使用您的 Docker 憑證登錄此 CLI 會(huì)話
docker tag <image> username/repository:tag  # 標(biāo)記 <image> 以上傳到鏡像庫(kù)
docker push username/repository:tag            # 將已標(biāo)記的鏡像上傳到鏡像庫(kù)
docker run username/repository:tag                   # 運(yùn)行鏡像庫(kù)中的鏡像

服務(wù)

服務(wù)是“生產(chǎn)中的容器”求豫,一般一項(xiàng)服務(wù)僅運(yùn)行一個(gè)鏡像,但是可以對(duì)該鏡像啟用負(fù)載均衡

docker-compose.yml

定義诉稍、運(yùn)行和擴(kuò)展docker蝠嘉,也就是定義Docker容器在生產(chǎn)環(huán)境中的行為

version: "3"
services:
  web:
    # 將 username/repo:tag 替換為您的名稱(chēng)和鏡像詳細(xì)信息
    image: username/repository:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:
  1. 將 Compose 文件設(shè)置為 version:"3"。本質(zhì)上杯巨,這會(huì)使其兼容 swarm mode蚤告。
  2. 從鏡像庫(kù)中拉取指定鏡像。
  3. 將鏡像分為5個(gè)web運(yùn)行服爷,每個(gè)實(shí)例限制最多使用10%的CPU和50MB的RAM杜恰。
  4. 如果某個(gè)容器發(fā)生錯(cuò)誤,立即重啟容器仍源。
  5. 將主機(jī)上的4000端口映射到docker(web)的80端口心褐。
  6. 使用默認(rèn)設(shè)置定義webnet網(wǎng)絡(luò)(此為負(fù)載均衡的overlay網(wǎng)絡(luò))

運(yùn)行服務(wù)

  1. 開(kāi)啟swarm管理節(jié)點(diǎn)
$ docker swarm init

如果沒(méi)有執(zhí)行過(guò)docker swarm init,將報(bào)this node is not a swarm manager

  1. 運(yùn)行應(yīng)用
$ docker stack deploy -c docker-compose.yml getstartedlab

Creating network getstartedlab_webnet
Creating service getstartedlab_web

getstartedlab為服務(wù)的別名

  1. 查看服務(wù)中容器的列表
$ docker stack ps getstartedlab

ID                  NAME                  IMAGE                  NODE                    DESIRED STATE       CURRENT STATE                ERROR               PORTS
kpdbgnl2p7yb        getstartedlab_web.1   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
k6uqshqqfxkz        getstartedlab_web.2   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
vfn8ys8cpkc3        getstartedlab_web.3   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
4wtvs8qqxnul        getstartedlab_web.4   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
bb2w7co8x3br        getstartedlab_web.5   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago

此時(shí)笼踩,web應(yīng)用已經(jīng)實(shí)現(xiàn)負(fù)載均衡了逗爹,通過(guò)http://localhost:4000可以看到每次刷新后容器ID都會(huì)發(fā)生改變,每次請(qǐng)求嚎于,將以循環(huán)方式選擇5個(gè)從節(jié)點(diǎn)之一做出響應(yīng)

  1. 查看服務(wù)
$ docker stack services getstartedlab

ID                  NAME                MODE                REPLICAS            IMAGE                  PORTS
tc12dkx8copc        getstartedlab_web   replicated          5/5                 zsq/one:1              *:4001->80/tcp
  1. 擴(kuò)展服務(wù)

可以將docker-compose.yml中的replicas值改為2掘而,重新運(yùn)行docker stack deploy命令來(lái)擴(kuò)展,無(wú)需事先清除技術(shù)椮倚瘢或者終止容器

$ docker stack deploy -c docker-compose.yml getstartedlab

Updating service getstartedlab_web (id: tc12dkx8copcgy09dmng5h7z7)

再次查看容器列表镣屹,可以看到已經(jīng)移除了3個(gè)

$ docker stack ps getstartedlab

ID                  NAME                  IMAGE                  NODE                    DESIRED STATE       CURRENT STATE                ERROR               PORTS
nhyp01413tb9        getstartedlab_web.1   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
1zwklq2rbkpo        getstartedlab_web.2   zsq/one:1              linuxkit-025000000001   Running             Running about a minute ago
42xx8qkib6hh        getstartedlab_web.3   zsq/one:1              linuxkit-025000000001   Remove              Running 14 seconds ago
jkua7sao1m6g        getstartedlab_web.4   zsq/one:1              linuxkit-025000000001   Remove              Running 14 seconds ago
8r39nv3q7dyb        getstartedlab_web.5   zsq/one:1              linuxkit-025000000001   Remove              Running 14 seconds ago
  1. 清除服務(wù)應(yīng)用
$ docker stack rm getstartedlab

Removing service getstartedlab_web
Removing network getstartedlab_webnet

但是單節(jié)點(diǎn)swarm仍在運(yùn)行

  1. 清除swarm

先查看下,是否在運(yùn)行

$ docker node ls

ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
89zkmhm6eqgjsigjzr71q4661 *   linuxkit-025000000001   Ready               Active              Leader              18.06.1-ce

清除swarm

$ docker swarm leave --force

Node left the swarm.

相關(guān)命令


docker stack ls              # 列出此 Docker 主機(jī)上所有正在運(yùn)行的應(yīng)用
docker stack deploy -c <composefile> <appname>  # 運(yùn)行指定的 Compose 文件
docker stack services <appname>       # 列出與應(yīng)用關(guān)聯(lián)的服務(wù)
docker stack ps <appname>   # 列出與應(yīng)用關(guān)聯(lián)的正在運(yùn)行的容器
docker stack rm <appname>                             # 清除應(yīng)用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末价涝,一起剝皮案震驚了整個(gè)濱河市女蜈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖伪窖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逸寓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡覆山,警方通過(guò)查閱死者的電腦和手機(jī)竹伸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)簇宽,“玉大人勋篓,你說(shuō)我怎么就攤上這事∥焊睿” “怎么了譬嚣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钞它。 經(jīng)常有香客問(wèn)我拜银,道長(zhǎng),這世上最難降的妖魔是什么遭垛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任尼桶,我火速辦了婚禮,結(jié)果婚禮上锯仪,老公的妹妹穿的比我還像新娘泵督。我一直安慰自己,他們只是感情好卵酪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布幌蚊。 她就那樣靜靜地躺著,像睡著了一般溃卡。 火紅的嫁衣襯著肌膚如雪溢豆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天瘸羡,我揣著相機(jī)與錄音漩仙,去河邊找鬼。 笑死犹赖,一個(gè)胖子當(dāng)著我的面吹牛队他,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峻村,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼麸折,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了粘昨?” 一聲冷哼從身側(cè)響起垢啼,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窜锯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芭析,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锚扎,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年馁启,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驾孔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惯疙,死狀恐怖翠勉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霉颠,我是刑警寧澤眉菱,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站掉分,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏克伊。R本人自食惡果不足惜酥郭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愿吹。 院中可真熱鬧不从,春花似錦、人聲如沸犁跪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坷衍。三九已至寝优,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枫耳,已是汗流浹背乏矾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迁杨,地道東北人钻心。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铅协,于是被迫代替她去往敵國(guó)和親捷沸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359