本人软件专业渣渣程序猿一名,第一次写博客,十分紧张,写的不好还请大佬见谅。前段时间有幸接触到docker,这两天使用docker时遇到了一些坑现在看来觉得十分无语,因此想写篇博客记录一下。
一、什么是Docker?为啥使用Docker?
首先,Docker是一个开源的项目,可以让开发者打包应用以及依赖包到一个可移植的容器中,说白了,Docker可以很方便的帮你配置各种环境并且进行移植,实现了虚拟化。具体实现想要深入了解的自行查询,我怕误导大家。
那么,为啥我们要使用Docker呢,就我个人而言,主要是不想配环境。。。
二、Docker安装mysql
1.首先我们需要先安装docker,和简单运行如下命令即可
apt install docker.io
如果不行的话,可以先运行apt update更新一下源的索引。
2.镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我采用的是阿里云镜像加速器,命令如下
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9amr1j7k.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
可参考阿里云官方提供的容器镜像服务点击打开链接
3.docker安装mysql
命令十分简单,如下
docker search mysql(查找Docker Hub上的mysql镜像,会列出各种镜像,选择自己想要的)
docker pull mysql:5.6(拉取mysql 5.6版本的镜像)
这里强调一下有个坑,为什么我要拉取5.6版本的呢?不指定版本行不行?比如运行 docker pull mysql,行是行,但是如果不显示指定版本,docker会默认pull最新的版本,我第一次是就是下载最新的版本,然后后面就遇到了很恶心的问题。
第一,目前mysql最新版本是8.0,这个时候,如果你用默认的mysql客户端或者navicat之类的,你在进行远程连接的时候,很可能会遇到以下这个报错
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/local/mysql/lib/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
第一次遇到这个问题是一脸懵逼,以为是端口问题,然后搞了很久没有解决,后来看了一篇博客后发现是mysql的认证加密方式的问题,在mysql5.7环境里,虽然可以设置default_authentication_plugin来改变认证加密方式,但是一般人不会去设置。在mysql8.0下,默认变成了default_authentication_plugin=caching_sha2_password,包括你刚初始化的root用户也是这个认证加密方式,这样的结果是让你除非用新的协议驱动,例如必须用8.0自带的mysql客户端才行,不然就连接不上数据库。这样就必然造成不兼容的情况,幸好,是可以改回旧的方式的。具体解决方法参考这篇博客点击打开链接
第二,mysql 8.0版本的jdbc连接方式貌似发生了变化,我在网上搜索了很久,没找到什么有效的方式,最后不得不把mysql版本改回了5.6。
综上,血淋淋的教训让我意思到以后不管用什么软件或者框架,绝对不用最新的了,个人以为,旧版本软件里面包含的功能已经足够刚刚入门的我使用了。。所以,建议想省事的同学们使用老版本
4.docker 运行mysql
废话不说,直接上命令
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
命令有点长,建议复制黏贴,各个参数的含义如下
-p 3306:3306:将容器的3306端口映射到主机的3306端口
-v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf
-v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs
-v $PWD/data:/mysql_data:将主机当前目录下的data目录挂载到容器的/mysql_data
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
可以在服务器上用docker ps -a查看容器启动状况,以及利用netstat -tunpl命令查看服务器监听的端口情况
三、Docker安装Tomcat
1.安装tomcat
与安装mysql类似,运行如下命令
docker pull tomcat
2.运行tomcat
docker run --name tomcat -p 8080:8080 -v $PWD/tomcat:/usr/local/tomcat/webapps -d tomcat
参数说明:
-p 8080:8080:将容器的8080端口映射到主机的8080端口
-v $PWD/tomcat:/usr/local/tomcat/webapps:将主机中当前目录下的tomcat挂载到容器的/webapps
另外,这边解释一下,该tomcat的官方镜像中自带了jdk的环境,所以就不用特地去配置jdk的环境了。
四、部署web项目
1.使用阿里云服务器最重要的一环,到阿里云控制台配置实例的安全组规则,否则无法从远端访问服务器,包拓3306端口以及8080端口。
首先进入 阿里云控制台 ,先找到我们购买的实例,然后在左侧栏找到“网络和安全”---“安全组”,点击“配置规则”。以配置8888端口为例:
如上图所示:
端口范围填:8888/8888
授权对象填:0.0.0.0/0
就是将8888号端口开放给所有的用户。
模仿该例子配置3306端口以及8080端口。
2.本地运行web项目,若运行无问题,打成war包。
3.利用各种方式(比如通过lrzsz的rz命令,可自行百度)将war包上传到如服务器的tomcat目录(docker运行tomcat是映射到webapps的目录)下
4.利用以下命令重启tomcat
docker restart tomcat
5.远程通过 ip地址:端口号/项目名称 可访问该项目,比如 47.98.205.218:8080/Moonlight
至此,若没有意外,javaweb的环境搭建好了,项目可以部署了。
五、常用Docker命令
为了应对各种异常情况,需要掌握一些常用的docker命令,如下
docker ps 查看当前正在运行的容器
docker ps -a 查看所有容器的状态
docker start/stop id/name 启动/停止某个容器
docker attach id 进入某个容器(使用exit退出后容器也跟着停止运行)
docker exec -it 容器id(或者name) /bin/bash 启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行)
docker images 查看本地镜像
docker rm id/name 删除某个容器
docker rmi id/name 删除某个镜像
docker的全部命令可去官网查询,一般以上命令已足够了。