购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 docker容器的基础应用

前面介绍docker镜像的常用操作命令,本节将介绍docker容器的常用操作命令。然后以部署MySQL数据库为例,展示docker容器常用命令在实战领域的应用。

2.4.1 docker容器的常用操作命令详解

上一节已经介绍了如何查询、下载、查看和删除docker镜像,相信大家早已经迫不及待地想要进入docker的世界了。执行如下命令,即可启动一个centos的容器。这里面的“-it”参数是指交互的方式。所谓的交互方式就是指启动容器后,直接进入容器了。

执行结果如图2-53所示。我们可以发现并没有直接使用本地存在的7.9.2009的centos镜像,而是下载了latest标签的镜像。这是因为在执行命令中没有指定centos的tag值,这一点和docke pull的处理方式是一致的,即当不指定具体tag值时,默认tag的值为latest。此外,因为本地不存在latest标签的centos镜像,所以在启动容器的时候会下载latest标签的centos镜像。通过提示符的不同,可以看出交互的shell不是虚拟机的shell了,已经进入docker容器了。

图2-53 以交互的方式启动docker容器

此时可以在docker容器中执行一些常用的Linux命令,如图2-54所示。通过centos镜像启动的docker容器,其实跟centos虚拟机是非常类似的,至此可以理解什么是docker容器了。

图2-54 docker容器中执行常用的Linux命令

我们可以看到启动docker容器是秒级的,而平时安装启动虚拟机可能需要数十分钟。到这里,从应用docker的角度,完全可以把docker当作虚拟机使用。当然,随着后续深入对docker容器的学习,可以更容易理解虚拟机的长处。

此时重新打开一个虚拟机的shell窗口,在这个新窗口中,我们可以通过如下命令查看当前运行的docker容器。

这里可以看到正在运行的docker容器的信息,如图2-55所示。第1列为docker容器的id;第2列为docker容器使用的镜像;第3列为docker容器启动后执行的命令,这里是打开了bash;第4列为docker容器创建的时间;第5列为docker容器的状态;第6列为docker容器的端口,这里还没有涉及,后面介绍开放端口的时候再详细介绍;第7列为docker容器的名字,这里因为启动命令中没有指定,因此是一个自动生成的名字。

图2-55 查看docker容器的信息

现在回到docker容器的shell窗口中,执行exit命令即可退出容器,如图2-56所示。

退出容器后,在虚拟机的shell中再次执行docker ps命令,可以看到没有容器了,如图2-57所示。

图2-56 退出容器

图2-57 退出容器后再查看容器

这里需要注意的是,docker ps命令的作用是查看正在运行的容器。当退出以交互的方式启动的容器后,容器就停止运行了,此时可以通过如下命令查看所有容器,包括已经停止执行的。

可以看到容器仍然存在,只不过变为Exited状态了,如图2-58所示。

图2-58 查看所有容器

接下来,我们可以通过执行如下命令将docker容器删除。这里通过指定容器的ID进行删除,当然也可以指定容器的名字。-f参数表示强制删除。需要和删除镜像的命令区分开。删除镜像的命令是docker rmi,删除容器的命令是docker rm,我们可以通过镜像的英文单词image的首字母i区分记忆。

在实际应用中,更多的场景下是通过后台启动docker容器,而不是交互的方式。此外,通过上面对容器的简单体验,我们很容易发现一个问题:当容器坏掉或者被删掉,容器中的数据就不存在了。如果容器都这样,是不可接受的。此时可以通过执行如下命令再启动一个容器。

这里-d参数表示后台启动,前面的-it表示交互的方式启动。此外,这里通过-name指定容器的名称为centos7,参数-v/docker/centos7/opt:/opt是指目录挂载。所谓的目录挂载,实质就是说本地的/docker/centos7/opt目录与docker容器中的/opt目录保持一致,这样即使将容器删除,容器中/opt目录中的文件会保存在本地的/docker/centos7/opt目录中,解决了前面我们担心的容器删除后数据丢失的问题。同时,这里指定了centos镜像的tag值,在实际工作应用中,推荐大家指定具体的tag值。如果不指定tag值,直接使用latest镜像,当官方镜像更新,会导致我们启动的容器同样更新,这就有可能带来软件依赖不兼容等问题。除此以外,最后还指定了一个死循环的shell语句,这主要是为了让docker容器中能一直有程序在运行。因为如果没有程序运行,docker容器就会停止了。

执行后的结果如图2-59所示。此时后台启动了一个容器,容器的名字也按照指定的生成了,第2列镜像也使用了我们指定的tag值的版本。

图2-59 后台启动容器

此时,大家一定很想知道如何才能进入docker容器吧?我们通过执行如下命令即可进入docker容器。这里同样指定了docker容器的ID,当然也可以使用容器的名字。这里的-it跟docker run -it的含义是类似的,即以交互的方式进入docker容器。最后面的bash表示进入容器后直接打开bash的shell进程。

接下来,验证一下容器挂载目录的功能。首先重新打开一个新的虚拟机的shell,查看虚拟机上/docker/centos7/opt/目录下是否有文件,如图2-60所示。可以看到,此时虚拟机上/docker/centos7/opt目录是空的。

接下来进入docker容器窗口,切换到/opt目录。创建一个demo.txt,并向文件中写入hello world,如图2-61所示。

图2-60 虚拟机上的/docker/centos7/opt/目录

图2-61 容器中/opt目录下创建文件并写入内容

在虚拟机的shell中再次查看,可以看到文件已经同步了,如图2-62所示。

接着在虚拟机的/docker/centos7/opt目录下创建一个文件,并写入一段字符串,如图2-63所示。

图2-62 虚拟机中/docker/centos7/opt目录中内容

图2-63 在虚拟机的目录中创建文件

这时在docker的/opt/目录下可以看到文件已同步,如图2-64所示。这里可以看到文件目录的挂载可以将docker容器中的内容存放在虚拟机的磁盘中,这样就解决了数据持久化的问题,即可以使用docker安装部署服务,然后将服务的存储数据的目录挂载到虚拟机上。

图2-64 容器中/opt/目录中内容

挂载目录的方式是启动docker时事先规划好的,但是在实际应用中,常常会遇到一些问题,比如docker容器启动以后,希望将虚拟机上的某个文件拷贝(复制)到容器内,就需要虚拟机和容器之间的文件能够相互拷贝。从虚拟机拷贝文件到容器的命令格式如下。

比如将虚拟机上的/etc/passwd文件拷贝到容器的/opt/目录下,则执行如下命令。其中容器id可以通过docker ps命令查询,这个命令前面已经介绍过了。

执行结果如图2-65所示。

图2-65 文件从虚拟机拷贝到容器中

然后在容器中查看/opt/目录下的文件列表,如图2-66所示。此时passwd文件已经在容器中的/opt/目录下了。

图2-66 容器中/opt/目录下的文件列表

从容器中拷贝文件到虚拟机的命令和上面的类似,只需要将虚拟机的路径和容器路径交换位置即可,具体如下。

同理,如果需要继续将容器中的/opt/passwd文件拷贝到虚拟机的/opt/目录下,可以执行如下命令。

执行结果如图2-67所示。此时passwd文件已经拷贝到虚拟机的/opt/目录下了。

下面继续介绍查看容器日志的命令docker logs。我们可以通过docker logs -help命令查看docker logs命令的用法,如图2-68所示。

图2-67 从容器中向虚拟机拷贝文件

图2-68 docker logs命令的用法

下面我们用实例来进行演示。查看容器的所有日志的命令如下,这里b53eda7d9a98为容器的id,可以通过执行docker ps命令查看,前面已经介绍过。

如下命令中的-n 10表示查看容器的最后10行日志,如图2-69所示。

执行如下命令,可以查看容器的实时日志。该命令与Linux系统中的tail -f命令类似,可以实时观测容器的日志内容。

如下命令加上了-t参数,可以显示时间戳,如图2-70所示。

图2-69 查看容器最后10行日志

图2-70 带时间戳显示日志

接下来继续学习容器的启动与停止,命令如下。其中start为启动容器,stop为停止容器,restart为重启容器,xxx为容器id。

执行实例演示,效果如图2-71所示。

图2-71 容器的启动与停止

至此,docker容器操作的常用命令就介绍得差不多了。接下来再介绍一个查看docker容器详细信息的命令,在使用docker的初级阶段一般不会用到此命令。当我们对docker有一定的了解,并且已经开始应用时,也许会发生docker容器出问题,需要自己去排查的情况,此时就需要掌握如下命令,进行问题排查。其中xxx为容器的ID。

执行这个命令显示的内容比较多,可以看到容器在启动时执行的命令,如图2-72所示。下面将介绍几个常用的信息。

图2-72 查看容器启动时的命令

可以查看容器的挂载目录,比如将容器内的/opt目录挂载到虚拟机上的/docker/centos7/opt目录,如图2-73所示。

图2-73 查看容器的挂载目录

我们还可以查看容器使用的镜像名以及镜像的tag值,如图2-74所示。

图2-74 查看容器使用的镜像信息

至此,容器操作的常用命令就介绍得差不多了。学习完本节,我们应该可以做到以下几点。

1)能够执行创建指定镜像的容器的操作。

2)能够执行查看运行的容器和已经停止的容器的操作。

3)能够执行删除容器的操作。

4)能够执行进入容器的操作。

5)能够执行在容器和虚拟机之间拷贝文件的操作。

6)能够执行查看容器的运行日志的操作。

7)能够执行停止、启动、重启容器的操作。

8)能够执行查看容器的详细信息的操作。

2.4.2 docker容器实战:基于docker部署MySQL数据库

上一小节详细介绍了docker容器常用的操作命令,本节将综合利用上一小节学习的docker命令,去实战部署一个MySQL数据库,具体操作步骤如下。

1)选择MySQL镜像的tag版本。首先到dockerhub网站查找想要部署的MySQL数据库的版本,如图2-75所示。如果我们想安装5.7版本的MySQL数据库,则在搜索关键字5.7后,发现当前比较新的是5.7.41版本,因此这里就选择5.7.41版本。

2)要下载镜像,则执行如下命令,下载tag值为5.7.41的MySQL镜像。

3)要创建挂载目录,则执行如下命令,创建挂载目录,用于挂载MySQL容器中的数据文件目录。

图2-75 在dockerhub网站查看MySQL镜像的tag值

4)用户可以执行如下命令创建MySQL容器。注意,在执行命令时,要将密码xxx换为要设置的密码。

下面对该命令中的几个主要参数的作用进行介绍。

●-p是做端口映射,容器中MySQL的端口是3306,将此端口映射到虚拟机的3306端口,即可以通过虚拟机的ip:3306访问数据库。在实际应用中,假如虚拟机上之前已经安装过MySQL并将3306端口占用,此时通过docker创建MySQL容器时,容器中的3306端口不能映射到虚拟机的3306端口了,需要映射到一个虚拟机上尚未占用的端口,比如10001。则此时端口映射的格式为-p 10001:3306。

●-privileged=true参数则是赋予容器拥有root用户的权限。

●-v参数用于挂载目录,即将容器中的/var/lib/mysql挂载到虚拟机上,以便将MySQL的数据在虚拟机上保存起来。

●-e参数用于向容器中传递变量,比如这里的-e MYSQL_ROOT_PASSWORD=xxx参数,就相当于是在容器内部执行了export MYSQL_ROOT_PASSWORD=xxx命令。这样一来,在实际应用中就可以很容易地向容器传递变量。

5)进入容器,然后登录MySQL,查看数据库,如图2-76所示。

至此MySQL数据库就部署完成了,其他对MySQL的配置操作这里不再展开介绍。直接使用exit命令退出容器即可。

图2-76 进入数据库并访问数据库 bmvVrhcdpuON4+RjhA5JxMoYA5CABs0Xh4KqWlzkC+hWmfloYd+o446x8Pke2N9B

点击中间区域
呼出菜单
上一章
目录
下一章
×