zoukankan      html  css  js  c++  java
  • docker

    docker

    1. 什么是容器

    首先 —— 容器是一种虚拟化的方案,但与传统的虚拟机不同

    传统虚拟机—— 通过中间层将一台或多台独立的机器虚拟运行在物理硬件之上

    容器 —— 直接运行在操作系统上的用户空间,所以也被成为操作系统虚拟化,

    只能运行相同或相似内核的操作系统

    docker —— 依赖于linux的内核特性,所以只能运行以linux为基础的系统

    有点 —— 不需要包含操作系统(虚拟机包含),所以资源占用减少,虚拟机需要模拟硬件行为,对内存和cup损

    耗比较大,容器技术较复杂,不易管理,不易自动化,而docker很好的解决了这一系列行为

    docker —— 将应用程序自动部署到容器的开源引擎,go语言,拥有应用程序部署引擎

    docker特点 —— 简单轻量的建模方式、职责的逻辑分离、快速高效的开发生命周期(环境一直),面向服务的架

    构(单个容器只运行一个)

    docker作用 —— 使用docker容器开发、测试、部署;隔离运行环境;测试环境;PaaS;SaaS

    2. docker的基本组成

    • Client 客户端

    • Daemon 守护进程

    • Image 镜像

    • Container 容器

    • Registry 仓库

    1. 客户端/守护进程 ——> c/s

      客户端发送命令,命令传给守护进程,守护进程将结果返回给客户端

    2. 镜像

      容器的基石,基于镜像启动与运行,层叠的只读文件系统

    3. 容器

      通过镜像启动,执行单元,从镜像的可写层中(镜像顶层),写时复制

    4. 仓库

      保存用户构建的镜像,docker hub(公用镜像)

    关系 —— 客户端访问docker的守护进程,从而操作docker的容器,而容器是通过镜像进行启动与执行的,而镜像

    保存在仓库之中,以上几位docker各部分的关系

    3. docker容器相关技术

    docker依赖的linux内核特性

    • Namespaces 命名空间

    • Control groups(cgroups) 控制组

    Namespaces

    变成语言包含命名空间的概念,可以理解为是一种封装的概念,而封装本省就是代码隔离

    在操作系统中命名空间提供系统资源隔离(进程、网络、文件系统等)

    Control groups(cgroups)

    分配资源。资源限制,优先级设定,资源计量,资源控制

    docker容器的能力

    • 文件隔离系统——每个容器都有自己的root文件系统

    • 进程隔离——每个容器都运行在自己的进程环境之中

    • 网络隔离——容器间的虚拟网络接口和IP地址都是分开的

    • 资源隔离与分组——使用cgroups将cpu和内存之类的资源独立分配给每个docker容器

    4. 安装命令

    • 检查内核版本

      uanme -a

    • 检查device mapper(存储驱动)

      ls -l /sys/class/misc/device-mapper、

    推荐使用docker维护的版本

    • 检查APT的https支持查看/usr/lib/apt/methods/https文件是否存在,如果不存在则运行安装命令进行安装(apt-get update) ,然后 apt-get install -y apt-transport-https

    • 添加docker的APT仓库

      echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list

    • 添加仓库的key

      apt-key adv --keyserver hkp://keysever.ubuntu.com:80 --recv-keys 36.......E9(此处为key,省略)

    • 安装

      apt-get update

      apt-get install -y lxc-docker

    由于以上安装比较繁琐,所以推出了建议安装版本

    1. sudo apt-get install -y curl

    2. curl -sSL https://get.docker.com/ubuntu/ | sudo sh

    5. 容器的基本命令

    • 启动容器

      docker run image【command】【arg...】

      docker run -i -t image /bin/bash 提供交互式的容器

      -i --interactive=true|false 默认为false 始终打开标准输入

      -t --tty=true|false 默认为false 为创建的容器分配一个伪tty终端

    • 查看容器

      docker ps 【-a】(列出所有的容器)【-l】(列出最新的容器)

      不加参数时是列出运行中的容器

      docker inspect 容器名字或者容器Id

    • 自定义容器名

      docker run --name (自定义名字) -i -t image /bin/bash

    • 重启启用停止的容器

      docker start 【-i】 容器名

    • 删除不在运行中的容器

      docker rm 容器名称或ID

    守护式容器

    什么是守护式容器——能够长期运行、没有交互式回话、适合运行应用程序与服务

    启动守护式容器的方法

    • 以交互式容器的方式启动,然后以ctrl+P,ctrl+Q的方式退出该交互式容器,注意两个ctrl命令是连续的

    • 以run命令启动一个守护式容器 docker run -d image 【command】【arg...】

    附加到运行中的容器(即重新进入守护式容器)

    docker attach 容器名

    查看容器日志

    docker logs 【-f】【-t】【--tail】 容器名

    -f --follows=true|false 默认为false 跟踪日志并返回结果

    -t --timestamps=true|false 默认为false 返回的结果上加上时间戳

    --tail ="all" 返回结尾处日志数量

    查看容器内进程

    docker top 容器名

    在运行中的容器中启动新进程

    docker exec 【-d】【-i】【-t】容器名【command】【args...】

    停止守护式容器

    1. docker stop 容器名

      发送一个信号等待容器结束

    2. docker kill 容器名

      直接停止容器

    man docker -run/man docker -logs查看清晰命令

    6. 容器的使用(部署静态网站)

    1. 设置容器的端口映射

      run -P -p

      -P,--publish -all=true|false 默认为false 为容器暴露的所有端口进行映射

      docker run -P -i -t ubuntu /bin/bash

      -p,--publish=[] 指定映射那些容器的端口

      docker run -p 80 -i -t ubuntu /bin/bash

      其中端口的映射有多种方式,推荐下面两种

      指定宿主机和容器的端口,即 8080:80 ——将容器80端口映射到宿主机的8080端口

      指定宿主机IP+port:容器端口 ,即0.0.0.0:8080:80

    2. 安装Nginx

      • docker run -p 80 --name web -i -t ubuntu /bin/bash

      • 运行apt-get install -y nginx

      • 如果提示Unable to locate package nginx,则先运行 apt-get update

      • 安装vim apt-get install -y vim

      • 创建包 mkdir -p /var/www/html

      • 切换目录 创建一个index.html vim index.html

      • 书写简单的页面内容

      • 通过whereis nginx查看nginx的安装目录

      • ls /etc/nginx/sites-enabled/

      • vim /etc/nginx/sites-enabled/default

      • 编辑 增加 root /var/www/html

      • 切换到根目录运行nginx(直接输入nginx便可以直接运行)

      • 通过ps -ef便可以查到nginx已经运行

      • 以守护容器退出(上述方法)

      • 可以使用docker ps 查看端口使用情况,也可以使用docker port 容器名称,查看端口情况

      • 使用curl http://127.0.0.1:32768 查看是否可以返回index.html页面

      当容器停止后,端口号也会随之发生变化,这点要注意

      7.docker镜像的查看与删除

      • 列出镜像

        docker images 【optsions】【repository】

        -a,--all=false 不显示中间层镜像

        -f,--filter=[] 显示式的过滤条件

        --no-trunc = false 指定不使用截断的形式(id长度)

        -q,--quiet=false 只显示镜像的唯一Id

      • 镜像的仓库与标签组成一个完整的镜像,获得唯一Id

      • 查看镜像的完整信息

        docker inspect 【options】container|image (容器或镜像)

      • 删除一个镜像

        docker rmi 【options】image

        -f,--force 强制删除镜像

        --no-prune=false 不删除被打标签的父镜像

        docker rmi $(docker images ubuntu -q) 删除ubuntu的所有镜像 ,原因是docker images ubuntu -q

        只返回镜像id,而rmi支持多个删除,中间用空格间隔

      8. 获取与推送镜像

      • 查找镜像

        通过docker search 【options】trem

        --automated=false 只会显示自动化构建的

        --no-trunc=false 不截断

        -s,--stars=0 星级,限制最低星级

        只会返回最多25条

      • 拉取镜像

        docker pull 【options】name【:tag】

        -a,--all-tags=false 所有镜像

        加速镜像拉取得方法

        修改/etc/default/docker

        添加DOCKER_OPTS="--registry-mirror=http://MIRROR-ADDR(该部分的地址为在daocloud.io中获

        取的地址)"

        重新启动守护进程 service docker restart

      • 推送镜像

        docker push 【name】

        push 前先进行账号登录

        docker login -u 账号 -p 密码

      9. 构建镜像

      为什么要构建镜像

      • 保存对容器的修改,并再次使用

      • 自定义镜像的能力

      • 一软件的形式打包并分发服务及其运行环境

      构建方式

      • docker commit 通过容器构建

      • docker build 通过Dockerfile文件构建

      通过docker commit 构建镜像

      • docker commit 【OPTIONS】container【repository】【:tag】

        -a,--author="" 作者

        -m,message="" 提交信息

        -p,--pause=true 不暂停正在运行的容器

      通过docker build构建镜像

      创建dockerfile

      使用docker build命令

      10. docker的远程访问

      • 修改vim /lib/systemd/system/docker.service 文件

      • 在ExecStart=/usr/bin/dockerd增加参数设置

      • -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --label name=docker_service_1

        其中--label name=docker_service_1 为标识 tcp://0.0.0.0:2375代表可以通过ip+2375端口进行远程访问

      • 验证在另一台可以访问的docker端访问curl http://ip:2375/info 可以查到信息,并能从中找到标示

        docker_service_1 ,代表远程访问成功

      上面是服务端的配置,那么客户端如何进行远程调用,向服务端的守护线程发送命令呢

      • 在运行命令的时候添加-H tcp://ip:2375 例如docker -H tcp://29.106.21.163:2375 info

      • 在客户端添加docker_host 命令行为export DOCKER_HOST="tcp://ip:2375"

        然后便可以像调用本地的守护线程一样调用,当不适用远程的服务端时,直接将docker_host 置空

        export DOCKER_HOST=""

      •  

  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/fengerlong/p/9101829.html
Copyright © 2011-2022 走看看