docker&&简单使用

docker

了解

什么是传统虚拟化技术?

纯软件的虚拟化是通过对硬件层的模拟从而实现允许运行多个操作系统;硬件辅助虚拟化需要硬件层面对虚拟化的支持,类似Interl-VT技术等,具有更高的运行效率。
在这里插入图片描述

Guest OS //客户机
Host OS //宿主机

解决方案:

  • 商业解决方案 VMware vSphere、VMware Fusion(个人商业)
  • 开源解决方案 OpenStack、KVM

什么是System-level虚拟化?

Server virtualization method where the kernel allows multiple isolated user space instances
不需要模拟硬件层
共享同一个Host OS的Kernel
user space instance = Container
即允许你的kernel上面有多个user space instance存在,即所有的user space instance共享下面同一个kernel,每一个user space instance 被称为一个Container。
在这里插入图片描述
解决方案:

  • LXC:有ubuntu系统提供给的一种称为linux container的技术,可以使用apt-get install 直接安装
  • OpenVZ:
  • Docker:
  • Lmctfy:google开源的容器虚拟化的实现

传统虚拟化与容器虚拟化的区别

在这里插入图片描述

Container

Container的核心技术

CGroups:限制容器的资源使用

  • Linux内核提供的限制,记录和隔离进程组所使用的资源,由Google的工程师提出,后来被整合到kernel
  • 限制:控制container使用的cpu时间、内存、磁盘使用
  • 记录:记录cpu资源、内存使用情况
  • 通过不同的子系统(blkio,cpu,cpuacct等)来实现对不同资源使用的控制和记录。

查看docker容器中的CGroup步骤

  • vagrant up 启用docker容器
  • vagrant ssh 登陆
  • cd /sys/fs/cgroup 进入cgroup
  • ls -al 查看内部子系统
  • cd cpu

Namespace机制:实现容器间的隔离

  • pid:容器有自己独立的进程表和1号进程
  • net:容器有自己独立的network info
  • ipc:在ipc通信时候,需要加入额外信息来标示进程
  • mnt:每个容器有自己唯一的目录挂载
  • utc:每个容器有独立的hostname和domain

Chroot:文件系统的隔离

  • 隔离根文件系统,将每个container容器所在目录变为该容器的根目录。

官方地址:

  • Docker官网:https://www.docker.com/
  • Docker@Github: https://github.com/docker/docker/issues

dotcloud和docker

dotCloud是docker公司的前身,专注于PaaS的云计算平台
可能是支持最广泛的PaaS平台

什么是docker

dotcloud的工程师solomon编写了docker作为dotCloud的核心
使用container的概念来解决应用stack部署的难题。
开源的应用容器引擎,方便打包发布应用到容器中。
Go语言领域比较大型的应用。
在这里插入图片描述

  • Hypevisor:用于模拟底层硬件
  • Docker Engine:管理所有的Container

Docker是如何实现的

docker也是container技术的实现,最早使用LXC作为container的引擎,最新版本的docker使用libcontainer替换了lxc
采用aufs文件系统来管理image和container
基于C/S架构的实现,Server端使用UnixSocket,也可以切换到TCP Protocol
aufs文件系统:
advanced multi layer unification filesystem(高级多层联合文件系统)
可以实现把多个不同目录的内容合并在一起
允许read-only和read-write目录并存
docker中的aufs:
docker使用aufs来实现分层的文件系统的管理
只读部分定义为image,可写部分是container
image类似一个单链表系统,每个image包含一个指向parent image 的指针
没有parent image的image的image是base image
在这里插入图片描述
docker hub:
类似于Github的服务,用来分发image
大量标准的image,例如Tutum/Ubuntu,Tutum/Mysql
docker 官方提供的用来共享image的平台
Automated Builds Images,通过和Github的集成,自动监控github项目中的变化,构建新的image然后发布到docker hub中
https://hub.docker.com/
docker的局限性:
基于Linux64的,不能在32bit的环境下运行
GuestOS只能是Linux Base
隔离性相对于KVM等虚拟化技术有所欠缺
采用cgroup的resource control对于cpu的度量很难
container随着用户进程的停止而销毁

docker和lxc的区别

docker更专注的部署,而LXC专注于进程的隔离
docker有更好的api的方便对于docker容器的管理
dockerfile让image的创建变得容易
通过docker hub方便image的分享

docker的使用

docker安装

Linux:
Linux直接使用包管理进行安装 apt-get install docker.io
docker在Linux中安装只能运行在root模式下,但可以将当前用户添加到docker用户组,重启docker后即可以root的方式启动docker。
groups vagrant //将vagrant用户添加到docker
docker ps -a //此时该命令可以vagrant用户身份使用
docker image
Windows和Mac需要结合virtualbox
https://docs.docker.com/installation
在MacOS中安装:
使用boot2docker来运行docker server,boot2docker是一个可以运行docker server的最小的linux分发包。
切换UnixSocket到TCP实现remote control
Host不是MacOS,而是virtualbox中的VM
boot2docker up //mac命令行启动boot2docker
boot2docker ip //获取boot2docker的ip
boot2docker ssh //登陆到boot2docker
docker image //启动完成后可以查看本机镜像
示例:

sudo apt-get install docker      //安装dockers
sudo apt-get install docker.io   //安装dockers
docker run -d -p 22 tutum/ubuntu:14.04          //docker运行一个ubuntu的container
docker  ps -a         //查看当前container,显示端口对应关系
docker  logs ce199c800847
ssh -p 49153 root@dockerhost    //登陆本机docker
lsb_release -a                 //查看当前系统版本
boot2docker down              //释放当前container

docker image 管理

概念

Docker的layer-Style FileSystem
Linux FS:

  • boot file system (bootfs),包含bootloader和kernal。在按下开机启动之后,先挂载bootfs,因为bootfs包含开启所需要的信息。在启动完成后,kernel在内存中,bootfs接触挂载。
  • root file system(rootfs),包含类似/bin,/usr,/lib,等目录,这些是和kernel无关,和不同的Linux分发版本有关。

在这里插入图片描述
在这里插入图片描述
docker可以支持不同的rootfs!!!docker可以在一个kernel上面运行不同的Linux分发包。
FS in Dockers:
传统Linux启动时,将rootfs设置为readonly并检查完整性,然后设置为read-write。
Docker在启动container的时候,也是把rootfs设置为readonly,然后通过aufs把一个readwrite的文件系统挂载到rootfs之上,并且把下层文件系统设置为readonly,这样构成一个完整的操作系统。
在这里插入图片描述

  • 对于每一层readonly的FS,在docker中称为image
  • 对于顶上read-write的FS,称为container
  • 对于readonly中内容的修改,采用的是COW的技术,把文件复制到read-write层并改写,实际用户看到的是当前container层中的文件,image中的文件不会被影响。

image:
除了base image之外,每一层的image都有一个parent image
没有parent image的景象叫base image
base image是docker提供的最基础的镜像。
基于COW的技术,image部分是不会被修改的,因此container可以共享image层的FS,提高了存储的效率。
多个image share可以提高存储效率和装载container效率

docker images
    Ubuntu             //base image
    tutum/mysql         //标准image

在这里插入图片描述
Storage driver:
除了默认的aufs之外,docker通过对于storage的抽象,可以支持一些其他的storage driver ,例如vfs,devicemapper,btrfs
修改docker启动时候的参数设置,增加-storage-driver={storage plugin}在配置文件中

镜像管理、使用

  • base image是docker 官方提供的基础镜像
  • 普通镜像的命令规范{namespace}/{repository name}:{tag}
  • namespace是docker hub的用户名,实际起到了namespace的作用
  • repository,类似于github项目,例如ubuntu,mysql等
  • tag,表示版本信息,例如cesc/mysql:5.5,tag是可选的,默认值是latest

search image:
docker search {repository name} //默认是在docker hub上进行搜索
pull image:
docker pull {image name} //如果不指定tag的话,会把image的所有tags都会download下来。
上传镜像:

  • docker login,登陆到docker hub中
  • 把container通过docker commit的命令转化成一个image
  • 通过docker tag来命名新生成的image
  • docker push到docker hub 中

常用image命令

docker search ubuntu                      //从hub上面查询镜像
docker images                           //查看本地已有镜像
docker images --no-trunc                  //查看完整image ID
docker pull busybox:ubuntu-14.04           //拉一个Ubuntu-14.04的busy box
注:此时会显示一层一层的parent image,当下次pull 新的image时,若有相同的parent image,则会share这个parent image。不再重新pull。
docker login                            //push前需先登陆
docker info                             //查看当前docker信息
docker ps                              //查看当前container信息
docker run -t busybox:ubuntu-14.04 echo "hello world"    //实例
docker ps -a                            //此时有一个刚结束的container
docker commit a1e6638714e1              //commit刚才的container ID
docker images       //此时images里面多了一个没有repository和tag的image
docker tag 7b19e1fdc05d smallq/busybox:osforce  //添加repository和tag
docker images                         //此时image已更新repository和tag
docker push smallq/busybox         //push一个local image到docker hub上面

参考链接:
https://segmentfault.com/q/1010000001732141
http://blog.csdn.net/chszs/article/details/48224153

Run Container

使用run 来运行一个Docker Container
运行一个container的本身就是开启一个具有独立namespace的进程,container也被称为进程级别的虚拟化。
docker通过run的命令来启动一个container
运行一个container必须要指定一个image作为初始化的文件系统
命令::

sudo docker run [options] image[:tag] [command] [arg...]
  • image:对于不存在的image,Docker会自动去Registry里面下载对应的image,然后再运行Container。
  • command:标志的是在container中实际运行的首进程

如果image里面包含了CMD的命令,那么在启动container的时候,不需要指定Command,否则会使用指定的Command来覆盖image中的CMD.

概念

前台运行VS后台运行:
默认的Container是前台运行的,会绑定Command进程的STDIN,STDOUT,STDERR到console上。
可以通过-d的选项让Container运行在后台
如果是在前台运行,也可以通过指定-a {STDIN,STDOUT,STDERR}选择需要绑定的IO
通过attach命令可以重新attach一个后台运行的container,即将一个后台运行的container切换至前台。

Container Identification:
在后台运行的情况下,RUN命令会返回一个UUID,唯一标识Container
可以通过docker ps 来查看container的UUID和运行信息。
可以通过指定—name的方式来制定container的名字,name必须是唯一的。
inspect:
通过docker inspect {Container ID}来获取container的更多的信息,包括网络,Volume,实际在Host上的进程ID等信息。

  • docker ps -a
  • docker inspect a1e6638714e1

Log:
通过logs命令可以看到Container中Command所指向进程的STDOUT,STDERR数据。
环境变量:
通过-e参数,可以在运行container的时候添加系统环境变量。
网络设置:
docker使用bridge的方式来实现Container之间以及和外部的通信。

volume共享文件系统

使用Link来连接两个容器

改变dockers的数据存放路径

更改dockers的存储路径,另一方法是对/var/lib/docker做“ln -s”软连接处理
在这里插入图片描述

Docker 常用命令

#容器与服务器指定特定端口的、多端口的映射:

sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
docker run --name zabbixb --net luckydog --ip 10.2.0.2 -p 80 -it luckydog/zabbix:20190517b

常用命令2

docker images
docker run -t busybox:ubuntu-14.04 echo "helle world"   //默认前台运行
//run   运行一个container
//-t     指定一个image作为模板,此处是busy box
//echo   此处填运行的参数(process/command),此时运行了echo.
docker ps -a                        //查看刚刚运行的container
docker ps -a --no-trunc               //查看完整ID
docker rm a1e6638714              //docker移除container,不需写全部ID
注:只有非运行状态的container才能够被删除。运行状态的container需先stop,才能被删除。
docker run -dt busybox:ubuntu-14.04 sh -x "while ture;do echo hello world;sleep 2;done"
注:建立一个每两秒输出一个hello woeld的后台运行的container,后台运行时输出一个uuid。
docker ps -a
docker logs 8bd1526                 //查看某个container的输出日志
docker run -dt busybox:ubuntu-14.04 sh -c "while ture;do echo hello world;sleep 2;done"                          //将”x”改为”c”??,答x是可执行文件,c是可执行命令
docker ps -a
docker attach ea5                //进入一个运行的container,此时两秒输出一个hello world
发布了73 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dfq737211338/article/details/104532359