Docker

1、Docker简介

Docker是一个开源的应用容器引擎,基于GO语言开发;
容器是完全使用沙箱机制,容器开销极低;
Docker就是容器化技术的代名词
Docker也具备一定虚拟化职能

2、Docker主要提供标准化的应用打包功能

image.png

3、Docker的发展

image.png

4、Docker官网地址

https://www.docker.com/

5、Centos7环境安装Docker

可以通过官方给出的步骤进行安装


image.png

(1)、克隆一台虚拟机,并修改hostname和ip地址

(2)、yum install -y yum-utils

安装yum的工具集(-y表示自动确认)

(3)、安装docker所需要的两个数据存储驱动包

yum install -y device-mapper-persistent-data lvm2
image.png

(4)、设置阿里云的安装源

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

(5)、使设置的安装源生效

yum makecache fast
image.png

(6)、安装docker

yum -y install docker-ce
image.png

(7)、启动docker

systemctl start docker
image.png

(8)、查看docker版本信息

docker version
image.png

(9)、拉取hello-world镜像

docker pull hello-world
image.png

(10)、运行hello-world

image.png

至此说明,docker安装成功

(11)、阿里云Docker镜像加速

在上面的pull镜像的时候,默认是去国外的中央仓库下载镜像文件的,这样大概率是会失败的,如下图就是我的一次pull超时的截图,大多数人在遇到这种情况的时候都会选择再次去pull直到成功为止,对于这种操作我们肯定是不希望看到这种解决方案的,那么有没有更好的解决方案呢?答案是肯定的。使用阿里云的Docker镜像代理来加速。


image.png

(11.1)、登录https://www.aliyun.com

在搜索框输入 "容器镜像服务",回车或者点击搜索


image.png

在新页面中点击立即开通


image.png

在镜像中心中选择镜像加速器
image.png

在这里阿里云会为每个人生成一个加速器地址


image.png

image.png

验证一下,我们pull一个tomcat试一下速度
docker pull tomcat
image.png

是不是速度明显快很多,至此我们的docker整体就安装完成了,接下来就让我们进入到docker的乐园吧

6、Docker基本概念

Docker是容器化平台
Docker是提供标准化应用打包,部署与运行应用的容器化平台。在有了容器之后,我们的应用程序无需直接部署在物理机或者虚拟机上了,而是部署在Docker引擎之上。
可用资源:像物理机或者我们在阿里云或腾讯云上购买的虚拟机等我们看的着的资源(CPU、内存等)称之为可用资源


image.png

(1)、Docker体系结构

Docker包含了三个部分,Server (Docker daemon:docker服务的守护进程)、REST API、Client (Docker cli:docker客户端);docker客户端通过rest api(http协议)与docker服务端进行通讯,下载镜像、运行容器等,从下图中不难看出,通过rest api我们的运维工程师可以通过docker客户端维护多个docker服务端


image.png

(2)、容器与镜像

镜像:镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"。
容器:是镜像的实例,由docker负责创建,容器之间彼此隔离;所有的容器可以被docker统一管理,可以灵活的新增或删除。
举个生活中的小例子来解释说明一下镜像与容器的概念:
镜像就相当于我们平时在购买电脑时附带的系统关盘,而容器呢就相当于一台一台的PC机


image.png

(3)、docker的执行流程

image.png

以使用docker快速部署一个nosql数据库redis为例:
首先客户端向服务端发送一个docker pull redis命令,docker daemon接收到这条指令之后首先在本地仓库images中寻找是不是以及存在redis镜像,如果本地仓库中没有任何关于redis的镜像,docker daemon就会去远程仓库下载关于redis的镜像,下载完成之后,这个命令就执行完成了。
docker pull redis命令只是下载一个只读的镜像文件,仅仅只是下载一个只读的镜像文件是不行的,还需要通过docker run redis命令启动一个容器,并且对外提供redis服务。

7、docker常用命令

(1)、docker pull 镜像名<:tags>

从远程仓库抽取镜像;
docker:表示你所安装的docker客户端
pull:是具体执行的命令
镜像名:每个镜像都有具体的名字,通过镜像名来指定你要抽取的镜像文件
tags:在一个镜像下可能会有多个不同的版本,在docker中你可以在镜像名后面加上:tags就可以了,如果不加这个tags,docker默认会下载最新的镜像文件

(2)、docker images

查看本地已抽取的镜像

(3)、docker run 镜像名<:tags>

由docker自动创建容器,启动应用;如果在执行run命令的时候,镜像还没有被抽取的话,run命令会首先去pull这个镜像到本地,在run这个镜像。

(4)、docker ps

查看正在运行中的镜像
注意ps默认只会列出正在运行的容器,如果要查看所有容器可以 docker ps -a

(5)、docker rm <-f> 容器id

删除容器,如果在删除容器的时候,容器还在运行的话,加上-f表示强制删除

(6)、docker rmi <-f> 镜像名<:tags>

删除指定版本的镜像,-f表示强制删除(如果这个镜像存在了对应的容器,加上-f也可以删除)

(7)、示例

下面通过快速安装部署一个tomcat来演示这些命令

第一步:查找镜像

首先访问docker的中央仓库 <u>https://hub.docker.com/</u> 在页面的搜索框中输入tomcat

image.png

在搜索结果页面,我们选择tomcat官方提供的镜像文件,点击进入详情页面
image.png

image.png

第二步:下载镜像

docker pull tomcat 下载使用最多的tomcat版本镜像文件


image.png

下载指定版本的


image.png

可以通过docker images查看已下载的镜像文件
image.png

第三步:创建容器,启动应用

docker run tomcat:8.5.56-jdk8-openjdk
image.png

这时候服务虽然起来了,但是并不是在外界输入服务器ip地址加8080端口号就能访问的,原因在于docker宿主机与容器的通信


image.png

如上图所示,目前宿主机还不知道该如何访问docker容器中8080端口的应用,那么如何解决这一问题呢?docker给出了一个解决方案:进行端口映射
所谓端口映射就是通过宿主机上的一个端口与容器的端口进行绑定,达到下图的效果


image.png

在shell中按ctrl+c退出容器
image.png

输入docker run -p 8000:8080 tomcat:8.5.56-jdk8-openjdk
image.png

这个时候我们再次在浏览器上输入对应的ip:8000就能访问到容器中的8080应用了,不过意外的是,我访问的时候出现了404(虽然是404,但是可以肯定的是宿主机的8000端口已经和容器的8080应用映射上了)


image.png

那么如何解决这个404的,出现404一般我们会猜测是否端口被防火墙拦住了(这个可以排除,因为我们在搭建虚拟机的时候,已经把0-65535的端口号都对外暴露了),第二个查看是否tomcat的webapp下没有可运行的项目呢?
image.png

进入到webapps目录下,发现空空如也
针对这种情况我们只需要把webapps.dist目录下的ROOT文件夹复制到webapps下即可
image.png

再次刷新浏览器即可访问了
image.png

后台运行tomcat容器
image.png

查看服务器端口占用情况
image.png

停止容器
首先查看容器id
docker ps


image.png

docker stop 容器id:停止容器
docker rm 容器id:移除容器
image.png

或者上面的两步可以使用:docker rm -f 容器id来完成
image.png

不过在显示还是建议使用docker stop 容器id这样的方式来移除容器

移除镜像


image.png

上面的操作也可以直接通过 docker rmi -f 镜像id来移除(这种方式不建议使用)

8、容器内部结构

在上面的示例中,我们通过简单的run命令就创建了tomcat容器,并且在一瞬间就完成了tomcat应用的部署;到目前位置我们都是站在使用者的角度,从外侧进行调用的,能看到的只是tomcat的日志,但是容器内部到底包含哪些内容呢?这一部分我们就开始分析一下tomcat容器内部有哪些组件吧。
首先我们想了解容器内部结构最直观的方式就是从docker hub中了解对应镜像的详细内容了。


image.png

tomcat容器内部结构


image.png

注意tomcat容器中的Linux操作系统是一个迷你版的操作系统

(1)、在容器中执行命令

即进入容器内部
格式:docker exec [-it] 容器id 命令
exec:在对应容器中执行命令
-it:采用交互方式执行命令
示例: docker exec -it d17f987d4ebb /bin/bash (这里的/bin/bash会开启一个接收后续命令的终端)


image.png

(2)、docker退出容器命令

exit
image.png

(3)、docker默认存放位置

说明:docker安装好以后默认存放路径是 /var/lib/docker
这个目录下image目录存放镜像文件,containers目录存放容器;如非必要不建议修改默认存放位置


image.png

9、容器生命周期

image.png

上图中椭圆表示容器状态,方框表示事件
(1)、首先通过docker run命令是产生两个事件,创建容器create、启动容器start;这时容器的状态就变成running状态。
(2)、除上面这个命令之外还可以通过docker create来创建容器,这个时候仅仅只是创建了一个容器,容器并未被启动,这个时候容器的状态是stopped状态,通过docker start 命令启动容器,这个时候容器的状态就变成start状态
docker run 和 docker create两者最大的区别就在于它们是否执行了start命令使容器变成start状态
(3)、docker stop和docker kill命令首先都会触发一个die事件,而stop命令在die事件之后会触发一个stop事件将容器置为不可用状态(并不会真正的杀死这个容器),而kill命令在die事件之后会触发一个kill事件使容器销毁变成stopped状态。当后续再次通过docker start命令启动容器的时候,通过kill命令杀死的容器会创建一个新的容器,而通过stop命令停止的容器会将之前处于stopped状态的容器重新启动起来。
(4)、docker restart命令是重启容器,会先触发die事件将当前容器置为不可用状态,然后再触发start或者restart事件使容器重新变成start状态
(5)、docker pause命令是暂停服务的意思,它会触发一个pause事件,是当前容器处于已暂停paused状态,再通过docker unpause命令触发一个unpause事件,使已暂停的容器重新变成运行running状态
(6)、当容器出现OOM事件时,会触发一个die事件将容器变为不可用状态,然后容器会根据重启策略判断是否需要重启,如果是yes则触发start事件将容器变为start事件,如果是no则将容器置为stop状态
(7)、当容器在stop状态下执行docker rm命令,会触发一个delete事件,删除容器,此时的容器是delete已被删除状态


image.png

10、Dockerfile构建镜像

Dockerfile是镜像描述文件,是一个包含用于组合镜像的命令的文本文档,docker通过读取Dockerfile中的指令按步自动生成镜像。

构建镜像文件命令格式:
docker build -t 机构/镜像名<:tags> Dockerfile目录

(1)、示例

自定义一个镜像,在原有tomcat安装完的基础上自动的将名为docker-web的应用发布到tomcat镜像中
第一步:在电脑的任意位置创建一个first-dockerfile目录
第二步:在first-dockerfile目录中创建docker-web目录和Dockerfile文件(无后缀名)
docker-web中我放了一个index.html文件,内容如下

<h1>我是Docker应用首页

Dockerfile文件中的内容如下

# FROM代表设置基准镜像(相当于从原有的镜像文件中进行扩展)
FROM tomcat:latest
# MAINTAINER:用于说明当前镜像由哪个人或者哪个机构来维护的,它没有任何执行功能,只是一个说明信息
MAINTAINER yubin.com
# WORKDIR 用于切换工作目录,不存在则创建 这个目录可以docker exec -it 容器id /bin/bash来查看 相当于cd /usr/local/tomcat/webapps
WORKDIR /usr/local/tomcat/webapps
# 用于将指定的文件或者目录复制到镜像的指定目录下,也就是说将docker-web目录下的所有文件复制到容器的docker-web目录下
ADD docker-web ./docker-web

第三步:将first-dockerfile目录上传到虚拟机上


image.png

第四步:进入/usr/image/first-dockerfile目录,执行

docker build -t yubin.com/mywebapp:1.0 .
image.png

第五步:通过镜像文件创建容器,发布应用


image.png

第六步:通过浏览器访问


image.png

大功告成,so easy
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270