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