本人軟件專業渣渣程序猿一名,第一次寫博客,十分緊張,寫的不好還請大佬見諒。前段時間有幸接觸到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的全部命令可去官網查詢,一般以上命令已足夠了。