Docker 容器是 Docker 学习中另外的一个核心点。

上一讲我们说了镜像,接下来就需要将我们拉取下来的镜像进行运行,而运行的地方就是在容器中。

一、容器介绍

dockerhub kafka最新版本 docker 2021_容器

Docker 容器可以说完全沙箱,相互独立,而且性能开销低,不依赖其他任何语言、框架系统。这样我们的应用程序,类似 Redis、Nginx、MySQL 等都可以放心运行在 Docker 容器中。

二、Docker 容器的使用

这里我们去拉取两个新的镜像,下面要用,提前拉取好(这里不强求,但是需要两个不一样的镜像)。

docker pull tomcat:9.0.60

docker pull tomcat:9.0

1. 创建&运行容器

Docker 容器的运行是需要有镜像的,一般不会去启动一个空的容器~~(有需要的朋友可以自己去搜索 “Docker 如何启动一个空容器”)。

命令:docker run 指令... 镜像Id/镜像名称:版本

dockerhub kafka最新版本 docker 2021_创建docker容器_02

(先忽略 -p 8080:8080,博客下面我们会说)这里如果我们通过直接使用镜像名称进行启动的话,可以看到它是给我们一个提示,说是无法找到镜像 tomcat:latest,如果我们不阻止这个命令,就会像之前的 hello-world 一样,去镜像仓库进行拉取镜像,然后再进行启动了,所以我们这里在 tomcat 后面加上具体的 TAG 版本(建议不用这种方式,麻烦,后面我们通过镜像id 进行区分要使用的镜像)。

dockerhub kafka最新版本 docker 2021_容器_03

我这里启动的是 9.0 版本,可以看到,tomcat 的日志已经输出了,接下来我们访问一下。

dockerhub kafka最新版本 docker 2021_docker_04

我这里访问的时候出现 404,当然,这个问题可以解决,但是需要我们学习新的命令,先不管~,后面学到这里的时候我们再讲。

这里启动我们是没有办法关闭当前的终端的,当我们 ctrl + c 停止后,tomcat 容器就停止运行了,再来看一下。

dockerhub kafka最新版本 docker 2021_docker容器_05

可以看到,我这里是停止掉后,再请求 tomcat 就无法访问此网站了。

这里来说一下启动时候常用的一些参数:

序号

指令

功能

简单说明

1

-d

后台运行容器,并返回容器ID

2

-i

以交互模式运行容器,通常与 -d 或 -t 同时使用

3

-t

为容器重新分配一个伪输入终端,通常与 -i 同时使用

4

-P

随机端口映射,容器内部端口随机映射到主机的端口

docker run -P xxx镜像:TAG

5

-p

指定端口映射,格式为:宿主机端口:容器端口

docker run -p 80:8080 xxx镜像:TAG,将容器 8080 端口映射到宿主机 80 端口

6

--name

为当前容器指定一个名称

docker run --name zhangsan xxx镜像:TAG,将当前容器名称命名为:zhangsan

7

-e

设置环境变量

docker run -e username="ritchie" xxx镜像:TAG

8

-v 或 --volume

将宿主机目录和容器目录进行绑定,格式:/宿主机目录:/容器目录

docker run -v xxx

这里我们后面会一边学习一边使用的,先混个脸熟~

我们上面其实已经使用过一个指令了:-p,下面我们可以尝试用用其他的。

docker run -id --name lemon1234_tomcat -p 8080:8080 镜像id

dockerhub kafka最新版本 docker 2021_容器_06

可以看到,当我们以 -d 的方式启动后,tomcat 就变成后端启动了,终端也就可以继续干别的事了。其他的命令也可以先自己尝试一下~

2. 查看容器

刚刚我们成功的启动了两个容器,现在来查看一下这两个容器。

命令:docker ps 指令...

dockerhub kafka最新版本 docker 2021_docker容器_07

可以看到,我们通过 docker ps 命令查看到其中的一个容器信息,而我们刚刚是启动了两个,虽然另外一个被我们关闭了。

这里我们可以通过增加指令:-a

dockerhub kafka最新版本 docker 2021_docker容器_08

可以看到,通过 -a,我们可以查看到当前宿主机中所有启动过的容器信息。(这里除去 -a,还有很多别的,自己可以去查一下~)

简单说一下 title 的意思:

CONTAINER ID:容器 id;有了这个 id,会方便我们后面操作这个容器,包括重启、停止等操作。

IMAGE:镜像;这里我们可以看到,有两种显示,一个是镜像id,还有一个是镜像名称:TAG,其实这个和我们启动时候有关。

STATED:容器状态;如果是 Exited xxx 就说明这个容器已经停止了,具体的时间看 Exited 后面的。

PORTS:当前容器占用的端口;

NAMES:容器别名;该名字就是我们通过启动时 --name 进行设置的,如果不写,docker 会默认给予一个。

3. 删除容器

比如说上面的两个容器,现在我们将容器已经停止的删除。

命令:docker rm 参数... 容器id...

dockerhub kafka最新版本 docker 2021_docker容器_09

可以看到,我们已经将该容器删除了。

如果我们现在删除另外运行中的容器,来看看会发生什么。

dockerhub kafka最新版本 docker 2021_docker容器_10

可以看到,提示错误。错误信息内容:守护线程异常,我们无法删除一个正在运行的容器,最好在删除前将这个容器停止掉。

这里我们可以使用 -f 参数(通过 SIGKILL 信号强制删除一个运行中的容器)进行强制删除。

dockerhub kafka最新版本 docker 2021_dockerhub kafka最新版本_11

如果要删除多个容器,只需要在后面再加容器 id 即可(和删除镜像很相似)。