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,可以自行添加国内源进行拉取,速度会更快。

【实战演练】kubernetes&docker系列01-docker安装与使用_第1张图片

访问阿里云的链接,可以创建免费的docker镜像加速器。(需要自行注册账户,然后启用,会有一串token码)

vi /etc/docker/daemon.json
{ 
"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"] 
}

XXXXXXXX填写自己实际的token,然后需要运行如下命令重新加载生效。

systemctl daemon-reload
systemctl restart docker

重新拉取,发现速度明显提升很多。

【实战演练】kubernetes&docker系列01-docker安装与使用_第2张图片


5、其他docker命令

docker images

 #查看已经拉取的镜像

003.png

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等)

004.png

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数据库的常规操作了。

【实战演练】kubernetes&docker系列01-docker安装与使用_第3张图片


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,其他命令一样