1. 程式人生 > >Docker Tomcat容器中引用mysql容器

Docker Tomcat容器中引用mysql容器

docker 的定義這裡就不說了。那種概念性的東西我不太會總結…自己的理解就是它是用來代替裝在虛擬機器中的伺服器的東西,並且對於每一個“虛擬機器”,docker中的佔用硬碟比虛擬機器的少,效能比虛擬機器的高。(僅本人理解,具體自己網上搜或到官網看)
我用的ubuntu kylin 15.10 x64的作業系統。安裝Docker:
終端中執行:

sudo apt-get install docker.io

Docker支援 LinuxMacWindows 等,具體安裝方法詳見官網。

安裝後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_HOMEPATH環境變數,以便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我也是初學者,哈哈~~~