一次較為完整的Docker入門之旅

1. 構建你的Docker環(huán)境(最復雜的問題要用最簡單的方式來解決)

  • Docker是一個對于開發(fā)者和系統(tǒng)管理員用容器去開發(fā)稽穆,部署和運行應用程序的一個平臺。

  • Docker非常流行的幾個因素

    • Flexible(靈活的)
    • Lightweight(輕量級的)
    • Interchangeable(可互換的赶撰,可交替的)
    • Portable(便攜的)
    • Scalable(可擴展的)
    • Stackable(易疊起堆放的舌镶;可疊起堆放的)
  • 鏡像和容器


    一張圖說清楚鏡像和容器的關系
    • 鏡像
      A container is launched by running an image.鏡像就是一個可執(zhí)行的包柱彻,這個包中有程序運行的所有條件,代碼餐胀,依賴的jar包哟楷,環(huán)境變量,配置文件否灾。
    • 容器
      容器是一個運行的鏡像實例吓蘑。你可以使用命令docker ps去查看正在運行的容器。
    • 容器和虛擬機的差別


      容器和虛擬機的差別
    • 較虛擬機而言坟冲,Docker將會更加省內(nèi)存基于上圖。因為虛擬機是邏輯上的一臺機器溃蔫,它共享宿主機器的硬件資源健提。
  • Docker的Cli命令簡介

    [root~]# docker
    Usage:  docker COMMAND
    A self-sufficient runtime for containers
    Options:
    --config string      Location of client config files (default "/root/.docker")
    -D, --debug              Enable debug mode
    -H, --host list          Daemon socket(s) to connect to
    -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
    --tls                Use TLS; implied by --tlsverify
    --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
    --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
    --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
    --tlsverify          Use TLS and verify the remote
    -v, --version            Print version information and quit
    
    Management Commands:
    config      Manage Docker configs
    container   Manage containers
    image       Manage images
    network     Manage networks
    node        Manage Swarm nodes
    plugin      Manage plugins
    secret      Manage Docker secrets
    service     Manage services
    swarm       Manage Swarm
    system      Manage Docker
    trust       Manage trust on Docker images
    volume      Manage volumes
    
    Commands:
    attach      Attach local standard input, output, and error streams to a running container
    build       Build an image from a Dockerfile
    commit      Create a new image from a container's changes
    cp          Copy files/folders between a container and the local filesystem
    create      Create a new container
    diff        Inspect changes to files or directories on a container's filesystem
    events      Get real time events from the server
    exec        Run a command in a running container
    export      Export a container's filesystem as a tar archive
    history     Show the history of an image
    images      List images
    import      Import the contents from a tarball to create a filesystem image
    info        Display system-wide information
    inspect     Return low-level information on Docker objects
    kill        Kill one or more running containers
    load        Load an image from a tar archive or STDIN
    login       Log in to a Docker registry
    logout      Log out from a Docker registry
    logs        Fetch the logs of a container
    pause       Pause all processes within one or more containers
    port        List port mappings or a specific mapping for the container
    ps          List containers
    pull        Pull an image or a repository from a registry
    push        Push an image or a repository to a registry
    rename      Rename a container
    restart     Restart one or more containers
    rm          Remove one or more containers
    rmi         Remove one or more images
    run         Run a command in a new container
    save        Save one or more images to a tar archive (streamed to STDOUT by default)
    search      Search the Docker Hub for images
    start       Start one or more stopped containers
    stats       Display a live stream of container(s) resource usage statistics
    stop        Stop one or more running containers
    tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
    top         Display the running processes of a container
    unpause     Unpause all processes within one or more containers
    update      Update configuration of one or more containers
    version     Show the Docker version information
    wait        Block until one or more containers stop, then print their exit codes
    
    Run 'docker COMMAND --help' for more information on a command.
    

小結

以上是通過運行docker打印出來的所有有關docker的命令。如果想了解具體某部分的命令伟叛,比如私痹,我現(xiàn)在想了解鏡像相關的命令,可以輸入docker image,這樣在命令行中就會輸出與鏡像相關的命令统刮。如果對于某個命令有疑問紊遵,可以使用docker image build --help進行命令的查詢,在Linux世界中侥蒙,對于不會的命令暗膜,或第一次遇到的命令,可以找man鞭衩,在Docker中就可以找help了学搜,一切help

  • Docker的版本等相關命令

    #查看Docker的版本
    docker --version
    Docker version 18.03.1-ce, build 9ee9f40
    #查看跟多的信息
    docker version
    Client:
     Version:      18.03.1-ce
     API version:  1.37
     Go version:   go1.9.5
     Git commit:   9ee9f40
     Built:        Thu Apr 26 07:20:16 2018
     OS/Arch:      linux/amd64
     Experimental: false
     Orchestrator: swarm
    
    Server:
     Engine:
      Version:      18.03.1-ce
      API version:  1.37 (minimum version 1.12)
      Go version:   go1.9.5
      Git commit:   9ee9f40
      Built:        Thu Apr 26 07:23:58 2018
      OS/Arch:      linux/amd64
      Experimental: false
    
     #查看Docker一些詳細信息
     docker info
     Containers: 3
     Running: 0
     Paused: 0
     Stopped: 3
     Images: 2
     Server Version: 18.03.1-ce
     Storage Driver: overlay2
     Backing Filesystem: extfs
     Supports d_type: true
     Native Overlay Diff: true
     Logging Driver: json-file
     Cgroup Driver: cgroupfs
     Plugins:
     Volume: local
     Network: bridge host macvlan null overlay
     Log: awslogs fluentd gcplogs gelf journald json-file logentries 
     splunk syslog
     Swarm: inactive
     Runtimes: runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version:         
     773c489c9c1b21a6d78b5c538cd395416ec50f88
     runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
     init version: 949e6fa
     Security Options:
     seccomp
     Profile: default
     Kernel Version: 3.10.0-693.2.2.el7.x86_64
     Operating System: CentOS Linux 7 (Core)
     OSType: linux
     Architecture: x86_64
     CPUs: 1
     Total Memory: 992.3MiB
     Name: iz2ze6jeqopgq9yoosls6dz
     ID:UIVR:2YDB:XRFJ:PUFM:WFJH:NZVN:LCSM:W7AI:BNLA:RBED:T7RJ:I22F
     Docker Root Dir: /var/lib/docker
     Debug Mode (client): false
     Debug Mode (server): false
     Registry: https://index.docker.io/v1/
     Labels:
     Experimental: false
     Insecure Registries:
     127.0.0.0/8
     Live Restore Enabled: false
     
     #Docker hello world
     docker run hello-world
     #列出下載到本機上的所有鏡像文件
     docker image ls
     #遇到不會的命令怎么辦呢论衍?
     docker container --help
    

2. 構建一個鏡像并且作為容器運行

  • 方便攜帶的鏡像是由一個叫做Dockerfile這個文件定義的瑞佩。

  • 創(chuàng)建一個Dockerfile文件

    • 首先創(chuàng)建一個路徑containers

    • cd進入這個路徑cd containers

    • 創(chuàng)建一個Dockerfile文件

      # Use an official Python runtime as a parent image
      # 從python:2.7-slim這個鏡像基礎之上創(chuàng)建的鏡像, FROM命令可以多次使用
      FROM python:2.7-slim
      
      # Set the working directory to /app
      WORKDIR /app
      
      # Copy the current directory contents into the container at /app
      ADD . /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"]
      
    • Docker提供一種自動化的方式來創(chuàng)建鏡像--Dockerfile坯台。Dockerfile包含了創(chuàng)建鏡像所需要的全部命令炬丸。Docker支持如下語法命令:

      # 指令要大寫根據(jù)命名規(guī)約
      INSTRUCTION argument
      
    • 有趣的Dockerfile命令

      • FROM:基于某個鏡像去構建

        FROM ubuntu //基于ubuntu的鏡像來構建。
        
      • MAINTAINER:鏡像的維護者

        MAINTAINER mark // 鏡像的作者mark
        
      • RUN:在Shell或exec環(huán)境下執(zhí)行命令蜒蕾。這個命令會在新創(chuàng)建的鏡像上添加新的層面(layer), RUN指令會在shell里使用命令包裝器/bin/sh -c來執(zhí)行稠炬。

        RUN pip install --trusted-host pypi.python.org -r requirements.txt
        
      • ADD:復制文件指令。有兩個參數(shù)src和destinction咪啡。destinction是容器內(nèi)的路徑酸纲。src是URL或啟動配置上下文的一個文件。

        ADD . /app
        
      • CMD:提供容器默認的執(zhí)行命令瑟匆。只允許使用一次闽坡。

        CMD ["python", "app.py"]
        
      • EXPOSE:暴露容器在Docker虛擬機內(nèi)部運行時的監(jiān)聽端口栽惶。

        EXPOSE 8080
        
      • ENTRYPOINT:配置給容器一個可執(zhí)行的命令。這意味著在每次使用鏡像創(chuàng)建一個容器時一個特定的應用程序可以被設置成默認程序疾嗅。同時也意味著該鏡像被調用時只能運行指定的程序外厂。類似CMD,只允許一個ENTRYPOINT,如果多個出現(xiàn),以最后一個命令為準代承。

        ENTRYPOINT ['executable', 'param1', 'param2']
        
      • WORKDIR:指命令RUN, CMDENTRYPOINT的工作目錄汁蝶。

        WORKDIR /app
        
      • ENV:設置環(huán)境變量,使用key-value的方式

        ENV NAME World
        
      • USER:鏡像運行時設置一個UID.

        USER mark
        
      • VOLUME:授權訪問容器內(nèi)到主機上的目錄论悴。

        VOLUME ['/data']
        
    • 在同一路徑下創(chuàng)建另外兩個文件掖棉,requirements.txtapp.py

      • 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)
        
    • 構建應用
      docker build -t friendlyhello .

      執(zhí)行完后的結果圖

    • 查看本地鏡像文件
      docker image ls

    • 運行自己制作的docker鏡像
      docker run friendlyhello/docker run -p 4000:80 friendlyhello
      運行結果如圖所示

      返回結果

    • 將鏡像起個別名膀估,準備上傳到Docker Hub
      docker tag friendlyhello gordon/get-started:part2
      docker push username/repository:tag

  • 本小節(jié)常用的命令

    docker build -t friendlyhello .  # Create image using this       
    directory's Dockerfile
    docker run -p 4000:80 friendlyhello  # Run "friendlyname" 
    mapping port 4000 to 80
    docker run -d -p 4000:80 friendlyhello  # Same thing, but in detached mode
    docker container ls   # List all running containers
    docker container ls -a    # List all containers, even those not running
    docker container stop <hash>   # Gracefully stop the specified container
    docker container kill <hash>    # Force shutdown of the specified container
    docker container rm <hash>   # Remove specified container from this machine
    docker container rm $(docker container ls -a -q) # Remove all containers
    docker image ls -a  # List all images on this machine
    docker image rm <image id> # Remove specified image from this machine
    docker image rm $(docker image ls -a -q)   # Remove all images from this machine
    docker login # Log in this CLI session using your Docker credentials
    docker tag <image> username/repository:tag  # Tag <image> for upload to registry
    docker push username/repository:tag # Upload tagged image to registry
    docker run username/repository:tag  # Run image from a registry
    

3. 擴展您的應用程序以運行多個容器

  • 拆分應用并實現(xiàn)負載均衡幔亥,我們必須在分布式應用程序的層次結構中提升一個級別:服務。

  • 在分布式應用中, 會根據(jù)不同的業(yè)務劃分不同的模塊察纯,實現(xiàn)不同的功能帕棉。拆分服務比較容易,通過寫docker-compose.yml文件來實現(xiàn)饼记。docker-compose.yml是一個YAML文件香伴,定義了Docker容器在生產(chǎn)中的表現(xiàn)。

  • docker-compose.yml

    version: "3"
    services:
        web:
          # replace username/repo:tag with your name and image details
          image: username/repo:tag
          deploy:
            replicas: 5
            resources:
              limits:
                cpus: "0.1"
                memory: 50M
              restart_policy:
                condition: on-failure
          ports:
            - "4000:80"
          networks:
            - webnet
    networks:
      webnet:
    
  • 這個文件告訴Docker要做下面的事情具则。

    • 在Docker Hub上面拉取鏡像
    • 運行5個從Docker Hub上面下載下來的鏡像實例作為一個web服務即纲。限制每個都要被用到,最多10%的CPU資源和50M的內(nèi)存資源博肋。
    • 如果一個停止或者fail掉的話崇裁,立即重新啟動。
    • 通過主機上的4000端口和Docker中容器container進行綁定束昵。
    • 通知web容器共享端口80通過負載均衡網(wǎng)絡被稱為webnet拔稳。
    • 用默認的方式定義webnet網(wǎng)絡(負載均衡的覆蓋網(wǎng)絡)。
  • 運行負載均衡app

    • 第一步首先運行docker swarm init
      first step
    • 第二步運行docker stack deploy -c docker-compose.yml getstartedlab
      second step
    • 第三步docker service ls
      third_step
    • 第四步docker service ps helloworld_web
      fourth step
    • 第五步docker container ls -q
      fifth step
    • 第六步curl http://localhost:4000
      sixth step
  • 擴展你的應用
    通過修改docker-compose.yml文件中replicas值來擴展你的應用锹雏,然后運行命令docker stack deploy -c docker-compose.yml getstartedlab

4. 在群集中分發(fā)您的應用

  • 你部署一個應用到一個集群巴比,在多臺機器上運行。多容器礁遵,多機器的應用通過加入更多的機器來進行Dockerized集群的制作轻绞,被稱為Swarm

  • 一個swarm是一群運行在Docker上機器成為一個集群佣耐。一個swarm開始后政勃,你可以運行你熟悉的Docker命令。但他們現(xiàn)在被一個swarm manager在一個集群上執(zhí)行兼砖。在swarm中的機器可以是物理機器也可以是虛擬機奸远。加入swarm后既棺,他們被稱為節(jié)點。

  • swarm manager運行集群的兩種策略:

    • emptiest node
    • global
  • swarm manager是唯一一臺可以執(zhí)行命令懒叛,授權其他機器一worker的角色加入swarm丸冕。worker僅僅可以提供容量并且沒有權限告訴其他機器,他們能做或不能做什么薛窥。

  • 直到現(xiàn)在胖烛,你一直用你的Docker以單主機的模式在本地運行。Docker也可以切換到swarm mode模式诅迷。

  • 建立你的swarm

    • 一個swarm有多個節(jié)點構成佩番。節(jié)點可以是物理節(jié)點,也可以是虛擬節(jié)點罢杉√宋罚可以使用命令docker swarm init開啟swarm模式并且是自己的機器成為swarm manager。然后運行命令docker swarm join在其他的機器上屑那,使其加入swarm成為worker。現(xiàn)在我們使用虛擬機創(chuàng)建兩臺機器的集群艘款,然后創(chuàng)建好的兩臺機器添加到swarm中持际。虛擬機可以使用win10的Hyper-v或者使用VirtualBox來搭建。在使用Docker Toolbox前哗咆,一定要保證VirtualBox已經(jīng)安裝了蜘欲。
  • 現(xiàn)在用命令docker-machineVirtualBox driver來創(chuàng)建一對虛擬機。

    docker-machine create --driver virtualbox myvm1
    docker-machine create --driver virtualbox myvm2
    
  • 列出虛擬機并且得到他們的IP地址晌柬,使用命令docker-machine ls姥份。

5. 通過添加后端數(shù)據(jù)庫來堆棧服務

6. 將您的應用部署到生產(chǎn)環(huán)境

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市年碘,隨后出現(xiàn)的幾起案子澈歉,更是在濱河造成了極大的恐慌,老刑警劉巖屿衅,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埃难,死亡現(xiàn)場離奇詭異,居然都是意外死亡涤久,警方通過查閱死者的電腦和手機涡尘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來响迂,“玉大人考抄,你說我怎么就攤上這事≌嵬” “怎么了川梅?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵疯兼,是天一觀的道長。 經(jīng)常有香客問我挑势,道長镇防,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任潮饱,我火速辦了婚禮来氧,結果婚禮上,老公的妹妹穿的比我還像新娘香拉。我一直安慰自己啦扬,他們只是感情好,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布凫碌。 她就那樣靜靜地躺著扑毡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盛险。 梳的紋絲不亂的頭發(fā)上瞄摊,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機與錄音苦掘,去河邊找鬼换帜。 笑死,一個胖子當著我的面吹牛鹤啡,可吹牛的內(nèi)容都是我干的惯驼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼递瑰,長吁一口氣:“原來是場噩夢啊……” “哼祟牲!你這毒婦竟也來了?” 一聲冷哼從身側響起抖部,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤说贝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慎颗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狂丝,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年哗总,在試婚紗的時候發(fā)現(xiàn)自己被綠了几颜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡讯屈,死狀恐怖蛋哭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涮母,我是刑警寧澤谆趾,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布躁愿,位于F島的核電站,受9級特大地震影響沪蓬,放射性物質發(fā)生泄漏彤钟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一跷叉、第九天 我趴在偏房一處隱蔽的房頂上張望逸雹。 院中可真熱鬧,春花似錦云挟、人聲如沸梆砸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帖世。三九已至,卻和暖如春沸枯,著一層夾襖步出監(jiān)牢的瞬間日矫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工绑榴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哪轿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓彭沼,卻偏偏與公主長得像缔逛,于是被迫代替她去往敵國和親备埃。 傳聞我的和親對象是個殘疾皇子姓惑,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

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