Docker(一)

Docker(一)

Docker是一个容器技术,容器不仅仅只有Docker,但Docker一定是使用人数最多的容器技术。

和Docker一样属于容器技术的还有Kubernetes,因为其单词太长,也被简称为k8s。

Docker的发展史

Docker早在2004年,在Solaris系统中就提供了容器的功能。

在2008年,在Linux系统中也提供了相应的容器化支持。代号为 LXC 1.0。

到了2013年,Docker的母公司dotCloud开始在内部项目中使用docker。此时docker已经诞生了。

同年,Docker开源,发布了第一个开源版本。

到了2016年,Docker发布了第一个社区版本和企业版本。企业版和社区版在底层的完全相同的。企业版在企业应用上提供了相应的支持。

安装Docker

Docker的安装比较简单, 可以跟随这篇进行安装

CentOS 8 安装docker

在安装过程中,我碰到了一个问题,报了这么一个错

Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3

CentOS 8.0 安装docker 报错

安装完成

Docker基本概念

Docker是提供应用打包,部署与运行应用的容器化平台

Docker体系结构

Docker体系结构如图,Client会通过RestApi向Server发送请求。Server处理完成后通过RestApi返回结果。

也就是说,Client和Server是通过Http协议来进行通信的。所以Docker的兼容性和扩展性是很好的。

Docker的Server中主要核心有docker daemon。负责镜像的获取,容器创建都是docker daemon的主要职责。

镜像

镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的集装箱

容器

容器是镜像的实例,由Docker负责创建,容器之间彼此隔离。

Docker工作流程

docker的工作流程如上图。

其中中间部分最主要的是docker daemon。由docker daemon管理容器和本地镜像。

右边部分是远程仓库,保存了各种各样的镜像。

左边部分是客户端,用来向server端发送请求。

举个例子,若想要部署一个redis容器,从客户端发出一个docker pull redis, 这个命令会发送到server端。由docker daemon接收。

docker daemon会先在本地的images中查看是否有redis镜像,如果没有就会从远程仓库中下载一个redis镜像。

docker pull的命令就结束了,就只是从远程下载一个相应的镜像。

要启动这个redis容器,需要再发送一个docker run redis,docker daemon接收到这个请求后,发现本地已经有了redis镜像,就会根据这个镜像创建一个redis容器,由这个容器提供对外的服务。

这个容器内部其实是一个迷你的linux系统,创建这个系统并运行其中的redis只需要一句docker run即可。

Docker快速部署Tomcat

  • docker poll 镜像名<:tags> 从远程仓库抽取镜像 tags代表版本
  • docker images 查看本地镜像
  • docker run 镜像名<:tags> 创建容器,启动应用
  • docker ps 查看正在运行中的镜像
  • docker rm <-f> 容器id 删除容器, -f代表如果容器正在运行,强制删除
  • docker rmi <-f> 镜像名<:tags> 删除镜像

部署tomcat

进入hub.docker.com,这里存放了所有的docker镜像。

直接搜索tomcat,会出现很多版本,包括官方版本,三方版本和个人版本。直接选择官方版本。

往下翻还有一些对应的介绍,包括tags的选择,可以点击查看镜像中装载的环境。

那么直接开始部署tomcat容器。

docker pull tomcat

因为没有加tags,所以默认是latest。 等待下载完成

下载完成后,查看本地docker镜像

docker images

可以看到镜像的名称,tag, 镜像id, 创建时间和大小

镜像下载完成后,可以开启容器。

docker run tomcat

依然可以选择tomcat版本,不写默认是latest。

运行结束后,log会显示已经开启在8080端口。

但是并不是直接就可以在8080端口进行通信,因为从外部的请求并不能直接发送到容器的指定端口上。

外部的请求最多只能请求到物理机的端口,而物理机的端口又没有相应的处理方法。

因此需要对端口做一个映射才可以将远程的请求转发到容器的指定端口上。

容器与物理机端口映射

要增加容器和物理机之间的端口映射也很简单。

docker run -p 8888:8080 tomcat

只需要加上-p的选项,将物理机的8888端口映射到容器的8080端口即可。

容器后台运行

因为刚才我们运行的容器都是前台运行,当使用ctrl+c后就会退出容器。

因此需要使容器进入后台运行。

只需要加上-d参数

docker run -p 8888:8080 -d tomcat

即可使docker后台运行,而且会返回一个容器编号。

查询docker运行状态

docker ps

可以查看到docker容器的容器id,镜像名等信息。

移除docker容器

docker rm id

此处的id就是上一步查询运行状态时,输出的容器id。

运行后会报错,提示大意为不能移除一个正在运行的容器,如果要删除,应该先stop。

此时要么先

docker stop id

然后再进行移除。

要么根据前面说的,添加参数-f

docker rm -f id

这样来强制移除容器。

移除docker镜像

docker rmi id

同样是不能移除正在运行的镜像,要停止再进行删除,或使用-f强制移除。

容器内部结构

之前的内容都是使用,那么既然说容器启动后,是一个微型的linux。 他内部的结构是什么样呢。

在hub.docker.com中,镜像的tags可以链接到github中的dockerFile,其中的结构就是由dockerFile定的。

Tomcat容器内部结构

tomcat容器主要有三个组件, Linux, jdk和tomcat。

可以看到,容器内部是有一个操作系统的,也就是说,可以使用linux的指令操作。这就牵扯到一个问题,如何使用该容器内部的操作系统呢?

在容器中执行命令

  • 格式: docker exec [-it] 容器id 命令
  • exec在对应容器中执行命令
  • -it 采用交互方式执行命令

在进入容器中后,使用ll发现command not found,因为容器中的操作系统是精简的,只有安装java和tomcat支持的命令。

使用cat /proc/version查看linux版本, java -version查看java版本。

要退出可以输入exit。

容器存放目录

容器存放在物理机的/var/lib/docker目录中。

image中存放镜像,containers中存放容器。

容器生命周期

docker run命令会将容器直接创建并启动,docker create则只创建容器不启动。只有当docker start命令后才会启动容器。

docker killdocekr stop都会将容器停止,区别在于,docker kill会将容器置为死亡状态,当再次运行这个容器的时候,会重新去创建容器,而stop只要重新run即可。大多数情况下使用stop即可。

还有一点特殊的地方, 如果容器碰到异常情况,如out of memory时,容器也会进入不可用状态,由docker的是否重启策略进行判断是否重启。


   转载规则


《Docker(一)》 echi1995 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Docker(二) Docker(二)
Docker(二)上一篇简单认识了Docker,并且基于已有的镜像运行了容器。 Docker构建镜像既然有官方提供的镜像,那么自己也可以进行docker镜像的制作。 DockerFile DockerFile是一个包含用于组合镜像的命令的文
下一篇 
消息中间件(一) 消息中间件(一)
消息中间件之ActiveMQ首先先看一个例子: 完成一个功能需要三步调用, step1耗时15ms, step2耗时100ms,step3耗时300ms。 如果是同步调用 , 返回到用户的时间是415ms。 这样肯定是响应较慢的,用户体验
  目录