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

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

  • Docker是一個對于開發者和系統管理員用容器去開發,部署和運行應用程序的一個平臺。

  • Docker非常流行的幾個因素

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


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


      容器和虛擬機的差別
    • 較虛擬機而言,Docker將會更加省內存基于上圖。因為虛擬機是邏輯上的一臺機器,它共享宿主機器的硬件資源。
  • 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的命令。如果想了解具體某部分的命令,比如,我現在想了解鏡像相關的命令,可以輸入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這個文件定義的。

  • 創建一個Dockerfile文件

    • 首先創建一個路徑containers

    • cd進入這個路徑cd containers

    • 創建一個Dockerfile文件

      # Use an official Python runtime as a parent image
      # 從python:2.7-slim這個鏡像基礎之上創建的鏡像, 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提供一種自動化的方式來創建鏡像--DockerfileDockerfile包含了創建鏡像所需要的全部命令。Docker支持如下語法命令:

      # 指令要大寫根據命名規約
      INSTRUCTION argument
      
    • 有趣的Dockerfile命令

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

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

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

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

        ADD . /app
        
      • CMD:提供容器默認的執行命令。只允許使用一次。

        CMD ["python", "app.py"]
        
      • EXPOSE:暴露容器在Docker虛擬機內部運行時的監聽端口。

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

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

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

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

        USER mark
        
      • VOLUME:授權訪問容器內到主機上的目錄。

        VOLUME ['/data']
        
    • 在同一路徑下創建另外兩個文件,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 .

      執行完后的結果圖

    • 查看本地鏡像文件
      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

  • 本小節常用的命令

    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. 擴展您的應用程序以運行多個容器

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

  • 在分布式應用中, 會根據不同的業務劃分不同的模塊,實現不同的功能。拆分服務比較容易,通過寫docker-compose.yml文件來實現。docker-compose.yml是一個YAML文件,定義了Docker容器在生產中的表現。

  • 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的內存資源。
    • 如果一個停止或者fail掉的話,立即重新啟動。
    • 通過主機上的4000端口和Docker中容器container進行綁定。
    • 通知web容器共享端口80通過負載均衡網絡被稱為webnet
    • 用默認的方式定義webnet網絡(負載均衡的覆蓋網絡)。
  • 運行負載均衡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. 在群集中分發您的應用

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

  • 一個swarm是一群運行在Docker上機器成為一個集群。一個swarm開始后,你可以運行你熟悉的Docker命令。但他們現在被一個swarm manager在一個集群上執行。在swarm中的機器可以是物理機器也可以是虛擬機。加入swarm后,他們被稱為節點。

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

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

  • 直到現在,你一直用你的Docker以單主機的模式在本地運行。Docker也可以切換到swarm mode模式。

  • 建立你的swarm

    • 一個swarm有多個節點構成。節點可以是物理節點,也可以是虛擬節點。可以使用命令docker swarm init開啟swarm模式并且是自己的機器成為swarm manager。然后運行命令docker swarm join在其他的機器上,使其加入swarm成為worker。現在我們使用虛擬機創建兩臺機器的集群,然后創建好的兩臺機器添加到swarm中。虛擬機可以使用win10的Hyper-v或者使用VirtualBox來搭建。在使用Docker Toolbox前,一定要保證VirtualBox已經安裝了。
  • 現在用命令docker-machineVirtualBox driver來創建一對虛擬機。

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

5. 通過添加后端數據庫來堆棧服務

6. 將您的應用部署到生產環境

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容