Docker(转)

资料:https://segmentfault.com/a/1190000002734062

Docker 是容器管理工具

Docker 是一个轻量级、便携式、与外界隔离的容器,也是一个可以在容器中很方便地构建、传输、运行应用的引擎。和传统的虚拟化技术不同的是,Docker 引擎并不虚拟出一台虚拟机,而是直接使用宿主机的内核和硬件,直接在宿主机上运行容器内应用。也正是得益于此,Docker 容器内运行的应用和宿主机上运行的应用性能差距几乎可以忽略不计。 
但是 Docker 本身并不是一个容器系统,而是一个基于原有的容器化工具 LXC 用来创建虚拟环境的工具。类似 LXC 的工具已经在生产环境中使用多年,Docker 则基于此提供了更加友好的镜像管理工具和部署工具。

Docker 不是虚拟化引擎

Docker 第一次发布的时候,很多人都拿 Docker 和虚拟机 VMware、KVM 和 VirtualBox 比较。尽管从功能上看,Docker 和虚拟化技术致力于解决的问题都差不多,但是 Docker 却是采取了另一种非常不同的方式。虚拟机是虚拟出一套硬件,虚拟机的系统进行的磁盘操作,其实都是在对虚拟出来的磁盘进行操作。当运行 CPU 密集型的任务时,是虚拟机把虚拟系统里的 CPU 指令“翻译”成宿主机的CPU指令并进行执行。两个磁盘层,两个处理器调度器,两个操作系统消耗的内存,所有虚拟出的这些都会带来相当多的性能损失,一台虚拟机所消耗的硬件资源和对应的硬件相当,一台主机上跑太多的虚拟机之后就会过载。而 Docker 就没有这种顾虑。Docker 运行应用采取的是“容器”的解决方案:使用 namespace 和 CGroup 进行资源限制,和宿主机共享内核,不虚拟磁盘,所有的容器磁盘操作其实都是对 /var/lib/docker/ 的操作。简言之,Docker 其实只是在宿主机中运行了一个受到限制的应用程序。 
从上面不难看出,容器和虚拟机的概念并不相同,容器也并不能取代虚拟机。在容器力所不能及的地方,虚拟机可以大显身手。例如:宿主机是 Linux,只能通过虚拟机运行 Windows,Docker 便无法做到。再例如,宿主机是 Windows,Windows 并不能直接运行 Docker,Windows上的 Docker 其实是运行在 VirtualBox 虚拟机里的。

Docker Toolbox

http://dwz.cn/34cH1t 
近日,Docker公司发布了 Toolbox。Toolbox是一个安装器,目前支持Mac和Windows平台。使用它可以快速地在安装Docker工具集。本文翻译自Docker官方博客。 
过去我们总听到有人说,在开发中很难使用入手使用Docker,尤其是你已经根据Compose定义过了你的应用程序 ,然后接下来要去单独安装Compose的情况。随着Compose、Kitematic 以及Boot2Docker的普及,我们意识到我们需要让这些零碎的工具更好的在一起工作。 
Toolbox可以安装你在开发中运行Docker时所需要的一切:Docker客户端、Compose(仅Mac需要)、Kitematic、Machine以及VirtualBox。Toolbox使用Machine和VirtualBox在虚拟机中创建了一个引擎来运行容器。在该虚拟机上,你可以使用Docker客户端、Compose以及Kitematic来运行容器。

它取代了Boot2Docker吗? 
是的,玩转Docker,我们推荐Toolbox 。 
尽管Boot2Docker安装程序已经相当的受欢迎,但Docker Toolbox是设计用来安装正在不断发展的Docker开发者开具集合,比如Kitematic、Machine、Swarm还有Compose。之前Boot2Docker还安装了一个叫Boot2Docker的命令行工具,以用来管理Docker虚拟机,在Toolbox中它已经被Machine取代了。 
然而,在这个引擎下,Machine依然采用了Boot2Docker Linux发行版来运行容器。所不同的是,现在由Machine代替Boot2Docker命令行工具来管理这些容器。 
如果你现在正在使用官方Boot2Docker(boot2docker-VM),Docker Toolbox会提示你自动迁移到使用Docker Machine的虚拟机上。

Docker Machine

https://docs.docker.com/machine/overview/

Docker Swarm

Swarm是docker官方的native cluster方案,实现将Docker的host pool虚拟为一个主机,兼容docker的标准API, 保证了所有可以和docker daemon通信交互的软件,可以无缝的移植和docker swarm集群交互。


CentOS系统下docker的安装配置及使用详解:http://www.server110.com/docker/201411/11105.html 
CentOS6.5安装Docker:http://www.linuxidc.com/Linux/2015-01/111091.htm


Dockerfile、Docker镜像和Docker容器的关系

http://www.csdn.net/article/2015-08-21/2825511 
Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,而 Docker 容器则可以认为是软件的运行态。从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。

简单来讲,Dockerfile构建出Docker镜像,通过Docker镜像运行Docker容器。

  • Docker镜像是Docker容器运行的基础,没有Docker镜像,就不可能有Docker容器,这也是Docker的设计原则之一。 
    可以理解的是:Docker镜像毕竟是镜像,属于静态的内容;而Docker容器就不一样了,容器属于动态的内容。动态的内容,进程,内存,CPU等之类的东西。
  • Docker容器实质上就是一个或者多个进程,而容器的父进程就是Docker守护进程(Docker deamon)。这样的,转化工作的执行就不难理解了:Docker守护进程 手握Docker镜像的json文件,为容器配置相应的环境,并真正运行Docker镜像所指定的进程,完成Docker容器的真正创建。
  • Docker容器运行起来之后,Docker镜像json文件就失去作用了。此时Docker镜像的绝大部分作用就是:为Docker容器提供一个文件系统的视角,供容器内部的进程访问文件资源。 
    所有的Docker镜像层对于容器来说,都是只读的,容器对于文件的写操作绝对不会作用在镜像中。Docker守护进程会在Docker镜像的 最上层之上,再添加一个可读写层,容器所有的写操作都会作用到这一层中。

  • Docker镜像的内容主要包含两个部分:第一,镜像层文件内容;第二,镜像json文件。 
    http://www.csdn.net/article/2015-08-21/2825511

  • 查看镜像层组成docker history ubuntu:14.04
  • 镜像层文件内容存储 
    cd /var/lib/docker/aufs/diff/ 
    ls |xargs ls
  • 镜像 json 文件存储 
    /var/lib/docker/graph 
    ls |xargs ls 
    除了 json 文件,每一个镜像层还包含一个 layersize 文件,该文件主要记录镜像层内部文件内容的总大小。

docker 和虚拟机的区别

http://www.csdn.net/article/2014-07-02/2820497-what's-docker

Docker 容器相对于 VM 有以下几个优点: 
启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久 
资源利用率高,一台普通 PC 可以跑上千个容器,你跑上千个 VM 试试 
性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源 
为啥相似的功能在性能上会有如此巨大的差距呢,其实这和他们的设计的理念是相关的。


docker底层基础

docker lxc cgroup namespace

http://blog.csdn.net/cnsword/article/details/17053865 
docker是lxc的管理器,lxc是cgroup的管理工具,cgroup是namespace的用户空间的管理接口。namespace是linux内核在task_struct中对进程组管理的基础机制。 
docker是用Go来实现的,自动化了对lxc的管理过程,能够自动在线下载相应的发行版本的rootfs。 
lxc可以直接chroot到任意的系统的rootfs上并通过cgroup的限制机制来控制容器内系统的资源占有率。 
cgroup通过配置文件或者命令配置后,限制相应进程或一组进程使用的系统资源。 
很明显,在lxc以上已经借助于chroot机制在一个限制的容器中运行一个完整的系统了,这样多个不通过虚拟化技术的新系统就在特定的占有物理资源的限制上运行起来。

Libcontainer

http://www.infoq.com/cn/articles/docker-container-management-libcontainer-depth-analysis/ 
容器是一个可管理的执行环境,与主机系统共享内核,可与系统中的其他容器进行隔离。 
在2013年Docker刚发布的时候,它是一款基于LXC的开源容器管理引擎。把LXC复杂的容器创建与使用方式简化为Docker自己的一套命令体系。随着Docker的不断发展,它开始有了更为远大的目标,那就是反向定义容器的实现标准,将底层实现都抽象化到Libcontainer的接口。这就意味着,底层容器的实现方式变成了一种可变的方案,无论是使用namespace、cgroups技术抑或是使用systemd等其他方案,只要实现了Libcontainer定义的一组接口,Docker都可以运行。这也为Docker实现全面的跨平台带来了可能。

LXC

http://www.cnblogs.com/lisperl/archive/2012/04/15/2450183.html 
LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。 
LXC可以在操作系统层次上为进程提供的虚拟的执行环境,一个虚拟的执行环境就是一个容器。可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小(包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)。 
LXC真正的实现则是靠Linux内核的相关特性,LXC项目只是对此做了整合。基于容器的虚拟化技术起源于所谓的资源容器和安全容器。 
LXC在资源管理方面依赖与Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。 
LXC是所谓的操作系统层次的虚拟化技术,与传统的HAL(硬件抽象层)层次的虚拟化技术相比有以下优势: 
1. 更小的虚拟化开销(LXC的诸多特性基本由内核特供,而内核实现这些特性只有极少的花费,具体分析有时间再说) 
2. 快速部署。利用LXC来隔离特定应用,只需要安装LXC,即可使 用LXC相关命令来创建并启动容器来为应用提供虚拟执行环境。传统的虚拟化技术则需要先创建虚拟机,然后安装系统,再部署应用。 
LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁。

CGroup

http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html 
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。 
CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。 
CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。

cgroup介绍、安装和控制cpu,内存,io示例

http://my.oschina.net/cloudcoder/blog/424418?p=1

rootfs

http://www.crifan.com/what_is_root_filesystem/ 
Linux系统中的根文件系统,Root FileSystem,简称为rootfs 
所谓的rootfs,根文件系统,就是那些,能让操作系统正常运行的,文件夹和文件的大集合。

AUFS

Docker基础技术:AUFS:http://coolshell.cn/articles/17061.html


docker 常用命令

  1. docker images 查看本地所有镜像
  2. docker rmi to remove the maryatdocker/docker-whale and docker-whale images. 
    You can use an ID or the name to remove an image. 
    $ docker rmi -f 7d9495d03763 
    $ docker rmi -f docker-whale
  3. docker run –tid ubuntu:14.04 
    运行成功后会生成一串id,这里的id是64位的,它的前12位用于做容器的ID,下面会看到完整的64位数字会用于aufs文件夹中使用 
    参数解释(其他参数可以执行docker run –help) 
    t:启动终端(-t flag assigns a pseudo-tty or terminal inside the new container.) 
    i:就算断开连接,但终端也继续。如果没有此参数,则断开后,terminal会退出 
    d:后台运行,如果不加此参数,会默认attach入容器 
    p:端口映射,主机端口:内部端口 
    by:xiaoshun
  4. docker attach 80ce056e622d 
    To detach the tty without exiting the shell, use the escape sequenceCtrl-p + Ctrl-q.
  5. docker run -tid -v /home/kingson/:/apps/svr/kingson/ ubuntu:14.04 启动时指定映射目录(启动之后就不能更改,只能重新跑了一个)
  6. docker commit 容器id/容器名称 镜像名称
  7. docker pull ubuntu:14.04 
    其中ubuntu为repository名称,可以理解为镜像名称,14.04为tag,可以理解为版本号 
    如果安装了dao的工具,这里也可以用dao pull ubuntu:14.04
  8. docker run -p 9999:22 -tid -v /home/kingson/:/apps/svr/kingson/ ubuntu-ssh:14.04 
    docker容器内安装ssh,通过端口映射容器端口22到主机端口9999 
    ssh登录使用主机ip和9999登录,注意容器内要新建用户,否则没有用户可以登录容器 
    apt-get update 
    apt-get install openssh-server 
    检查ssh服务开启状态ps -s | grep ssh 
    service ssh start
  9. docker ps ,docker ps -a查看正在运行的或者之前运行的容器的日志
  10. docker logs - Shows us the standard output of a container.
  11. docker inspect <container id>查看一个 Docker 容器的各种信息
  12. docker stop <container id> 
    docker kill $(docker ps -q)停止每个正在运行的容器
  13. docker rm <container id> 
    docker rm $(docker ps -aq)移除所有 docker 镜像
  14. docker高级应用(CPU与内存资源限制) 
    http://www.open-open.com/lib/view/1458559644603
  15. Docker Compose—简化复杂容器应用的利器 
    http://www.tuicool.com/articles/AnIVJn
  16. Dockerfile: https://docs.docker.com/engine/reference/builder/
  17. Docker 清理命令集锦 
    http://www.jb51.net/article/56051.htm 
    杀死所有正在运行的容器 
    docker kill $(docker ps -a -q) 
    删除所有已经停止的容器 
    docker rm $(docker ps -a -q) 
    删除所有未打 dangling 标签的镜像 
    docker rmi $(docker images -q -f dangling=true) 
    删除所有镜像 
    docker rmi $(docker images -q)
  18. docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web 
    172.17.0.2
  19. 检查容器
$ docker ps      # 显示运行的容器
$ docker inspect # 显示容器信息(包括ip地址)
$ docker logs    # 获取容器中的日志
$ docker events  # 获取容器事件
$ docker port    # 显示容器的公开端口
$ docker top     # 显示容器中运行的进程
$ docker diff    # 查看容器文件系统中改变的文件
$ docker stats   # 查看各种纬度数据、内存、CPU、文件系统等

docker 学习

https://docs.docker.com/engine/understanding-docker/

  • Docker components 
    Docker has two major components: 
    Docker Engine: the open source containerization platform. 
    Docker Hub: our Software-as-a-Service platform for sharing and managing Docker containers.
  • Docker’s architecture 
    Docker uses a client-server architecture. The Docker client talks to the Docker daemon, which does the heavy lifting of building, running, and distributing your Docker containers. Both the Docker client and the daemon can run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate via sockets or through a RESTful API.
  • The underlying technology 
    Docker is written in Go and makes use of several kernel features to deliver the functionality we’ve seen. 
    • Namespaces 
      Docker takes advantage of a technology called namespaces to provide the isolated workspace we call the container. When you run a container, Docker creates a set of namespaces for that container. 
      This provides a layer of isolation: each aspect of a container runs in its own namespace and does not have access outside it.
    • Control groups 
      Docker Engine on Linux also makes use of another technology called cgroups or control groups. A key to running applications in isolation is to have them only use the resources you want. This ensures containers are good multi-tenant citizens on a host. Control groups allow Docker Engine to share available hardware resources to containers and, if required, set up limits and constraints. For example, limiting the memory available to a specific container.
    • Union file systems 
      Union file systems, or UnionFS, are file systems that operate by creating layers, making them very lightweight and fast. Docker Engine uses union file systems to provide the building blocks for containers. Docker Engine can make use of several union file system variants including: AUFS, btrfs, vfs, and DeviceMapper.
    • Container format 
      Docker Engine combines these components into a wrapper we call a container format. The default container format is called libcontainer. In the future, Docker may support other container formats, for example, by integrating with BSD Jails or Solaris Zones.

Docker compose

https://docs.docker.com/compose/install/ 
https://github.com/docker/compose/releases

curl -L https://github.com/docker/compose/releases/download/1.7.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

https://docs.docker.com/compose/gettingstarted/ 
docker-compose up 
docker-compose up -d 
docker-compose run web env 
docker-compose stop 
https://docs.docker.com/compose/compose-file/

使用Dockerfile构造镜像病提交仓库

https://docs.docker.com/linux/step_four/

Dockerfile
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

docker build -t docker-whale . 
docker tag 4f476950722f kingson4wu/docker-whale:latest 
root@ubuntu:/home/kingson# docker login –username=kingson4wu –[email protected] 
Warning: ‘–email’ is deprecated, it will be removed soon. See usage. 
Password: 
Login Succeeded 
docker push kingson4wu/docker-whale

自建镜像仓库

https://github.com/docker/distribution/blob/master/docs/deploying.md 
https://github.com/docker/distribution

docker run -d -p 5000:5000 --restart=always --name registry registry:2 
root@ubuntu:/home/kingson# netstat -nlp |grep 5000 
tcp6 0 0 :::5000 :::* LISTEN 6320/docker-proxy 
root@ubuntu:/home/kingson# lsof -i:5000 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
exe 6320 root 4u IPv6 28188 0t0 TCP *:5000 (LISTEN)

管理后台

curl -sSL https://shipyard-project.com/deploy | bash -s 
Shipyard available at http://192.168.121.128:8080 
Username: admin Password: shipyard


文档查询

https://docs.docker.com/engine/userguide/intro/

猜你喜欢

转载自1181731633.iteye.com/blog/2371408