Docker Notes

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

#### Libcontainer

#### LXC

#### CGroup

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

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.
`dockerrmif7d9495d03763 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 sequence` Ctrl-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.
10. `docker inspect `查看一个 Docker 容器的各种信息
11. `docker stop `
`docker kill (dockerpsq)12.dockerrmdockerrm(docker ps -aq)`移除所有 docker 镜像
13. docker高级应用(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=kingson4wu@gmail.com
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/

猜您喜欢