1.Docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行
的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销
极低。
2.Docker的作用
1)Web 应用的自动化打包和发布。
2)自动化测试和持续集成、发布。
3)在服务型环境中部署和调整数据库或其他的后台应用。
4)从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
3.Docker的优势
1)资源利用率高
2)启动速度快
3)一致的运行环境
4)持续交付和部署
5)迁移较容易
4.Docker的版本
Docker 划分为CE 和EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。Docker在1.13 版本之后,从2017年的3月1日开始,版本命名规则变为:YY.MM .Docker CE 每月发布一个Edge 版本(17.03, 17.04, 17.05…),每三个月发布一个Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本号保持一致,但每个版本提供一年维护。
5.Docker中的几个基本概念
1)镜像:简单来说,就是面向对象中的类,相当于一个模板; 本质上来讲,其实是一个文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
2)容器:从认识上来说,就是类创建的实例,是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
3)仓库:从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
4)分层存储:镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。每一层删除的文件会跟随镜像,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
6.Docker的架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker Client: Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
Docker Host: 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Machine: Docker Machine是一个简化Docker安装的命令行工具,如VirtualBox、 Digital Ocean、Microsoft Azure。
7.Docker的安装----CentOS
7.1 Docker的环境要求
Docker支持以下的CentOS版本:
- CentOS 7 (64-bit) 、 64位、系统内核版本为 3.10 以上
- CentOS 6.5 (64-bit) 或更高的版本、 64位、系统内核版本为 2.6.32-431 或者更高版本
7.2使用yum安装
#查看内核版本
uname -r
#移除旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
#安装必要的系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#添加源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum缓存
sudo yum makecache fast
#安装docker-ce
sudo yum -y install docker-ce
#启动Docker后台服务
sudo systemctl start docker
#测试运行
docker run hello-world
(由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。)
#查看运行的docker镜像
docker image list
#Docker的升级
yum -y upgrade 新版本docker文件
7.3 镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
#配置完重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker
7.4删除Docker-CE
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
8.Docker的安装2----用CentOS自带的软件源
#Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。
yum install docker-io -y
#查看版本
docker -v
#启动docker
service docker start
#设置开机启动
chkconfig docker on
9.Docker Hello World
9.1在容器内运行一个应用程序
docker run ubuntu:15.10 /bin/echo "Hello World"
(Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果)
参数解析:
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
ubuntu:15.10指定要运行的镜像,Docker先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo "Hello world": 在启动的容器里执行的命令
9.2运行交互式容器
docker run -i -t ubuntu:15.10 /bin/bash
cat /proc/version (查看当前系统的版本)
ll (查看文件列表)
Ctrl + D (退出容器)
参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
9.3 后台模式运行容器
以进程方式运行的容器,返回的是容器ID
docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1;done"
docker ps (查看在运行的容器)
docker logs d3f44c894acd (查看容器内的标准输出)
docker stop d3f44c894acd (停止容器,参数用容器ID或容器名称都可以)
docker ps -a (查看所有容器,包括运行的和停止的)
docker start d3f44c894acd (启动指定ID的容器)
10.Docker容器的使用
10.1 Docker 客户端
docker (查看客户端的所有命令选项)
docker stats --help (查看指定命令的具体使用方法)
10.2运行一个web应用
1)#载入镜像
docker pull training/webapp (载入镜像)
docker run -d -P training/webapp python app.py (将容器内部使用的端口映射到使用的主机的默认随机端口上)
docker ps
参数解析:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
-p:设置端口
浏览器访问: 10.0.0.70:32768 (Docker5000----主机32768)
2)#查看端口映射
docker run -d -p 5000:5000 training/webapp python app.py (#容器内部的 5000 端口映射到我们本地主机的 5000 端口上)
docker ps
docker port f2e586db4478 (查看指定容器的网络映射端口)
3)#查看web应用程序日志
docker logs -f f2e586db4478
参数解析:
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
4)#查看web应用程序容器的进程
docker top f2e586db4478
5)#检查web应用程序
docker inspect f2e586db4478 (返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。)
6)#停止web应用容器
docker stop f2e586db4478
7)#重启web应用容器
docker start f2e586db4478 (docker restart 命令来重启正在运行的容器)
docker ps -l (查询最后一次创建的容器)
#修改容器名称
docker rename determined_panini webapp01
8)#移除web应用容器
docker rm f2e586db4478
注:删除容器时,容器必须是停止状态,否则会报错
11.Docker镜像使用
#列出主机上的镜像
docker images
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
#预先下载镜像
docker pull ubuntu:13.10
#查找镜像
docker search httpd
选项说明:
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
#下载镜像
docker pull httpd
docker run httpd
#更新镜像
docker fun -t -i ubuntu:15.10 /bin/bash
运行的容器内进行更新:apt-get update
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
docker images
docker run -t -i runoob/ubuntu:v2 /bin/bash
参数解析:
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:容器ID
runoob/ubuntu:v2:指定要创建的目标镜像名