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 不在一个网络上,所以无法互通

  • 相关阅读:
    有向无环图
    2016
    Permutation Descent Counts(递推)
    Rikka with Subset
    hihoCoder 1549 或运算和
    Young Maids
    1925: [Sdoi2010]地精部落
    Problem H. Hotel in Ves Lagos
    改变presentModalView大小
    no such file to load -- bundler/setup
  • 原文地址:https://www.cnblogs.com/wang_yb/p/8625003.html
Copyright © 2011-2022 走看看