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=""

    •  

 

posted @ 2018-05-28 19:19  懒得说话啊  阅读(83)  评论(0编辑  收藏  举报