您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么在Docker中完整部署Web應用”,在日常操作中,相信很多人在怎么在Docker中完整部署Web應用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么在Docker中完整部署Web應用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一個完整的 Web 應用包含前端頁面、數據庫、后臺邏輯等,按照一般流程去構建需要配置 Nginx、MySQL,以及后臺服務器,運維涉及到的部分十分復雜。而 Docker 可以將這些東西(數據+服務)封裝起來,雖然有些場合不建議數據和服務放在一起。本文就在一個 Docker 容器中完整部署整個 Web 應用的需求作詳細的介紹。
本文舉例的 Web 應用為 「top-topic-Zhihu」(換個 timeline 看知乎),整個項目可以在 Github 中找到。
Dockerfile 和依賴文件托管在 docker-toptopic,云服務商選擇「靈雀云」提供容器服務。
在「靈雀云」服務提供的域名 http://toptopic-huangtuzhi.myalauda.cn:19991/ 可以看到本網站。
整個 Web 應用的目錄結構如下所示:
├── docker-toptopic │ ├── Dockerfile │ ├── init.sh # 啟動 Nginx MySQL 和后臺 Server 的初始化腳本 │ ├── mysql # MySQL 配置文件 │ │ └── my.cnf │ ├── nginx # Nginx 配置文件 │ │ ├── global.conf │ │ └── nginx.conf │ ├── question.txt # 需要導入到 DB 的數據 │ ├── README.md │ └── web │ ├── dataAccess.py # 后臺 Server 的 AO 服務 │ ├── dataCGI.py # 后臺 Server │ └── www # 網站 │ ├── assets │ │ ├── tuzhii.ico │ │ └── tuzhii.jpg │ ├── css │ │ ├── button.css │ │ └── toptopic.css │ ├── index.html │ └── js │ └── template.js
Dockerfile 描述了容器的依賴和進行構建的步驟,下面會逐步解釋語句的含義。
FROM ubuntu MAINTAINER titushuang "ituzhi@163.com" ENV REFRESHED_AT 2015-10-12 RUN apt-get update \ && apt-get install -y mysql-server-5.6 python python-dev python-pip libmysqlclient-dev nginx RUN pip install MySQL-python flask RUN pip install -U flask-cors RUN mkdir -p /home/toptopic /home/toptopic/web COPY init.sh /home/toptopic/init.sh COPY web /home/toptopic/web COPY question.txt /home/toptopic/question.txt COPY nginx/global.conf /etc/nginx/conf.d/ COPY nginx/nginx.conf /etc/nginx/nginx.conf COPY mysql/my.cnf /etc/mysql/my.cnf RUN ln -s /home/toptopic/web/www /usr/share/nginx/html RUN chmod +x /home/toptopic/init.sh RUN chmod -R 755 /home/toptopic/web RUN ./etc/init.d/mysql start &&\ mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'dbpasswd';"&&\ mysql -e "grant all privileges on *.* to 'root'@'127.0.0.1' identified by 'dbpasswd';"&&\ mysql -e "CREATE DATABASE top_topic_zhihu; use top_topic_zhihu;"&&\ mysql -e "CREATE TABLE top_topic_zhihu.question(question_id varchar(30) NOT NULL, \ title varchar(200), ask_time datetime,followers int)"&&\ mysql -e "load data infile '/home/toptopic/question.txt' into \ table top_topic_zhihu.question fields terminated by ';;'"&&\ mysql -e "grant all privileges on *.* to 'root'@'localhost'\ identified by 'dbpasswd';" EXPOSE 2223 5000 CMD ["/home/toptopic/init.sh"]
MySQL 服務器只需要用包管理器安裝 mysql-server-5.6,因為后臺使用 Python 作為服務器語言,還需要安裝 MySQL 對 Python 語言的支持。需要使用 apt 安裝 python ,libmysqlclient-dev 和 python-dev,然后使用 pip 管理器安裝 MySQL-python。
MySQL 的默認字符集為 latin1,而網頁顯示一般是 utf8 字符集,需要將 MySQL 的配置文件的字符集置為 utf8。
使用命令
COPY mysql/my.cnf /etc/mysql/my.cnf
將本地已修改好的配置文件覆蓋 Docker 中的 MySQL 配置文件。查看字符集
mysql> SHOW VARIABLES LIKE 'character_set_%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
若字符集如上所示,則說明已經修改成功。
在上面的 Dockerfile 中看到分別給 'root'@'127.0.0.1' 和 'root'@'localhost' 都加了權限, 'root'@'localhost' 的權限在 SQL 語句最后才加上。這是因為
使用 'root'@'localhost'
沒權限建數據庫和表,報錯
Access denied for user 'root'@'localhost' (using password: No)
使用 'root'@'127.0.0.1'
進入 Docker 后沒權限連接 Mysql,報錯
Access denied for user 'root'@'localhost' (using password: YES)
于是這里用 'root'@'127.0.0.1'
來建數據庫和表,最后再用 'root'@'localhost'
來連接數據庫。
Nginx 在這里作為靜態頁面的服務器,安裝只需要用 apt 管理器安裝即可。
Nginx 需要配置 root 目錄來指定網站的文件位置,把本地的 global.conf 和 nginx.conf 文件覆蓋到 Docker 中。
COPY nginx/global.conf /etc/nginx/conf.d/ COPY nginx/nginx.conf /etc/nginx/nginx.conf
在 global.conf 中我們指明服務器根目錄為 /usr/share/nginx/html/www
server { listen 0.0.0.0:2223; server_name _; root /usr/share/nginx/html/www; index index.html index.htm; }
在 Docker 中,我們將網站文件放到新建的 /home/toptopic/web/www
目錄。這里建立一個軟鏈接將它們關聯起來,便于修改和維護。
RUN ln -s /home/toptopic/web/www /usr/share/nginx/html
EXPOSE 在 Docker 中用來限制開放的端口。我們使用 Nginx 來提供靜態頁面訪問,使用 Flask 框架來提供動態頁面數據的獲取,所以需要開放兩個端口。
EXPOSE 2223 5000
查詢端口狀態,可以看到宿主機 2333 端口被映射到 Docker 的 2333 端口,宿主機 5000 端口被映射到 Docker 的 5000 端口。
hy@HP /tmp $ sudo docker ps [sudo] password for huangyi: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d1d03d08a95 titus/mysql:latest /bin/bash 9 seconds ago Up 9 seconds 0.0.0.0:2223->2223/tcp,0.0.0.0:5000->5000/tcp clever_hoover
2223 端口與上節中的 Nginx 中設定的端口必須保持一致,因為 Nginx 使用 2223 端口提供服務,Docker 剛好必須把這個端口開放出去。
在基于 Flask 框架寫的后臺服務 dataCGI.py 中,服務器對應的監聽地址為
app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)
host 必須設置為 0.0.0.0,表示監聽所有的 IP 地址。如果 host 使用 127.0.0.1,在容器外將無法訪問服務。同時,這里的端口 5000 和 Dockerfile 中開放的另一個端口一致。
在 Dockerfile 中的 CMD 中可以指定 Docker 運行時執行一些命令。
/etc/init.d/mysql start /etc/init.d/nginx start & /home/toptopic/web/dataCGI.py
這三行分別啟動 MySQL,Nginx 和后臺服務。
構建 Docker 容器
sudo docker build -t="titus/toptopic" .
運行容器
sudo docker run -t -i -p 2223:2223 -p 5000:5000 titus/toptopic
需要注意的是若使用
sudo docker run -t -i -p 2223:2223 -p 5000:5000 titus/toptopic /bin/bash
無法啟動 CMD 中的腳本命令,這是因為在 docker run 后指定了 /bin/bash 后會覆蓋 CMD 中的命令。
在「靈雀云」上部署一個 Docker 應用需要兩步:構建——創建服務。
點擊「構建」——「創建鏡像構建倉庫」,然后選擇 Github 倉庫源。需要把預先寫好的 Dockerfile 放在 Github中。
構建好倉庫之后,點擊「創建服務」。
進行服務的設置,高級設置中服務地址類型選為 tcp-endpoint 即可(外部用戶可以直接通過 TCP 方式訪問這個服務地址,服務地址的端口是隨機分配的,一般會大于 10000 小于 65535)
最后點擊最下方的「創建服務」完成部署。新建的服務如下所示:
在瀏覽器中輸入http://toptopic-huangtuzhi.myalauda.cn:19991/ 即可訪問網站。
到此,關于“怎么在Docker中完整部署Web應用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。