一 docker整體部署架構
本項目建議部署架構:
1 本地安裝mysql保證數據的保存
2 其他構建一個鏡像,打包
二 部署docker
1 部署前期准備(適用於Ubuntu)
1 安裝docker
1.1 卸載舊版本
$ sudo apt-get remove docker docker-engine docker.io containerd runc
1.2 一鍵安裝docker
1 使用官方安裝腳本進行自動安裝
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2 使用國內daocloud一鍵進行安裝
curl -sSL https://get.daocloud.io/docker | sh
1.3 測試安裝是否成功
docker --version
示例如下:
1.4 Docker鏡像加速
建議配置自已阿里雲專有鏡像(需要注冊賬號):https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
按上述在/etc/docker/daemon.json 中寫入如下內容(如果文件不存在請新建該文件):
vim /etc/docker/daemon.json
寫入內容如下:
{"registry-mirrors": ["https://4oepeg1n.mirror.aliyuncs.com"]}
重啟docker
sudo systemctl daemon-reload
sudo systemctl restart docker
1.5 測試:運行hello-world鏡像
docker pull hello-world (拉取鏡像)
docker run hello-world (運行容器)
成功如下:
2 部署后端基礎鏡像 (可跳轉到最后。直接使用我寫好的shell腳本)
Ubuntu 16.04.6 LTS
Python 3.5.2
Nginx 1.12.2
2.1 開始構建后端鏡像(可跳到第2.3點-直接拉起)
docker pull ubuntu
2.2 開啟一個容器,開始構建(python3.5.2)鏡像
1 安裝python 3.5.2
$ wget -c https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
$ tar -xzvf Python-2.7.9.tgz
$ cd Python-2.7.9/
$ LDFLAGS="-L/usr/lib/x86_64-linux-gnu" ./configure
$ make
$ make install
輸入python 3 ,安裝成功
由此,所需要的python版本安裝成功
2 開始安裝項目所需要的python包
docker cp /meanning ea81a6eb523b:/meanning # 復制文件到容器內
pip install -r requirements.txt # 安裝項目所依賴的包
遇到pip升級的問題,解決:
sudo apt-get --purge remove python3-pip
curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py
python3.5 get-pip.py
2.3 基礎鏡像構建完成
后面遇到了的坑比較多,直接省略:
可直接拉取我已經構建好的ubuntu+python+pip+所需要的安裝包
docker pull huawang400/m-python3.5-packages:latest
docker run it --name xxx img_id(鏡像id) # 交互式運行容器
exit # 退出容器
docker exec -it 8d7e bash # 進入正在運行的容器
docker inspect m12-mysql # 查看容器的ip或掛載
在此鏡像基礎上 安裝redis
# 安裝redis
apt install redis-server
# 查找redis安裝目錄(/etc/redis)
whereis redis
# 啟動redis
redis-server /etc/redis/redis.conf
# 查看
ps -aux
安裝mongodb
1 安裝mongodb數據庫
安裝方式參考我的博客:https://www.cnblogs.com/huahuawang/p/14814176.html
2 安裝mongodb database tools(用於備份,導入,恢復存儲數據)
https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu1804-x86_64-100.5.0.deb
tar -zxvf mongodb-database-tools-ubuntu1604-x86_64-100.5.0.tgz #解壓
3 啟動mongod
mongod --config /etc/mongodb.conf
導入數據
數據文件夾 :meanning-mongo-init
1 創建數據庫meanning12
執行如下命令:
mongo
use meanning12
2 退出后使用 mongorestore恢復數據
mongorestore -d meanning12 /root/meanning-mongo-init
意外情況:shelll腳本啟動數據庫redis,mongo
/root/start_dbs.sh
安裝supervisor進程管理工具
1 安裝
sudo apt-get install supervisor
2 生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
mkdir -p /etc/supervisor.d // supervisord 支持include 的方式將多個配置放置不同文件中, 需要配置文件中指定
3 啟動supervisor
supervisord -c /etc/supervisord.conf # 主配置文件
配置說明:
/etc/supervisord.conf (主配置文件)
/etc/supervisor.d/ (默認子進程配置文件,也就是需要我們根據程序配置的地方)
安裝示例:
1拷貝 宿主機 etc/supervisor.d 和 etc/supervisord.conf到容器內
docker cp supervisor.d 0c648948cb64:/etc/supervisor.d
docker cp supervisord.conf 0c648948cb64:/etc/supervisord.conf
2 頁面訪問:
port=0.0.0.0:9876 ; ip_address:port specifier, *:port for all iface
username=admin ; default is no username (open server)
password=meanning0
安裝nginx高性能服務器
1 安裝
apt install nginx
2 查看配置文件目錄
whereis nginx
3 修改配置文件
默認配置文件 etc/nginx
4 添加nginx到PATH中,開機就去讀
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:ngix執行路徑
source /etc/profile # 使其立即生效
5 nginx常用命令
nginx # 首次輸入直接啟動,不得再次輸入
nginx -s reload # 平滑重啟,重新讀取nginx的配置文件,而不重啟進程
nginx -s stop #停止nginx進程
nginx -t #檢測nginx.conf語法是否正確
6 訪問nginx首頁站點
http://192.168.178.140:80/index.html
由此項目環境鏡像基本成型
ubuntu+python3.5(包含相關的包)+uwsgi+redis+mongodb(包含數據)+pip(包含相關的包)+nginx(相關配置)
待處理:項目代碼的cp,端口映射,nginx啟動
生成鏡像huawang400/meanning-base1 (沒有代碼數據,需要調整后使用)
拉取鏡像:docker pull huawang400/meanning-base1
生成鏡像huawang400/meanning-base2 (包括代碼,supervisor配置等)
docker load < /root/docker.gz/meanning-base2.tar.gz # 加載已經構建好的mysql
docker run --name m12-mysql -e MYSQL_ROOT_PASSWORD=root123456 -d -p 8001:3306 my-mysql-data # 啟動mysql服務器
2.4 構建mysql鏡像(建議安裝到本地服務器上)
方案一:注意修改代碼中關於mysql配置代碼中的ip:port
# 安裝到本地服務器上
sudo apt-get install mysql-server //服務端
sudo apt-get install mysql-client //客戶端
sudo apt-get install libmysqlclient-dev //程序編譯時鏈接的庫
#安裝過程中會提示設置密碼什么的,注意設置了不要忘了,安裝完成之后可以使用如下命令來檢查是否安裝成功:
#詳情查看鏈接:
https://www.cnblogs.com/hellocxz/p/13426625.html
方案二:
# 拉取我已經構建好的基礎mysql(不含數據)
docker pull huawang400/mysql
# 啟動一個mysql服務器
docker run --name m12-mysql -e MYSQL_ROOT_PASSWORD=root123456 -d -p 8001:3306 mysql # 啟動mysql服務器
## 解釋
-e MYSQL_ROOT_PASSWORD=root123456為mysql的服務器密碼
-d 后台運行
-p 端口映射 服務器8001-->docker3306
# 連接后導入數據
創建數據庫:meanning12
導入sql語句 ok!!
方案三:
使用壓縮包加載
執行我已經寫好的sh腳本(作用:1導入鏡像。2啟動一個容器)
bash /root/docker.gz/my-mysql.sh
docker load < /root/docker.gz/my-mysql.tar.gz # 加載已經構建好的mysql
docker run --name m12-mysql -e MYSQL_ROOT_PASSWORD=root123456 -d -p 8001:3306 my-mysql-data # 啟動mysql服務器
3 解決容器內網絡互通的問題
3.1 容器創建的時候使用自定義網絡
docker network create --help
# 自定義創建網絡默認default "bridge"
# 自定義創建一個網絡
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
##bridge -網絡模式橋連接 subnet - 子網絡網段 gateway - 路由 mynet- 網絡名
docker network inspect mynet # 查看網絡信息
##自定義網絡修復了docker0的容器之間無法用容器名相互ping通的問題,只能使用ip才能ping通,但是我們自定義的網絡是可以用ip或者容器名相互ping通的
3.2 使用自己的mynet ,開啟2個容器
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat
3.3 查看自定義網絡信息
docker network inspect mynet
3.4 相互使用容器名ping測試
docker exec -it tomcat01 ping tomcat02
docker exec -it tomcat02 ping tomcat01
# 相互可以ping通(測試成功)
注意 如果創建的容器不在該網段如何能和該網段內容器進行ping呢?
我們如果在創建一個容器不在該網段內如何能和該網段內的容器進行ping呢?
docker -d -P --name tomcat03 tomcat(沒有加-net默認是走docker0的網段)
docker -d -P --name tomcat04 tomcat(沒有加-net默認是走docker0的網段)
網絡鏈接:(容器和網絡鏈接,不是docker0和網絡鏈接)
docker network connect mynet tomcat03
鏈接完成之后再去ping
docker exec -it tomcat02 ping tomcat03
# 可以ping通了(一個容器兩個ip)docker inspect d1c4c32c1d6c(tomcat03的id)
參考鏈接:https://www.cnblogs.com/aaawei/p/13402289.html
三 開始在構建好的鏡像部署項目
以下是基於mysql建立在本地的基礎上構建的
3.1 准備項目與文件(宿主機上與docker內一樣位置)
打包好的項目文件--> meannning12.zip
解壓后安裝到 /meanning/Project/meanning12
打包好文件 --> /root/Meanning/OpenSource
supervisor 相關主要配置:
web訪問端口 9876
usename=admin
password=meanning0
sh腳本:
# 啟動一個容器(基於huawang400/meanning-base1)
docker run -it --name meanning12-test1 huawang400/meanning-base1
# 在容器內創建需要的文件夾 (后期可使用掛載解決)
mkdir /meanning
mkdir /meanning/Project
mkdir /root/Meanning
# 復制宿主機內指定文件到容器指定目錄 (后期可使用掛載解決)
docker cp /meanning/Project/meanning12 f8ae3ae2e8a3:/meanning/Project/meanning12
docker cp /root/Meanning/OpenSource f8ae3ae2e8a3:/root/Meanning/OpenSource
# 啟動redis和mongodb (后期可將mongodb分離出來,修改代碼配置文件即可)
在容器內執行:
bash /root/start_dbs.sh
# 代碼中修改mysql鏈接的配置,數據庫鏈接的ip和密碼
/meanning/Project/meanning12/meanning_server/configs/storage_congig.py
最終使用:
1 導入鏡像
直接執行:/root/docker.gz/menning-base2.sh
# docker load < /root/docker.gz/meanning-base2.tar.gz # 加載已經構建好的鏡像
# docker run --name m12-base -it -p 8002:8082 8083:9876 meanning-base2 # 啟動進入一個容器
# 8082為前端接口 8083為supervisor頁面端口
2 在容器中執行命令:# 啟動redis,mongodb,nginx,supervisor
bash /root/start_dbs_nginx_supversor.sh
ok!!
其他:
uwsgi.ini 服務器啟動在 8099端口
nginx監聽在8082端口,負載均衡在8099端口
注意在啟動容器的時候
查看端口占用情況
#例如驗證服務器80端口是否存在
netstat -tunlp | grep 80
需要在開啟容器的時候與宿主進行一個映射(宿主機:容器端口)
8082 : 8082 # nginx監聽端口
8083 : 9876 # supervisor web頁面
8084 :27017 # mongodb-27017端口