Docker

Posted 杀手不太冷!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker相关的知识,希望对你有一定的参考价值。

Docker

Docker概念

发布一个项目jar包,本来发布的时候可能是一分钟的事情,但是你可能因为要配置一些环境,最后一天都搞不好,你可能要配置(Redis,mysql,jdk…)等环境,那如果我们可以在发布jar包的时候,把这些环境自动的给带上,那该有多好啊,而Docker就是干这个事情的:项目能带上环境安装打包。

我们在机器上发布一个项目到其他的机器上,可能其他的机器上是不能运行这个项目的,因为这个机器上没有配置这个项目的环境,而使用Docker就可以在发布项目到另外一个服务器的时候,同时把它所需要的环境也同时发布上去。

Docker上的每个容器之间都是相互隔离的。

把项目和环境打包在一起发布,这种方式叫做镜像,我们会把打包的东西都放在Docker仓库里面,这个仓库相当于是一个商店,我们可以下载在Docker中发布的镜像,然后直接运行即可,镜像运行之后就叫做容器。

Docker机制:隔离,镜像。

Docker是用Go语言开发的,是一个开源项目。

官网:https://www.docker.com/

Docker中的名词概念

镜像(image):

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有的内容,包括代码,运行时库,环境变量和配置文件等。

所有的应用,直接打包docker镜像,就可以跑起来。

容器(container):

可以把容器理解成是一个简单的linux系统,镜像run之后,就会产生一个容器,容器是镜像跑起来之后的结果。

镜像run之后,它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。

当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。

我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。

如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。

如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则我们可能会导致损失容器中所有数据的后果。

仓库(repository):

仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库。

镜像仓库服务:

Docker 镜像存储在镜像仓库服务(Image Registry)当中。

Docker 客户端的镜像仓库服务是可配置的,默认使用 Docker Hub。

镜像仓库服务包含多个镜像仓库(Image Repository)。同样,一个镜像仓库中可以包含多个镜像。

可能这听起来让人有些迷惑,所以下图展示了包含 3 个镜像仓库的镜像仓库服务,其中每个镜像仓库都包含一个或多个镜像。

官方和非官方镜像仓库

Docker Hub 也分为官方仓库(Official Repository)和非官方仓库(Unofficial Repository)。

顾名思义,官方仓库中的镜像是由 Docker 公司审查的。这意味着其中的镜像会及时更新,由高质量的代码构成,这些代码是安全的,有完善的文档和最佳实践。

非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!非官方仓库中也有一些很优秀的镜像。

在信任非官方仓库镜像代码之前需要我们保持谨慎。说实话,读者在使用任何从互联网上下载的软件之前,都要小心,甚至是使用那些来自官方仓库的镜像时也应如此。

大部分流行的操作系统和应用在 Docker Hub 的官方仓库中都有其对应镜像。这些镜像很容易找到,基本都在 Docker Hub 命名空间的顶层。

如果曾经做过 VM 管理员,则可以把 Docker 镜像理解为 VM 模板,VM 模板就像停止运行的 VM,而 Docker 镜像就像停止运行的容器;而作为一名研发人员,则可以将镜像理解为类(Class)。

首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。

拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。

镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。

因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。

前面多次提到镜像就像停止运行的容器(类)。实际上,可以停止某个容器的运行,并从中创建新的镜像。

在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构,如下图所示。

安装Docker

自己去网上搜索相关的mac安装教程就可以了。这个网上都有,不用仔细记。

Docker是怎么工作的

Docker采用的是Client/Server架构,客户端向服务器发送请求,服务器负责构建,运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远程的服务器通信。Docker的守护进程运行在主机上,通过Socket,客户端可以向守护进程发送命令,守护进程接收到客户端发送来的指令就会执行。

Docker 的核心组件包括:

  1. Docker Client
  2. Docker daemon
  3. Docker Image
  4. Docker Registry
  5. Docker Container

Docker的常用命令

docker的官网地址:https://www.docker.com/

如何在mac电脑中使用docker命令,首先启动docker,如下图:

帮助命令

docker version        #显示docker的版本信息
docker info           #显示docker的系统信息,包括镜像和容器的数量
docker --help     #帮助命令

镜像命令

查看镜像

docker images:此条命令可以查看所有本地主机上的镜像

docker images -q:此条命令可以查看所有本地主机上的镜像id

在终端命令行查看所有本地docker中的镜像,如下图:

在docker的可视化窗口中查看本地docker中的所有镜像,如下图:

搜索镜像

docker search 镜像名字:此命令可以用来搜索镜像

拉取镜像

docker pull 镜像名字:此命令可以下载镜像,默认下载的会是最新的版本镜像

docker pull 镜像名字:版本名字 此命令可以指定镜像的版本号下载

那么如果想要指定版本号的下载,该怎么办呢?首先你要知道docker对应的远程镜像仓库里面存在的mysql版本号,怎么查找呢?如下图:

然后点击页面上的mysql链接,如下图:

拉取指定的5.7版本的镜像mysql,如下图:

删除镜像

docker rmi -f $(docker images -q): 删除所有的镜像

docker rmi -f 镜像id: 根据镜像id删除镜像

删除5.7版本的mysql镜像的命令:docker rmi -f 6c20ffa54f86,测试结果如下图:

容器命令

启动容器必须先要有一个镜像,什么镜像都可以,mysql镜像了或者什么了,这里就用centos镜像来测试吧,如下图:

新建容器并启动

docker run [可选参数] image

#参数说明
--name="Name"				#容器名字	tomcat01 tomcat02,用来区分容器
-d									#后台方式运行
-it									#使用交互方式运行,进入容器查看内容
-p									#指定容器的端口
		-p ip:主机端口:容器端口
		-p 主机端口:容器端口
		-p 容器端口
-P									#大P是随机指定端口


新建容器并启动:docker run -it centos /bin/bash

退出容器的命令:exit

列出所有的运行的容器:docker ps

列出所有的容器:docker ps -a

删除一个容器:docker rm -f 容器id

删除所有容器: docker rm -f $(docker ps -a)

执行删除所有容器的命令之后,如下图:

启动和停止容器的操作

docker start 容器id								# 启动容器
docker restart 容器id							# 重启容器
docker stop 容器id								#	停止当前正在运行的容器
docker kill 容器id								#	强制停止当前容器

启动容器,进入容器的命令

#启动容器的命令,注意最后的/bin/bash一定要加上,为什么呢?因为如果在docker中启动一个容器之后,没有立即启动一个进程的话,整个容器启动
#之后就会立即自杀,所以你就不能启动容器了,而加上/bin/bash的作用就是,在启动docker容器之后会启动它内部的bash进程,这样它就不会自杀
# -it 参数的作用是交互式运行,必须要加上才可以成功启动
docker run -it 镜像名字 /bin/bash

#进入后台运行的容器的命令
docker exec -it 容器id /bin/bash

#如下图:

部署Tomcat

#下载tomcat
docker pull tomcat:9.0

#启动运行,其中-p是用来进行端口映射的,就是说在docker中,tomcat的端口号是8080,但是如果用这个端口号在浏览器访问,是访问不到的,所以要就行端口映射,这样就可以在外部浏览器里面访问端口号是8080的tomcat服务了
docker run -it -p 2244:8080 --name tomcat10 tomcat /bin/bash

docker中成功运行了tomcat服务器,如下图:

接着去浏览器里面访问tomcat,发现不能访问,如下图:

在docker中可以成功的启动tomcat容器,但是不能够访问tomcat,上面的这个问题周一问俊杰。俊杰一分钟搞定了,就是因为没有启动tomcat服务器,成功启动tomcat服务器之后就可以访问tomcat服务器了,如下图:

启动tomcat服务器之后,tomcat就可以成功访问了,如下图:

在外部浏览器中可以访问tomcat还有关键的一步,这一步如果没有,即便你开启了tomcat服务,也是不能够访问tomcat服务的,哪一步呢?就是你必须要把webapps.list文件夹中的内容复制到webapps文件夹中才行,如下图:

curl指令的作用

可以测试一下linux中的某个端口号是否是可以访问的,如下图:

如果要是连接失败的话,就表示tomcat服务没有开启,需要手动开启。

以上是关于Docker的主要内容,如果未能解决你的问题,请参考以下文章

markdown docker-compose片段

sh Docker片段

《Docker 源码分析》全球首发啦!

docker 部署 coredns(内部域名解析)

docker 部署 coredns(内部域名解析)

将 Docker 容器限制为单个 cpu 核心