Docker 简介

什么是虚拟化

  在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体 资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不 可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部 份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能 力和资料存储。
  在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的 硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分 利用
  虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、 桌面虚拟化、服务虚拟化、虚拟机等等。

什么是 Docker

  Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。 alt docker Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。 Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
  Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
  在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使 得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

为什么选择 Docker?

  1. 上手快。
      用户只需要几分钟,就可以把自己的程序“Docker 化”。Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改” 的境界。
      随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可 启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也 可以运行更多的容器,使用户尽可能的充分利用系统资源。
  2. 职责的逻辑分类
      使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如 何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署 的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正 常的,上线后出了问题就归结为肯定是运维的问题)”
  3. 快速高效的开发生命周期
      Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用 程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面 可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件 件的取。)
  4. 鼓励使用面向服务的架构
      Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应 用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服 务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序 都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程 序)

容器与虚拟机比较

与传统的虚拟机相比,Docker 优势体现为启动速度快、占用体积小。 $\color{red}{Docker的作用是解决软件在不同的Linux系统之间的移植问题}$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
海运                     软件开发

蓝鲸(货轮)         Docker
集装箱                    容器
码头                       Linux

描述
我们的软件开发就像海运一样,而Docker就充当货轮,容器就是上面载着的集装箱,
里面放的货物就是各个软件,然后运输到码头,相当于Linux系统,
这样就实现把软件移植到别的Linux系统上面去运行了。

装软件的三种方式(CentOS7):

  1. 把软件直接安装在CentOS7 移植性差
  2. 在CentOS7的基础先安装VM Ware软件,在VM Ware再安装CentOS7,在CentOS7再安装软件 占用内存大
  3. 在CentOS7的基础安装Docker软件,在Docker里面安装软件 移植性好,占用内存小

镜像(Image): 安装软件所需要的安装包

容器(Container):在镜像基础上,把软件安装起来,运行起来的效果

宿主机:指装软件的CentOS7系统

Docker 组件

Docker 服务器与客户端

  Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器或者 守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个 命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程 和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护 进程。 alt dockerCS架构

Docker 镜像与容器

  镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周期中 的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出 来。例如:

  1. 添加一个文件;
  2. 执行一个命令;
  3. 打开一个窗口。
    也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更 新。
      Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容 器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜 像是 Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于 镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。 所以 Docker 容器就是:
    一个镜像格式;
    一些列标准操作;
    一个执行环境。
      Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模 型运用到自己的设计中,唯一不同的是:$\color{red}{集装箱运输货物,而 Docker 运输软件。}$
      和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底装了什么,它不管是 web 服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将 内容“装载”进去。
      Docker 也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到 Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。 像标准集装箱一样,Docker 容器方便替换,可以叠加,易于分发,并且尽量通用。 alt 不同Linux之间软件移植流程图

Registry(注册中心)

  Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营 公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像 (说明:在 Docker Hub 下载镜像巨慢,可以自己构建私有的 Registry)。

https://hub.docker.com/

Docker 安装与启动

  Docker 官方建议在 Ubuntu 中安装,因为 Docker 是基于 Ubuntu 发布的,而且一般 Docker 出现的问题 Ubuntu 是最先更新或者打补丁的。在很多版本的 CentOS 中是不支持更新最新 的一些补丁包的。
  由于我们学习的环境都使用的是 CentOS,因此这里我们将 Docker 安装到 CentOS 上。 注意:这里建议安装在 CentOS7.x 以上的版本,在 CentOS6.x 的版本中,安装前需要安装其 他很多的环境而且 Docker 很多补丁不支持更新。

yum 包更新到最新

1
sudo yum update

安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper驱动依赖的

1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

设置 yum 源为阿里云

1
2
sudo yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装 docker

1
sudo yum install docker-ce

安装后查看 docker 版本

1
docker -v

设置 ustc 的镜

  ustc 是老牌的 linux 镜像服务提供者了,还在遥远的 ubuntu 5.04 版本的时候就在用。ustc 的 docker 镜像加速器速度很快。ustc docker mirror 的优势之一就是不需要注册,是真正的公共服务。

https://lug.ustc.edu.cn/wiki/mirrors/help/docker
编辑该文件:

1
vi /etc/docker/daemon.json

在该文件中输入如下内容:

1
2
3
{
	"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

Docker 启动与停止

systemctl 命令是系统服务管理器指令

启动 docker:

1
systemctl start docker

停止 docker:

1
systemctl stop docker

重启 docker:

1
systemctl restart docker

查看 docker 状态:

1
systemctl status docker

开机自启动:

1
systemctl enable docker

查看 docker 概要信息

1
docker info

查看 docker 帮助文档

1
docker info

Docker 常用命令

查看镜像

1
docker images

REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像 ID
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
这些镜像都是存储在 Docker 宿主机的/var/lib/docker 目录下

搜素镜像

如果你需要从网络中查找需要的镜像,可以通过以下命令搜索

1
docker search 镜像名称
1
2
3
4
5
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的

拉取镜像

拉取镜像就是从中央仓库中下载镜像到本地

1
docker pull 镜像名称

例如,我要下载 centos7 镜像

1
docker pull centos:7

删除镜像

按镜像 ID 删除镜像

1
docker rmi 镜像 ID

容器相关命令

查看正在运行的容器

1
docker ps

查看所有容器

1
docker ps -a

查看最后一次运行的容器

1
docker ps -l

创建与启动容器

###创建容器常用的参数说明:
创建容器命令:docker run
  -i:表示运行容器
  -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
  –name :为创建的容器命名。
  -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)可以使用多个-v 做多个目录或文件映射。     注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
  -d:在 run 后面加上-d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,
    如果只加-i -t 两个参数,创建后就会自动进去容器)。
  -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射 alt docker端口映射

交互式方式创建容器

1
docker run -it --name=容器名称 镜像名称:标签 /bin/bash

这时我们通过 ps 命令查看,发现可以看到启动的容器,状态为启动状态
退出当前容器

1
exit

守护式方式创建容器:

1
docker run -di --name=容器名称 镜像名称:标签

登录守护式容器方式:

1
docker exec -it 容器名称 (或者容器 ID) /bin/bash

停止与启动容器

停止容器

1
docker stop 容器名称(或者容器 ID)

启动容器

1
docker start 容器名称(或者容器 ID)

删除容器

1
docker rm 容器id(CONTAINER ID)

删除镜像

1
docker rmi REPOSITORY(镜像名)

文件拷贝

如果我们需要将文件拷贝到容器内可以使用 cp 命令

1
docker cp 需要拷贝的文件或目录 容器名称:容器目录

也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或目录

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通 过修改宿主机某个目录的文件从而去影响容器。创建容器 添加-v 参数 后边为 宿主机目录: 容器目录,例如:

1
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7

应用部署

MySQL 部署

拉取 mysql 镜像

1
docker pull centos/mysql-57-centos7

创建容器

docker参数$\color{red}{–restart=always}$ 的作用

1
创建容器时没有添加参数  --restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动。
1
docker run -di --name=tensquare_mysql(容器名) --restart=always -p(设置端口号映射) 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql(镜像名)
1
2
3
4
p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登陆密码
(3)远程登录 mysql
连接宿主机的 IP ,指定端口为 33306

Tomcat 部署

拉取镜像

1
docker pull tomcat:7-jre7

创建容器 创建容器 -p 表示地址映射

1
docker run -di --name=mytomcat -p 9090:8080 tomcat:7-jre7

Nginx 部

拉取镜像

1
docker pull 

创建 Nginx 容器

1
docker run -di --name=mynginx -p 80:80 nginx

Redis 部署

拉取镜像

1
docker pull redis

创建容器

1
docker run -di --name=myredis -p 6379:6379 redis

迁移与备份

容器保存为镜像

我们可以通过以下命令将容器保存为镜像

1
docker commit mynginx mynginx_i

镜像备份

我们可以通过以下命令将镜像保存为 tar 文件

1
docker save -o mynginx.tar mynginx_i

镜像恢复与迁移

首先我们先删除掉 mynginx_img 镜像 然后执行此命令进行恢复

1
docker load -i mynginx.tar

-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复

什么 Dockerfile

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新 的镜像。

  1. 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  2. 对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了;
  3. 对于运维人员:在部署时,可以实现应用的无缝移植。

.常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
命令 作用
FROM image_name:tag		 定义了使用哪个基础镜像启动构建流程,例如tomcat,他依赖于jdk,那么这里就写jdk的版本,像jdk他不依赖于其他东西,这里也要写上最基础的依赖,就写当前系统,centos:7
MAINTAINER user_name	 声明镜像的创建者
ENV key value 			 设置环境变量 (可以写多条)
RUN command 			 是 Dockerfile 的核心部分(可以写多条) 指在执行构建期间需要做些事,因此在这里指定
ADD source_dir/file		 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
dest_dir/file
COPY source_dir/file	 和 ADD 相似,但是如果有压缩文件并不能解压
dest_dir/file
WORKDIR path_dir 		 设置工作目录

使用脚本创建镜像

alt jdk制作镜像 步骤:

  1. 创建目录
1
mkdir –p /usr/local/dockerjdk8
  1. 下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
  2. 创建文件 Dockerfile vi Dockerfile
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#依赖镜像名称和 ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER JEREMY
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径 jar,把 java 添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $JAVA_HOME/bin:$PATH			

#:$PATH(表示在当前PATH的value下,进行追加,如果没有加该参数则会覆盖全部的value)
  1. 执行命令构建镜像
1
2
3
4
docker build -t='jdk1.8' .       			

'jdk1.8' 为构建完之后的镜像名字, 
. 点代表是当前路径下,如果要别的路径则修改过来即可

注意后边的空格和点,不要省略 5. 查看镜像是否建立完成

1
docker images

Docker 私有仓库

私有仓库搭建与配置

  1. 拉取私有仓库镜像(此步省略)
1
docker pull registry
  1. 启动私有仓库容器
1
docker run -di --name=registry -p 5000:5000 registry
  1. 打 开 浏 览 器 输 入 地 址 http://192.168.184.141:5000/v2/_catalog 看到{“repositories”:[]} 表示私有仓库搭建成功并且内容为空
  2. 修改 daemon.json (/etc/docker/daemon.json) 添加以下内容,保存退出。
1
{"insecure-registries":["192.168.184.141:5000"]}

此步用于让 docker 信任私有仓库地址 5. 重启 docker 服务

1
systemctl restart docker

镜像上传至私有仓库

  1. 标记此镜像为私有仓库的镜像
1
docker tag jdk1.8 192.168.184.141:5000/jdk1.8
  1. 再次启动私服容器
1
docker start registry

3.上传标记的镜像

1
docker push 192.168.184.141:5000/jdk1.8

alt docker私有仓库