zoukankan      html  css  js  c++  java
  • docker 基础

    概述

    起源

    2013 年由 DotCloud 公司开源出来的容器管理工具
    DotCloud 公司是一家 PAAS 服务提供商,从 docker 的出身也可以看出它的主要功能和方向

    技术原理

    开始时是基于 LXC 容器技术

    • cgroup: 将任意进程进行分组化管理,同时还可以控制进程的资源占用(CPU, 内存等等)情况
    • namespace: 让每个进程组有独立的 PID, IPC 和网络空间

    详细信息可以参照:http://www.cnblogs.com/wang_yb/p/3923040.html

    解决的痛点

    • 打包部署
    • 运行环境标准化
    • 更加高效的利用物理机

    docker 基本命令

    容器的一个标准的生命周期包括: 创建,启动,停止,终止和移除

    • docker pull busybox # 远程下载 images
    • docker run -it –rm –name busybox busybox # 创建容器,名称为 busybox
    • docker stop/kill busybox # 停止/强行停止 容器
    • docker start/restart busybox # 启动/重新启动 容器
    • docker rm busybox # 移除容器

    常用命令

    • docker exec 可以运行 容器中的命令
    • docker cp 可以在主机和容器之间复制文件
    • docker inspect 查看容器的详细信息,也可以查看镜像详细信息
    • docker stats 容器的资源占用信息
    • docker events 返回 docker 主机上发生的所有 docker 事件流
    • docker logs 监控容器的日志
    • docker top 查看容器内运行的进程

    docker 使用示例(busybox)

    docker 容器是完全隔离的运行环境,但实际使用中,难免需要和外部或者 docker 容器进行交互。
    比较常用的交互主要有 环境变量,磁盘,网络

    环境变量

    docker run -it --rm -e MY_NAME=wangyubin busybox env
    

    外部的环境变量可以在容器启动的时候注入到容器中

    磁盘

    容器会共享镜像中的内容,容器自己的状态才会保存在磁盘上。

    docker volume ls # 查看所有容器占用的磁盘名称
    docker volume inspect VOL_NAME  # 查看具体的磁盘信息
    

    容器中的文件,不会改变 image

    在一个容器中创建文件(test.txt)

    $ docker run -it --rm busybox
    / # touch test.txt
    / # ls
    bin       etc       proc      sys       tmp       var
    dev       home      root      test.txt  usr
    

    重新启动的容器中是不包含这个文件的

    $ docker run -it --rm busybox
    / # ls
    bin   dev   etc   home  proc  root  sys   tmp   usr   var
    

    容器挂载外部的文件系统

    如果希望容器之间共享文件,或者将文件放在容器之外来管理,可采用如下方式 容器启动时挂载外部文件夹

    docker run -it --rm -v /home/wangyubin/tmp/volume:/share-dir busybox
    cd share-dir
    touch test.txt
    

    另一个容器也挂载这个文件夹

    docker run -it --rm -v /home/wangyubin/tmp/volume:/share-dir busybox
    / # ls share-dir
    test.txt
    

    网络

    容器中的服务默认只有当前容器可以访问,容器的宿主和其他容器都是无法访问的。

    通过暴露端口,让宿主可以访问容器内服务

    通过 nc 命令模拟一个服务

    $ docker run -it -p 1234:1234 --rm busybox
    / # nc -l -p 1234
    

    在宿主机上可以通过 docker ps 命令看到暴露的端口

    docker ps
    
    nc localhost 1234   # 连接上本地的 1234 端口,就可以和 docker 容器互发消息
    

    容器创建在同一网络上

    创建容器运行的网络,然后将 2 个容器启动到同一个网络上

    $ docker network create test
    a85b5589234b701b1237a364f7796b47e2d1ba4506740767c581a3d62d9e8f48
    
    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    a85b5589234b        test                bridge              local
    ... ...
    

    启动第一个 docker,name 为 test01,并在容器中用 nc 命令模拟一个服务

    $ docker run -it --rm --name test01 --network test busybox
    / # nc -l -p 1234
    

    启动第二个 docker,name 为 test02,和 test01 在同一个网络上

    $ docker run -it --rm --name test02 --network test busybox
    / # nc test01 1234
    hello
    

    由于在同一个网络上,可以通过 test01 这个名称直接连接另一个容器

    启动第三个 docker,name 为 test03,使用默认的网络

    $ docker run -it --rm --name test03 busybox
    / # nc test01 1234
    nc: bad address 'test01'
    

    由于 test03 和 test01 不在一个网络上,所以无法互通

  • 相关阅读:
    单例模式
    HashSet、LinkedHashSet、SortedSet、TreeSet
    ArrayList、LinkedList、CopyOnWriteArrayList
    HashMap、Hashtable、LinkedHashMap
    andrew ng machine learning week8 非监督学习
    andrew ng machine learning week7 支持向量机
    andrew ng machine learning week6 机器学习算法理论
    andrew ng machine learning week5 神经网络
    andrew ng machine learning week4 神经网络
    vue组件监听属性变化watch方法报[Vue warn]: Method "watch" has type "object" in the component definition. Did you reference the function correctly?
  • 原文地址:https://www.cnblogs.com/wang_yb/p/8625003.html
Copyright © 2011-2022 走看看