伺服器入門:docker下的叢集操作,docker+nginx+springboot+redis+mysql。
今天搞了一天的伺服器,從零開始,最終將我的專案搭起來了。本文將一步步帶新手走進伺服器運維的道路。
傳統伺服器搭建:
全手動:傳統的java伺服器搭建有傳說中的LNMT,即linux+nginx+mysql+tomcat(tomcat的啟動需要jdk,所以就將jdk歸入tomcat)這種傳統的搭發就是在linux(centos,redhat或者ubuntu) wget 下載壓縮包,然後用tar 命令解壓。至於具體步驟就不在說了。半自動:經過了石器時代,現在來到了半自動時代了。所謂的半自動就是用oneinstack 指令碼安裝我們的環境。這種方式的好處就是他有很多選項給你,不僅是java的環境還有php的環境。具體做法:wget http://aliyun-oss.linuxeye.com/oneinstack-full.tar.gz #阿里雲使用者下載wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz #包含原始碼,國內外均可下載wget http://mirrors.linuxeye.com/oneinstack.tar.gz #不包含原始碼,建議僅國外主機下載3. 解壓 tar xzf oneinstack-full.tar.gzcd oneinstack #如果需要修改目錄(安裝、資料儲存、Nginx日誌),請修改options.conf檔案4.連結安裝視窗 screen -S oneinstack #如果網路出現中斷,可以執行命令`screen -r oneinstack`重新連線安裝視窗5. 啟動install.sh檔案,進行安裝 ./install.sh
接下來就是一大堆選項。根據自己需求安裝就行了。
流行的伺服器搭建:
由於具體做法寫起來實在是太多了。所以就寫一些概念。docker:進入我們的主題:目前流行的java伺服器環境就是用docker來構建。至於docker的核心有三點:映象,容器,倉庫。
我們可以去倉庫裡(如阿里,網易。或Hub.docker)去下載公開的映象。也可以通過Dockerfile來build自己的映象。
或是構建自己私有的倉庫。(這點和Git有點像)。而docker最大的特點就是:build onece can run anywhere
意味著環境隔離,執行一次後打包可在其他環境上執行,即我們只要搭好我們的環境。下次遷移時就能直接pull了。
那麼就意味著我們要搭建自己的nginx.redis.mysql.springboot這四個容器。
nginx:nginx有兩個特徵。動靜分離,負載均衡。
動靜分離:要知道我們的tomcat的處理靜態頁面是有點吃力的。所以我們可以用nginx來實現靜態分離。通過一些正則表示式來識別靜態頁面,然後交給nginx快取起來。
負載均衡:我們可以在upstream中設定我們的專案對應的地址或是埠。那在我們用nginx監聽我們的80埠的時候.nginx就會自動的將請求
均衡的傳送給專案。其中的session是一樣的。從而緩解後臺的壓力,提升效能。也就是所謂的叢集概念。
spring boot:spring boot是目前較火的微服務架構。他的方便之處就相當與你用了idea就再也回不去eclipse一樣。
redis:redis就是一種 NoSql 。nosql是一種概念。不是 no sql 而是 no only sql 可以說他是一種快取。
當我們有一些資料有時間期限或是經常要用到的又不經常需要改動的。例如token。我們就可以把他存到redis上。
mysql:資料庫就不用說了。
容器構建:
第一步:docker安裝:(以centos為例)yum -y install docker即可。因為Docker 軟體包和依賴包已經包含在預設的 CentOS-Extras 軟體源裡了。
然後service docker start即可開啟docker服務
第二步:mysql容器:mysql的容器搭建相對簡單。用docker pull mysql (不指定版本會自動latest)
然後docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 -d mysql
-p:對映自己埠和容器埠
--name:設定容器名字
-eMYSQL_ROOT_PASSWORD:初始化root密碼
-d 後臺執行。
第三步:redis容器:redis的安裝和mysql差不多 docker pull redis
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
redis-server --appendonly yes:在容器執行redis-server啟動命令,並開啟redis持久化配置
第四步:spring boot 。我們都知道spring boot的一個特點就是他內嵌了一個tomcat的,只要在maven中配置即可。那麼我們以往的方式就是
用maven打包:mvn clean package 成一個jar包。然後在有jdk的linux下執行 nohup java -jar ***.jar & 使他在後臺執行就行。
不過筆者今天運到了一個難題。就是我們在docker的環境隔離中,我們要結合spring boot ,mysql ,redis 我們要用--link的命令執行。那同時我們的
application.yml配置檔案中要將mysql 的url 地址改成我們設定的別名。redis的hosts也是一樣。但是用mvn clean package 打包會包連線不上redis的錯誤
結果找了好久才知道。我們可以用
mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true 的命令來執行只打包不執行的命令。
由於在阿里雲上找不到spring boot的image。(在docker官方映象網可以找到) 所以我們用Dockerfile的形式來build一個image
Dockerfile:
FROM java:8
VOLUME /tmp
ADD springboot-8080.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
執行:docker buit -t springboot . 用docker images 即可發現生成了一個叫springboot的映象
啟動:docker run -d -p 8080:8080 --name springboot --link mysql:mysql --link redis:redis springboot
用link連線我們的其他已啟動的容器就行了。注意這裡的第一個mysql,redis已啟動的容器的名稱。第二個是我們設定的別名
第五步:nginx:第五步就是花費了我好大時間的nginx了。下載 images 。docker pull nginx
主要的run這一步。因為我們加上自己的conf來實現我們的功能。
docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/conf.d:/etc/nginx/conf.d -v $PWD/logs:/wwwlogs --link springboot8080:springboot8080 --link springboot8000:springboot8000 -d nginx
-p 80:80:將容器的80埠對映到主機的80埠
--name mynginx:將容器命名為mynginx
-v $PWD/www:/www:將主機中當前目錄下的www掛載到容器的/www
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:將主機中當前目錄下的nginx.conf掛載到容器的/etc/nginx/nginx.conf
-v $PWD/logs:/wwwlogs:將主機中當前目錄下的logs掛載到容器的/wwwlogs
我的nginx.conf配置:
user www-data; #我在linux中建立一個www的使用者。但是這麼做不行。啟動容器時報錯。於是我用root作為使用者,發現可行。進入容器裡面後發現其有個www-data的使用者,所以我就用這個
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
}
我放在conf.d下的global.conf:
upstream service_group{ #地址這裡要填容器內的地址
server springboot8000 max_fails=1 fail_timeout=60s weight=1 ;
#server springboot2:8000 max_fails=1 fail_timeout=60s weight=1;
}
server {
listen 80;
server_name localhost;
#實際專案中的前端是獨立一個nginx的,url通過子級域名來匹配的。我們後臺沒有什麼靜態頁面,所以就不用設定靜態分離了
# location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff)$ {
# #所有靜態檔案直接讀取硬碟
# root /www;
# expires 30d; #快取30天
#}
location / {
proxy_pass http://service_group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
docker 命令:
docker exec -it CONTAINER ID /bin/bash :進入容器內部
#同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,這樣才能獲取到最新的軟體包。
apt-get update
#安裝telnet
apt-get install telnet
#安裝ifconfig
apt-get install net-tools
# vim
apt-get install vim
下次釋出Jenkins和java一些基礎的(git,maven,token,redis)。lzd