0、docker介绍
天下大势,分久必合,合久比分。
从前电脑有大型机、小型机(高性能),后面又出现了x86服务器与个人PC电脑(大型机、小型机性能过剩)。然后又发觉单机不够用(x86服务器单机性能不足),于是又需要多台x86服务器做负载均衡或者集群的技术。
然后又发觉有些x86服务器上面只跑了1~2个应用,性能过剩,资源闲置(部分x86服务器单机性能过剩),于是又出现了虚拟化,将单台物理机虚拟化为多台独立的虚拟机。
然后有的虚拟机性能不够用,又需要做负载均衡与集群(部分虚拟机性能不足),但是也有些虚拟机性能过盛......于是,就出现了今天的主角,Docker了。
以往我们需要安装个apache与mysql,来搭建个网站服务,我们需要1台笔记本或者x86服务器,安装个windows或者linux系统再来部署应用。
而当我们使用的虚拟机,也需要物理机安装Hypervisor,再在虚拟机上面安装windows或者linux系统再来部署应用。
反正部署任何应用软件,都需要离不开需要服务器+操作系统。
而运行操作系统,本来就是有系统开销的,所以为了部署一个应用程序,除了应用程序本来需要的CPU、内存之外,
还要分配资源去运行操作系统,带来无谓的开销,是非常浪费的。
那么有没有办法,直接操作系统都不给,然后直接就安装应用呢?Docker就可以做到。
Docker可以在linux操作系统之上,直接通过docker镜像,来部署应用,例如一个已经做好的mysql的docker镜像,可以直接从镜像仓库拉取镜像,然后一键部署docker实例。然后系统就会自动将一部分CPU、内存用于运行该docker实例,直接就能够提供一个能够使用的mysql了。
在同一台虚拟机里面,还可以继续创建多个独立的mysql实例,都可以正常对外提供服务,并且实例之间是互相隔离的。又或者可以继续部署其他应用(如apahce/tomcat)的实例到同一台虚拟机里面。
实验环境:CentOS7
1、环境准备:
1.1关闭防火墙
systemctl stop firewalld systemctl disable firewalld
1.2关闭selinux
setenforce 0 vi /etc/selinux/config
SELINUX=disabled
1.3配置yum源与安装扩展yum
使用阿里云的yum源,配置略,参考【实践演练】Linux操作系统04-配置yum源https://blog.51cto.com/14423403/2416049
2、安装docker
yum -y install docker
3、开启docker
service docker start ps -ef | grep docker
#查看是否启动docker
至此,docker单机安装完成,需要部署应用实例,需要先拉取对应的docker镜像。
4、拉取镜像
docker pull mysql
#拉取mysql镜像
docker pull tomcat
#拉取tomcat镜像
docker pull mysql:5.7.19
#拉取mysql5.7.19版本镜像
拉取由于直接访问国外源的问题,所以拉取的时间会很长,甚至可能拉取不到提示timeout,可以自行添加国内源进行拉取,速度会更快。
访问阿里云的链接,可以创建免费的docker镜像加速器。(需要自行注册账户,然后启用,会有一串token码)
vi /etc/docker/daemon.json
{ "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"] }
XXXXXXXX填写自己实际的token,然后需要运行如下命令重新加载生效。
systemctl daemon-reload systemctl restart docker
重新拉取,发现速度明显提升很多。
5、其他docker命令
docker images
#查看已经拉取的镜像
docker version
#查看docker版本
6、创建容器
1)创建mysql容器
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql
#运行mysql容器,注意创建容器后是否有warning ipv4 forwarding,如有,请转至故障排除1
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.19
#运行mysql5.7.19容器,注意,前面的3306是对外暴露提供访问的端口,后面的3306是docker实例里面对内的端口。
2)创建tomcat容器
#docker run --name tomcat1 -d -p 8080:8080 --link mysql01:mysql tomcat docker run --name tomcat1 -d -p 8080:8080 tomcat
#测试,可以打开网页,访问hosyt的IP地址(非tomcat容器的ip),http://主机IP:8080/
#也可以将test.war包拷贝进入容器,然后放入webapps/文件夹之下,然后进入/usr/local/tomcat/bin/,运行./catalina.sh run,然后就会将tomcat启动起来了。
#测试,打开浏览器https://hostIP:8080/test,可以看到返回的页面。
#注意,:前面的端口才是docker的真是访问端口,例如mysql改为306:3306,后面端口是docker容器里面mysql使用的端口,306则是在宿主机给此docker容器占用的端口。
7、查看容器
docker ps -a
能够看到容器的ID与容器名,以及运行状态(up、exist等)
ps -ef | grep docker
8、进入容器
docker exec -ti tomcat1 bash docker exec -ti mysql01 bash
退出容器按exit,以mysql为例,进入容器后进行操作测试,直接可以登录数据库进行访问。
mysql -u root -p
然后我们授予root用户可以远程访问试试
grant all on *.* to 'root'@'%' identified by '1qaz!QAZ'; flush privileges;
随便找一台网络可达的机器,访问刚才的docker数据库测试一下。
mysql -u root -h 10.1.30.22 -P 3306 -p
#h为指定需要访问的机器IP地址,-P大写P为指定访问的端口,由于测试机器(10.1.30.22)本身是没有安装mysql的,所以如果上述命令能够正常登录到这台机器的mysql,肯定就是docker建的mysql实例了。剩下就是mysql数据库的常规操作了。
9、重启或者停止容器
docker stop tomcat1 docker stop mysql01 docker restart tomcat1 docker restart mysql01
10、查看容器的私网IP,vim等
进入容器后,是没有ifconfig,vim等命令的,需要每个容器单独安装。
apt-get update apt install net-tools #安装ifconfig apt install iputils-ping #安装ping apt install vim#安装vim
11、主机往容器拷贝文件
docker cp **.sql mysql01:/root/
#将**.sql文件拷贝到mysql01容器的root目录
docker cp ROOT/ tomcat1:/root/
#将ROOT/目录及里面的内容全部拷贝到tomcat1容器的root/目录下。
12、删除容器
docker rm tomcat1 docker rm mysql01
13、排错
14.1运行docker时,显示WARNING: IPv4 forwarding is disabled. Networking will not work.
解决办法:vim /usr/lib/sysctl.d/00-system.conf
增加net.ipv4.ip_forward=1
然后systemctl restart network
14.2mysql的docker运行后,远程访问不到
grant all privileges on *.* to root@"%" identified by "1qaz!QAZ"; flush privileges;
mysql默认只能本地登录,如需远程登录,需要放开权限。
14.3mysql8.0.15后,toad等工具远程报错 Authentication method 'caching_sha2_password' not supported by any of the available plugins.
如果拉取镜像的时候,没有指定版本,那么mysql可能拉取了最新的mysql8镜像,因为mysql8修改了默认的加密方式,所以toad与navicat for mysql可能链接不上,可以这样查看。
select Host,User,plugin from mysql.user;
如要修改mysql的加密方式,可以修改配置文件
vim /etc/mysql/my.cnf
然后添加
default_authentication_plugin=mysql_native_password
还需要
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
可以用这个命令再次验证
select Host,User,plugin from mysql.user;
14.4 docker里面安装JDK17
请参考tomcat+mysql搭建网站,但是alternatives运行要变为update-alternatives,其他命令一样