Docker是用于开发、装载和运行应用的开放平台。Docker项目的目标是实现轻量的操作系统级虚拟化解决方案,它提供了一种在容器中安全隔离地运行应用程序的方式。可以在宿主机上运行多个容器。
Docker的基础是Linux容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
一:Docker架构
Docker使用客户端-服务器架构。Docker client与Docker daemon进行交互,向其发送命令,由Docker daemon执行构建、运行容器等任务。
Docker client和Docker daemon可以运行在同一台主机上,也可以连接远端的Docker daemon。Docker client和Docker daemon之间通过socker或者RESTful API进行通信。架构如下:
用户通过Docker client与Docker daemon交互。当执行docker XXX命令时,相当于启动了一个client,该client将消息发送给daemon,由daemon执行具体的任务。
Docker中有三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)。理解了这三个概念,就理解了 Docker 的整个生命周期。
1:镜像
Docker镜像是一个只读的模板,是一个静态的概念。例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面安装了Apache或用户需要的其它应用程序。
使用镜像来创建 Docker容器。Docker利用容器来运行应用程序。
2:容器
容器是从镜像创建的运行实例,是一个动态的概念。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
3:仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。用户也可以在本地网络内创建一个私有仓库。
Docker中的镜像是一个只读的模板,每个镜像都是由一系列的层组成。Docker使用统一文件系统(union file systems)来将这些层整合成独立的镜像。统一文件系统使得多个文件系统上的文件和目录,透明的叠加在一起,形成一个完整的文件系统。
Docker如此轻量级的原因就是因为分层的概念。当改变一个Docker镜像时,比如升级一个应用到新的版本,则只是构建了一个新的层,因此无需构建或替换整个镜像,只需要增加新的层就可以了。
容器中包含了操作系统环境、用户文件以及元数据。容器从镜像中创建,镜像是只读的,当运行容器时,Docker向镜像的顶部添加了一个可读写的层,从而可以运行应用程序了。
当执行下面的命令时:
$ docker run -i -t ubuntu /bin/bash
首先可执行程序docker启动一个Docker客户端,选项run用于启动一个新的容器。Docker客户端通知Docker daemon执行以下过程来运行容器:
1:使用ubuntu作为构建容器的镜像;
2:当容器加载后,在容器中执行/bin/bash命令,启动一个BASH shell。
Docker daemon具体的执行步骤是:
1:检查镜像是否存在。首先检查本地是否具有ubuntu镜像,如果不存在,则从Docker Hub上查找并下载。如果本地已经有ubuntu镜像了,则使用它构建容器;
2:创建新容器;
3:分配一个文件系统,并mount一个可读写的层。容器就在该文件系统上构建,并在镜像上添加了一个可读写的新层。
4:分配一个网络接口。创建网络接口用于与宿主机通信。
5:分配一个IP地址。从池中寻找一个可用的IP地址并分配给网络接口。
6:运行指定的应用程序;
7:捕获应用程序的输出。连接并且记录标准输入、标准输出以及标准错误输出。
二:安装
运行docker,内核需要至少是3.10以上。
1:使用curl安装
$ curl -fsSL https://get.docker.com/ | sh
2:使用yum安装
$ yum update $ tee /etc/yum.repos.d/docker.repo <<EOF [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7 enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF $ yum install docker-engine $ service docker start
验证docker是否安装成功
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 535020c3e8ad: Pull complete af340544ed62: Pull complete Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker Engine CLI client contacted the Docker Engine daemon. 2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker Engine daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/
三:问题
1:运行容器时,下载image失败,需要设置代理:
$ mkdir /etc/systemd/system/docker.service.d $ tee /etc/systemd/system/docker.service.d/http-proxy.conf << EOF > [Service] > Environment="HTTP_PROXY=http://192.168.20.22:1888" "NO_PROXY=localhost,127.0.0.1" > EOF $ systemctl daemon-reload $ systemctl restart docker
参考:https://docs.docker.com/engine/admin/systemd/#http-proxy
2:启动docker失败:
Error starting daemon: Error initializing network controller: Error creating default "bridge" network: Failed to setup IP tables, cannot acquire Interface address: Interface docker0 has no IPv4 addresses"
原因:可能是之前安装docker未卸载干净
解决:删除docker0网桥:
$ ifconfig docker0 down $ brctl delbr docker0
https://docs.docker.com/engine/understanding-docker/
https://docs.docker.com/engine/installation/linux/rhel/