Docker 容器是 Docker 学习中另外的一个核心点。
上一讲我们说了镜像,接下来就需要将我们拉取下来的镜像进行运行,而运行的地方就是在容器中。
一、容器介绍
Docker 容器可以说完全沙箱,相互独立,而且性能开销低,不依赖其他任何语言、框架系统。这样我们的应用程序,类似 Redis、Nginx、MySQL 等都可以放心运行在 Docker 容器中。
二、Docker 容器的使用
这里我们去拉取两个新的镜像,下面要用,提前拉取好(这里不强求,但是需要两个不一样的镜像)。
docker pull tomcat:9.0.60
docker pull tomcat:9.0
1. 创建&运行容器
Docker 容器的运行是需要有镜像的,一般不会去启动一个空的容器~~(有需要的朋友可以自己去搜索 “Docker 如何启动一个空容器”)。
命令:docker run 指令... 镜像Id/镜像名称:版本
(先忽略 -p 8080:8080,博客下面我们会说)这里如果我们通过直接使用镜像名称进行启动的话,可以看到它是给我们一个提示,说是无法找到镜像 tomcat:latest,如果我们不阻止这个命令,就会像之前的 hello-world 一样,去镜像仓库进行拉取镜像,然后再进行启动了,所以我们这里在 tomcat 后面加上具体的 TAG 版本(建议不用这种方式,麻烦,后面我们通过镜像id 进行区分要使用的镜像)。
我这里启动的是 9.0 版本,可以看到,tomcat 的日志已经输出了,接下来我们访问一下。
我这里访问的时候出现 404,当然,这个问题可以解决,但是需要我们学习新的命令,先不管~,后面学到这里的时候我们再讲。
这里启动我们是没有办法关闭当前的终端的,当我们 ctrl + c 停止后,tomcat 容器就停止运行了,再来看一下。
可以看到,我这里是停止掉后,再请求 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
可以看到,当我们以 -d 的方式启动后,tomcat 就变成后端启动了,终端也就可以继续干别的事了。其他的命令也可以先自己尝试一下~
2. 查看容器
刚刚我们成功的启动了两个容器,现在来查看一下这两个容器。
命令:docker ps 指令...
可以看到,我们通过 docker ps 命令查看到其中的一个容器信息,而我们刚刚是启动了两个,虽然另外一个被我们关闭了。
这里我们可以通过增加指令:-a
可以看到,通过 -a,我们可以查看到当前宿主机中所有启动过的容器信息。(这里除去 -a,还有很多别的,自己可以去查一下~)
简单说一下 title 的意思:
CONTAINER ID:容器 id;有了这个 id,会方便我们后面操作这个容器,包括重启、停止等操作。
IMAGE:镜像;这里我们可以看到,有两种显示,一个是镜像id,还有一个是镜像名称:TAG,其实这个和我们启动时候有关。
STATED:容器状态;如果是 Exited xxx 就说明这个容器已经停止了,具体的时间看 Exited 后面的。
PORTS:当前容器占用的端口;
NAMES:容器别名;该名字就是我们通过启动时 --name 进行设置的,如果不写,docker 会默认给予一个。
3. 删除容器
比如说上面的两个容器,现在我们将容器已经停止的删除。
命令:docker rm 参数... 容器id...
可以看到,我们已经将该容器删除了。
如果我们现在删除另外运行中的容器,来看看会发生什么。
可以看到,提示错误。错误信息内容:守护线程异常,我们无法删除一个正在运行的容器,最好在删除前将这个容器停止掉。
这里我们可以使用 -f 参数(通过 SIGKILL 信号强制删除一个运行中的容器)进行强制删除。
如果要删除多个容器,只需要在后面再加容器 id 即可(和删除镜像很相似)。