Docker学习
1. Docker描述
百度百科是这么解释的,
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
其中的重点我觉得就是Docker可以将软件编译成一个镜像,方便在不同的地方直接使用,不用进行那么多的配置;
1.1 Docker的名词解释
- docker主机:安装了docker程序的主机;
- docker客户端:通过命令行或者其它的工具使用docker;
- docker仓库:用来保存各种软件镜像;
- docker镜像:软件打包好的镜像;
- docker容器:独立运行的一个或一组应用,比如docker中又一个Tomcat镜像,通过命令运行之后就可以启动这个镜像,然后产生一个容器,就像是安装好了Tomcat一样;
镜像启动的实例;
1.2 Docker的使用步骤
- 先安装好Docker;
- 去Docker仓库找到这个软件对应的镜像;
- 使用Docker运行这个镜像;
- 然后对容器进行启动或者停止(就和启动相应的软件一样);
2. 在虚拟机上安装docker
这里介绍的是虚拟机联网时的下载方式;
使用指令yum install docker
,(虚拟机是centos7);- 然后就可以直接查看虚拟机的版本,
docker -v
,如果查到了版本就证明已经安装好了;
- 使用指令
docker search mysql
可以查看你想要下载到docker的容器的mysql软件,
- 第3步中是搜索镜像,现在是开始安装镜像,比如
docker pull mysql
,就是上图中的name
属性下方的名字(可以填写完整的也可以只填写最后一部分
),如下图下载Tomcat的镜像;
- 删除镜像
docker rmi 镜像的id(通过docker images查看)
3. 如何解决在宿主机上连接Tomcat
首先连接肯定是连接不上的了,
- 你可能防火墙没关,这个使用指令
systemctl status firewalld
,查看状态;如果active显示dead
就表示防火墙是关闭的;否则就用指令systemctl top firewalld
关闭防火墙;以上介绍可能不够详细,想要详细了解可以看看别人的博客介绍;- 在关闭防火墙之后可能还是无法连接,这个时候可能是网络IP和端口问题;这个你也可以在宿主机的命令行里面
ping IP地址
一下虚拟机的IP地址;如果连接超时就证明你还是没能连上Linux;- 在没有连上Linux的时候只能查看一下linux的IP,
ifconfig
可以查看Linux的IP;- 然后就可以根据这个IP试一试,果然IP自己换了,该死的校网;然后就可以通过这个查询到的IP尝试访问一下;这里是有前提的,比如首先,你已经开启了一个容器,并且容器也对应了端口(如下图一)指令使用
docker --name 自定义名字 -d 虚拟机端口号:docker中的端口号 该docker中的Tomcat名字
具体是:docker --name mytomcat -d 8081:8080 tomcat:latest
,其中latest类似于版本号,另外的端口号可以自己设置;8081表示虚拟机的端口号映射过去就到了docker里面的端口号,除此之外,docker本身也有自己的IP地址;访问的时候使用IP地址加上端口号就可以了,IP是虚拟机的IP,端口号由于已经映射好了,所以就可以直接访问到docker里面的tomcat了;
- 当然如果你想要直接在宿主机上通过localhost:8080访问,也只是需要如下操作,我使用的是VMware操作虚拟机,先找到编辑->打开虚拟网络编辑器,进行NAT设置,如下图;
`这样按照上面的做法完成后就相当于是将主机和虚拟机的IP和端口号分别进行了绑定,你在浏览器使用主机的IP也会跳转到虚拟机的IP上面;端口号也是一样的跳转;比如上面的localhost:8080对应虚拟机的192.168.121.128:8081当然localhost默认IP地址:127.0.0.1;也可以换成本机的IP地址;
以上就是所有可能出现问题的地方以及如何解决的方法;
最后一点就是你如果已经连接上了,我的意思是出现了404错误,这个其实属于连接上了docker里面的Tomcat,只是tomcat里面的webapps里面可能没有东西,这个时候可以先进入tomcat的目录进行修改,具体操作如下:
- 使用指令:
docker -it 你自定义的容器名字 /bin/bash
,这里面的自定义的容器名字,是你docker run
的时候创建的名字; - 进入目录后,可以
ls -a
,查看所有的目录; - 查看后你会发现,所有的目录都在,其中有一个webapps,和一个webapps.dist目录,这个是因为webapps里面的东西都被放到了webapps.dist里面;只需要使用
mv
指令,将数据放到webapps里就可以了;如下操作:
#强制删除webapps目录
rm -rf webapps
#对文件进行重命名
mv webapps.dist webapps
完成如上的操作后,基本上这个问题就解决了;
4. 使用docker时的常用指令
常用指令 | 指令描述 |
---|---|
systemctl start docker | 启动docker服务,当然可以设置为开机自启; |
docker run --name 自定义容器名字 -d -p 虚拟机端口号:映射到docker中端口号 软件镜像版本 | 这是用来创建一个容器;-d指令表示后台启动 |
docker start 容器名 | 通过容器名字,来启动某个容器; |
docker images | 查看所有的docker里面下载的镜像; |
docker ps | 查看启动后的容器 |
docker rmi imagesID | 通过imageID删除镜像,imageID通过指令docker images可以查看到; |
docker stop 容器名或容器ID | 停止正在运行的容器 |
docker rm 容器名或容器ID | 通过容器名字删除容器 |
docker exec 容器名 /bin/bash | 比如在tomcat容器里面,可以到Tomcat容器的目录中; |
docker logs 容器ID | 查看该容器的日志,ID可以通过docker ps -a 查看 |
很多的具体容器指令其实可以在那个docker hub里面查看,一般比较详细,如何使用,如下图:
在红色框框里面输入需要的镜像,比如MySQL,Tomcat,redis等,就可以查到相关镜像的内容,然后下面就是镜像的一些具体操作方式;
注意
:在创建容器时,端口的映射是必须的,你要是不对虚拟机端口与容器所需要的端口进行映射,那么你怎么使用该容器中的软件呢?
6. 尝试下可否使用Navicat连接容器中的MySQL
- 同样的先创建一个mysql容器:
docker run --name mysql01 -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:latest
,这个是根据官方的那个docker hub写的,然后要标注好映射的端口号,里面的latest是Tag; - 然后启动这个容器mysql:
docker start mysql01
; - 这时去Navicat里面进行连接,连接名字随便设置,主机那里要写虚拟机的端口号,用户名那里设置的是root用户和密码,端口号也可以是3306,不需要变,当然如果存在多个mysql的时候就可能需要改变端口号;
如上就完成了一个宿主机对虚拟机中docker里mysql的连接;我也尝试了连接多个mysql发现没有问题,只需要改变虚拟机本身的端口就可以了,至于docker中的端口只要始终用那一个就可以了;