(一)常见命令
一、Docker常见命令
- 使用 docker pull 用来拉取仓库的镜像文件到本地;docker images 用于查看镜像文件;docker rmi 用于删除镜像文件
- docker build 用于自定义镜像,将来自己写的java项目也是通过这种方式来构建和打包;同时也可以通过 docker save 命令将项目文件保存到本地变为压缩文件;docker load 也就可以把该压缩文件加载到其他主机的镜像文件当中。
或者也可以通过 docker push 将本地镜像文件推到镜像仓库(可以是公用仓库或公司的私服)。 - 使用 docker run 来创建并运行容器;docker stop 来停止容器,但是停止的是容器内部的进程,容器是仍然存在的;使用 docker start 就可以启动容器内部的进程;根据 docker ps 就可以来查看进程的运行状态;docker rm 用于删除容器;还可以通过 docker logs 来查看容器的运行日志;以及 docker exec 来进入到容器内部
- 在官方文档当中就能查看到Docker的全部命令
二、案例
- 搜索Nginx镜像
就可以查看到Nginx的官方说明文档,并且可以复制拉取镜像文件的命令
- docker pull nginx
//拉取 Nginx 镜像
docker pull nginx
- docker images
//查看本地镜像列表
docker images
- docker save
查看docker save命令可以跟上其他什么参数
options(-o)可选项用于写文件名称,也就是说要保存的镜像将要存到哪个地方
//保存镜像
docker save -o xxx.tar xxx:latest //latest 表明某一镜像的最新版本
- docker rmi
此时只需要重新加载Nginx.tar就能获取到它的镜像
//删除镜像
docker rmi xxx
- docker load
//加载镜像
docker load
- docker run
container id是当前容器的唯一标识id,status代表状态(Up则是已经启动)
//创建并运行镜像
docker run -d --name xxx -p xx:xx xxx
- docker ps
可以加上–format参数对输出内容做格式化
默认情况下docker ps命令查看的是正在运行的容器,但是加上-a参数就可以查看全部容器
//查看正在运行的容器
docker ps (-a)
- docker stop
//停止容器
docker stop xxx
- docker start
//开启容器
docker start xxx
- docker logs查看容器产生的日志
加上-f参数就能持续跟踪该日志
//查看容器产生的日志
docker logs (-f) xxx
- docker exec
exec指的是executed执行;-it指的是添加一个可交互终端,因为容器内部的隔离环境相当于模拟了一台计算机,我们进入之后要想实现交互就要使用命令行交互,也就需要一个终端,使用bash命令
可以进入到mysql的容器中再来操作mysql数据库,也就是通过容器内部的命令直接访问mysql
//进入容器
docker exec -it xxx bash
- docker rm
注意该命令只能删除不在运行当中的容器
或者可以加-f参数来强制删除
//删除容器
docker rm xxx (-f)
三、命令别名
前面提到用docker ps命令来查看容器状态得到的数据非常多、混乱,所以往往会加上–format参数来对输出内容进行格式化,那么就会用到一个table语法用于选择要查看哪些信息。
但是因为这个命令这样子写太长了,就需要来简化该命令,也就要用到Linux的技巧-命令别名。
- 进入root权限下的.bashhrc文件夹中
可以看到文件中已经存在一些人为/系统添加的别名,用alias关键词用于标记。例如:" rm -i "是一个原始命令,被写成了别名 rm 。 - source命令用于让该文件生效
执行dps命令,发现他与之前的docker ps --formet命令的执行结果相同
(二)数据卷
一、案例介绍
当我们运行nginx容器后通过端口映射就可以在主机上连接到nginx线程
到Nginx的官方文档当中查看如何自定义静态资源,以及指定的静态html目录存放在哪个目录下
进入到nginx容器以及存放html静态资源的文件夹下就能查看到当前存在的静态html文件
但是并不能使用vi命令对文件进行直接修改
因为虽然docker的镜像为应用程序的运行提供了所需系统函数库、系统环境,但是它里面只包含当前应用运行所必备的这些系统函数。所以在Nginx镜像当中就不需要vi、ll 这些命令。
因此要想去对Nginx内部的资源进行修改,就需要去用到数据卷。
二、数据卷介绍
比如现在有一个Nginx容器,里面存在许多目录,而其中一个是用来存放html静态资源的,还有一个conf用来保存它的配置文件。将来我们可能需要对这两个文件进行修改,而在容器内直接修改又非常麻烦,那么就可以利用docker去创建两个数据卷,分别对应html与conf。并且在宿主机(也就是该台虚拟机)中给这两个数据卷创建对应的真实目录及data文件,最后也会将数据卷映射到对应目录下的data文件当中。
而既然数据卷是容器目录与宿主机目录之间映射的桥梁,那么就需要让容器的目录跟数据卷做挂载,两者之间进行关联,最后就能让容器的conf目录与宿主机的conf目录下的data目录产生关联。
关联以后docker就会实现宿主机目录与容器目录的双向绑定。以后只需要在宿主机的conf目录下的data目录下创建一个文件,就会自动加载到容器内的conf目录下,反过来的操作也是同样可行的。
以后也就只需要在宿主机上进行操作就可以影响到容器内。
三、数据卷的相关命令
(1)命令介绍
volumn参数指的是数据卷。在创建好数据卷以及创建宿主机目录(自动创建)后,接下来就需要去挂载容器目录。
(2)案例示范
刚才已经看到了nginx的容器内目录,也就是需要挂载的目录
- 创建容器
查看数据卷创建情况
CreatedAt创建时间;Mountpoint挂载点(挂载在宿主机的哪个位置)
//查看数据卷信息
docker volume ls
- 部署静态资源
进入该宿主机目录,就能查看到该index.html文件,我们也就是需要对它来进行修改
因为我们使用的是MobaXterm,是比较高级的Shell软件,可以实现对虚拟机内的文件直接修改,也可以直接插入资源文件
进入nginx容器内的html目录下,就能看到我们修改的文件资源
四、本地目录挂载
在实际应用当中,容器的挂载方式不止以上这一种,接下来就来介绍一下其他的挂载方式
(1)案例示范
①查看mysql容器是否有挂载数据卷
- docker inspect查看容器详情
查看Nginx容器
可以看到它的挂载信息
查看Mysql容器的详细信息
同样也查看到了挂载信息
但是明明我们在创建Mysql容器时并没有去挂载数据卷,但是却自己挂载好了且有自己的名字
//查看容器详情
docker inspect xxx
②查看Mysql的挂载目录
在该目录下可以看到Mysql的data目录
当我们在Mysql中创建一个docker数据库并且创建一个test表结构
可以发现在目录下出现了该docker目录以及test表结构文件
因为Mysql在使用的过程中会不断创建新的文件,若不把它保存在宿主机文件而保存在容器当中,那么容器体积就会越来越大,将来想要对容器做迁移就非常不方便。因此处于数据解耦的考虑,这种挂载操作是非常合理的,所以它自动完成了,只不过现在这种做法用的是匿名卷。
而因为匿名卷的名字是随机生成的,很复杂。
当我们要去升级Mysql的版本时直接删除Mysql会发现数据仍然会存在
但是重新创建Mysql容器又会重新创建一个数据卷,原来宿主机内的旧数据就等于是丢失了。所以使用这种匿名卷是非常复杂、麻烦的,也就可以使用本地目录挂载,把数据目录挂载到任意目录下。
(2)使用本地目录挂载来完成案例
而要想知道MySQL的配置文件、初始化脚本在哪里,就需要到官方镜像文档当中查看。
- 配置文件目录:
- 初始化脚本目录:
- 数据目录:
③执行
- 先创建出三个目录
再执行创建与运行容器的命令
启动成功
再开查看data目录,发现产生了许多数据,说明容器目录成功挂载到了本地目录
验证配置文件也成功挂载,发现所有字符编码都配置为了utf8
推荐把文件挂载到一个固定的、自己设置的目录,方便以后容器迁移或重新创建。