Docker Tomcat容器中引用mysql容器
docker 的定義這裡就不說了。那種概念性的東西我不太會總結…自己的理解就是它是用來代替裝在虛擬機器中的伺服器的東西,並且對於每一個“虛擬機器”,docker中的佔用硬碟比虛擬機器的少,效能比虛擬機器的高。(僅本人理解,具體自己網上搜或到官網看)
我用的ubuntu kylin 15.10 x64的作業系統。安裝Docker:
終端中執行:
sudo apt-get install docker.io
Docker支援 Linux、Mac、Windows 等,具體安裝方法詳見官網。
安裝後Docker之後,下載centos映象,這裡下載的是6.7版本:
sudo docker pull centos:6.7
之後下載mysql,這裡下載的是最新版:
sudo docker pull mysql
在主目錄下建立 app 資料夾,即: /home/[使用者名稱]/app,我的使用者名稱為 sccss,則命令為:
mkdir ~/app
或:
mkdir /home/sccss/app
在 jdk-8u73-linux-x64.tar.gz 所在資料夾下執行:
cp jdk-8u73-linux-x64.tar.gz ~/app
將 jdk-8u73-linux-x64.tar.gz 複製到app目錄下。然後執行:
tar zxvf jdk-8u73-linux-x64.tar.gz
解壓後的資料夾為 jdk1.8.0_73 。該資料夾下有 jre 資料夾。執行:
cp -R jdk1.8.0_73/jre .
mv apache-tomcat-8.0.32 tomcat
將資料夾改名為 tomcat ,方便之後使用。
使用使用右鍵選單或命令列(touch命令 或 vim 命令)建立檔案並編輯內容為(vim介紹起來有點多了,不會使用的可自己網路搜尋使用方式 。docker下載的centos:6.7中沒有vim命令,只有vi命令。):
檔案 env.sh
#!/bin/bash
#Set Environment
export JRE_HOME=/root/app/jre
export PATH=$PATH:$JRE_HOME/bin
檔案 run.sh
#!/bin/bash
#Run tomcat
echo "Set environment..."
source /env.sh
echo "Run tomcat..."
exec /root/app/tomcat/bin/catalina.sh run
echo "End ..."
檔案 start.sh
#!/bin/bash
#Start tomcat
echo "Set environment..."
source /env.sh
echo "Start tomcat..."
sh /root/app/tomcat/startup.sh
檔案 stop.sh
#!/bin/bash
#Stop tomcat
echo "Set environment..."
source /env.sh
echo "Stop tomcat..."
sh /root/app/tomcat/shutdown.sh
env.sh 設定了JRE_HOME和PATH環境變數,以便tomcat可以找到java。
run.sh 執行tomcat並顯示日誌,執行後按下Ctrl+c 停止tomcat。
start.sh 啟動tomcat後退出。
stop.sh 關閉啟動的tomcat。與 start.sh對應。
再之後,需要準備一個測試的javaWeb專案,用來確認之後是否連線到了Mysql伺服器。
這裡準備了一個簡單的測試專案war包:http://pan.baidu.com/s/1eRjzTbc 密碼: qa7h
下載後放入新建立的資料夾,我這裡是 /home/sccss/tmp/,即 war 路徑為 /home/sccss/tmp/test.war
執行後,訪問 http://host:port/test/mysql 來測試,mysql root密碼應為 123
對應Servlet程式碼如下:
public class MySQLServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
Connection conn = null;
PreparedStatement stat = null;
ResultSet res = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://mysql-host:3306/mysql", "root", "123");
stat = conn.prepareStatement("select user from user where user='root'");
res = stat.executeQuery();
if (res.first()) {
String name = res.getString("user");
out.println("連線資料庫成功! --" + name);
} else {
out.println("連線資料庫成功! -but now data-");
}
} catch (ClassNotFoundException e) {
System.err.println("資料庫驅動載入失敗...");
e.printStackTrace();
out.println("資料庫驅動載入失敗...");
out.println(e.getMessage());
} catch (SQLException e) {
System.err.println("資料庫連線或執行失敗...");
e.printStackTrace();
out.println("資料庫連線或執行失敗...");
out.println(e.getMessage());
} finally {
if(out != null){
out.close();
}
if(res != null){
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
可以看到,連線成功後會列印 連線資料庫成功! –root
零件準備好了,下面開始組裝。
首先構建一個mysql的執行容器,執行(mysql 映象的使用說明在 : https://hub.docker.com/_/mysql/):
sudo docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=123 -d mysql
以上命令將會由 mysql:lastest 映象執行一個mysql root密碼為 123 的名為 mysql-server的容器,-d引數表示後臺執行且列印容器id。
之後執行以下命令來檢視容器列表:
sudo docker ps -a
應該可以看上去一個名為 mysql-server 容器。
現在來建立tomcat的映象。
首先執行一個tomcat 容器,並掛載 /home/sccss/app 目錄到 /app。命令如下:
sudo docker run -ti -v /home/sccss/app:/app centos:6.7 /bin/bash
執行上面的命令後會進入容器的shell。
依次執行以下命令:
#在/root下建立app檔案平夾
mkdir /root/app
#將jre、tomcat複製到 /root/app下,將env.sh複製到/root下
cp -R /app/jre /root/app/
cp -R /app/tomcat /root/app/
cp /app/env.sh /root/
#將 run.sh start.sh stop.sh 複製到 / 下
cp /app/run.sh /
cp /app/start.sh /
cp /app/stop.sh /
執行以下命令退出容器:
exit
執行以下命令檢視剛剛配置tomcat環境的容器id
sudo docker ps -a
檢視剛剛執行的映象(IMAGE)為 centos:6.7的容器Id,這裡是 849717a506b7
執行以下命令將容器轉換為映象:
sudo docker commit 849717a506b7 sccss/tomcat:v1
這裡將其提交為 sccss/tomcat,版本為 v1 ,名字可根據自己喜好起。
執行以下命令檢視映象:
sudo docker images
mysql容器已經配好並執行起來,tomcat映象也已經準備好了。下面就開始 牽個線,搭個橋,讓它們結合:
sudo docker run -ti -v /home/sccss/tmp:/root/app/tomcat/webapps -p 18080:8080 --link mysql-server:mysql-host sccss/tomcat:v1 /bin/bash
解釋一下這條命令: 將主機上的 /home/sccss/tmp目錄(存放有test.war)對映到容器的 /root/app/tomcat/webapps, 這樣的話,執行容器中的tomcat將會讀取我們的test.war。將主機的 18080 對映到容器的 8080,這樣可以直接訪問主機的18080埠來訪問容器中的tomcat中的專案。將name為 mysql-server 的容器地址對映到tomcat容器內部,並命名為 mysql-host 。這樣就可以在tomcat容器中通過 mysql-host 訪問mysql-server了。見上面servlet原始碼中的資料庫連線語句:jdbc:mysql://mysql-host:3306/mysql
萬事具備,只欠執行:
sh /start.sh
ps: 以上程式碼已經在腦子裡跑了一遍,沒有問題。。。
若你操作時有問題,請留言,我會修改。
docker我也是初學者,哈哈~~~