摘要:此時查詢數據庫的用戶信息為其他掛載的原理內的文件系統工作情況。此只讀層及在頂部的讀寫層的組合被稱為聯合文件系統。
簡介
對于企業應用架構來說,肯定不局限于一臺服務器,按照我的設想:至少一臺部署后臺接口的服務器;一臺部署前端頁面的服務器;一臺做代理的服務器;一臺裝載數據庫的服務器等等,這還不包括對某些應用做負載均衡。
可是慷慨的許姓朋友只能贊助我一臺服務器,這時候我就想到了Docker。只要我多開幾個容器,就能模擬分出多個服務器,對應多個IP。
所以本章首先是講解安裝Docker,其次是一一示例如何在Docker容器中安裝配置Nginx、Tomcat和MySQL。原計劃數據庫使用Oracle,但是由于服務器配置太低,每次Oracle容器運行起來后都會導致服務器宕機,所以不得不改為MySQL。
由于考慮到Docker容器每次重啟都會從鏡像中初始化,文章中會大量使用到掛載,具體原理最后章節會講。
1、使用uname -r 查看系統內核,Docker 要求CentOS系統的內核版本高于 3.10
[root@VM_60_202_centos ~]# uname -r 3.10.0-862.9.1.el7.x86_64
2、做好準備,確認yum更新到最新,沒有安裝過舊版本Docker
[root@VM_60_202_centos ~]# yum update --最新版yum包 [root@VM_60_202_centos ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine docker.io --刪除舊版本Docker
3、安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
[root@VM_60_202_centos ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
4、最新版本的 Docker 分兩個版本,docker-ce(Community Edition)和docker-ee(Enterprise Edition)。CE版本是免費的,如果我們學習或者一般應用,CE足夠。我們安裝社區版。下面可以設置數據源倉庫,可以選用Docker官方數據源或者阿里云數據源:
[root@VM_60_202_centos ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo --添加官方數據源 [root@VM_60_202_centos ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo --添加阿里云數據源
5、安裝Docker
[root@VM_60_202_centos ~]# yum list docker-ce --showduplicates | sort -r --列出可以安裝的docker版本 [root@VM_60_202_centos ~]# yum install docker-ce --下載最新版本 [root@VM_60_202_centos ~]# yum install -y docker-ce-18.03.1.ce-1.el7.centos --安裝指定版本
6、啟動Docker
[root@VM_60_202_centos ~]# systemctl start docker --啟動 [root@VM_60_202_centos ~]# systemctl stop docker --關閉 [root@VM_60_202_centos ~]# systemctl restart docker --重啟
7、驗證安裝情況
[root@VM_60_202_centos ~]# docker --version --查看安裝的docker版本 [root@VM_60_202_centos ~]# docker run hello-worldTomcat容器
1、從數據源中查找Tomcat鏡像。一般下載官方的鏡像Starts最高的那個。
[root@VM_60_202_centos ~]# docker search tomcat --查詢tomcat官方鏡像 [root@VM_60_202_centos ~]# docker pull tomcat --下載下來其中的名為“tomcat”的鏡像 [root@VM_60_202_centos ~]# docker images --查看本地所有的鏡像
2、宿主機創建掛載目錄,啟動Tomcat容器
[root@VM_60_202_centos ~]# mkdir -p /u01/tomcat/webapps/tomcat1 --創建目錄/u01/tomcat/webapps/tomcat1,用于掛載Tomcat的 [root@VM_60_202_centos ~]# mkdir -p /u01/tomcat/webapps/tomcat2 --創建目錄/u01/tomcat/webapps/tomcat2,用于掛載Tomcat的 --并分別在/u01/tomcat/webapps/tomcat1和/u01/tomcat/webapps/tomcat2中放置已經準備好的不同的war包(雖然都是kerryNginxServlet.war,但內容不同) [root@VM_60_202_centos ~]# docker run --name=my_tomcat1 -v /u01/tomcat/webapps/tomcat1:/usr/local/tomcat/webapps -p 8001:8080 -d tomcat --啟動一個Tomcat容器,命名為my_tomcat1;將容器的8080端口映射到宿主機的8001 --將宿主機的/u01/tomcat/webapps/tomcat1 目錄掛載到容器上的/usr/local/tomcat/webapps 目錄 [root@VM_60_202_centos ~]# docker run --name=my_tomcat2 -v /u01/tomcat/webapps/tomcat2:/usr/local/tomcat/webapps -p 8002:8080 -d tomcat --再運行一個Tomcat容器,命名my_tomcat2,用于做負載均衡
3、驗證Tomcat容器
[root@VM_60_202_centos ~]# curl http://localhost:8001/kerryNginxServlet/servletANginx容器hello I am Kerry!
This is the servlet test A!
[root@VM_60_202_centos ~]# curl http://localhost:8002/kerryNginxServlet/servletAhello I am Kerry!
This is the servlet test B!
1、同樣,從數據源中查找Nginx鏡像。一般下載官方的鏡像Starts最高的那個。
[root@VM_60_202_centos ~]# docker search nginx --查詢nginx官方鏡像 [root@VM_60_202_centos ~]# docker pull nginx --下載下來其中的名為“nginx”的鏡像 [root@VM_60_202_centos ~]# docker images --查看本地所有的鏡像
2、宿主機創建掛載目錄,編輯配置文件
[root@VM_60_202_centos ~]# mkdir -p /u01/nginx [root@VM_60_202_centos ~]# mkdir -p /u01/nginx/conf.d [root@VM_60_202_centos ~]# touch /u01/nginx/nginx.conf [root@VM_60_202_centos ~]# touch /u01/nginx/conf.d/default.conf
然后vi 編輯 /u01/nginx/nginx.conf 文件
user root; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main "$remote_addr - $remote_user [$time_local] "$request" " "$status $body_bytes_sent "$http_referer" " ""$http_user_agent" "$http_x_forwarded_for""; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; upstream tomcatServer { server t1:8080; server t2:8080; } }
編輯 /u01/nginx/conf.d/default.conf 文件
server { listen 80; server_name localhost; location / { proxy_pass http://tomcatServer; } }
3、啟動Nginx容器
[root@VM_60_202_centos ~]# docker run --name=my_nginx1 --link=my_tomcat1:t1 --link=my_tomcat2:t2 -v /u01/nginx/nginx.conf:/etc/nginx/nginx.conf -v /u01/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 -d nginx --運行Nginx的容器,命名為my_nginx1 --給my_tomcat1、my_tomcat2容器分別起別名,t1、t2(會在my_nginx1的/etc/hosts文件中自動配置) --掛載/u01/nginx/nginx.conf文件和/u01/nginx/conf.d目錄 --將容器的端口號80映射到宿主機的8000端口 [root@VM_60_202_centos ~]# curl http://localhost:8000/kerryNginxServlet/servletAhello I am Kerry!
This is the servlet test A!
[root@VM_60_202_centos ~]# curl http://localhost:8000/kerryNginxServlet/servletAhello I am Kerry!
This is the servlet test B!
因為配置了負載均衡,所以在訪問http://localhost:8000/kerryNginxServlet/servletA時,會有平均概率地訪問http://localhost:8001/kerryNginxServlet/servletA 和 http://localhost:8002/kerryNginxServlet/servletA
MySQL容器1、從數據源中查找MySQL鏡像。一般下載官方的鏡像Starts最高的那個。
[root@VM_60_202_centos ~]# docker search mysql --查詢mysql官方鏡像 [root@VM_60_202_centos ~]# docker pull mysql --下載下來其中的名為“mysql”的鏡像 [root@VM_60_202_centos ~]# docker images --查看本地所有的鏡像
2、創建掛載目錄
[root@VM_60_202_centos ~]# mkdir -p /u01/mysql/data /u01/mysql/logs /u01/mysql/conf --data目錄將映射為mysql容器配置的數據文件存放路徑 --logs目錄將映射為mysql容器的日志目錄 --conf目錄里的配置文件將映射為mysql容器的配置文件
3、啟動MySQL容器
docker run -p 3306:3306 --name my_mysql1 -v /u01/mysql/conf:/etc/mysql/conf.d -v /u01/mysql/logs:/logs -v /u01/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=kerry -d mysql -p 3306:3306:將容器的 3306 端口映射到主機的 3306 端口。 -v 掛載。 -e MYSQL_ROOT_PASSWORD=kerry:初始化 root 用戶的密碼。
4、遠程連接數據庫
這時遠程來連接該數據庫,可能會報錯:
ERROR 2059 (HY000): Authentication plugin "caching_sha2_password" cannot be loaded
在安裝mysql8的時候如果選擇了密碼加密,之后用客戶端連接比如navicate,會提示客戶端連接caching-sha2-password,是由于客戶端不支持這種插件,可以通過如下方式進行修改:
1)進入容器
docker exec -it my_mysql1 bash
2)進入mysql
mysql -uroot -pkerry
3)修改用戶登錄權限信息
先查詢用戶信息
mysql> select host,user,plugin,authentication_string from mysql.user; +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | host | user | plugin | authentication_string | +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | % | root | caching_sha2_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | mysql_native_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | +-----------+------------------+-----------------------+------------------------------------------------------------------------+ 5 rows in set (0.00 sec)
host為 % 表示不限制ip localhost表示本機使用 plugin非mysql_native_password 則需要修改密碼。
上文中可以見,root用戶不限制ip,但需要修改 plugin。當然,如果為了應對各種應用場景,可以統一執行下列SQL:
ALTER USER "root"@"%" IDENTIFIED BY "kerry" PASSWORD EXPIRE NEVER; ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "kerry"; FLUSH PRIVILEGES; #刷新權限
改完之后,就可以用其他客戶端連接該數據庫了。此時查詢數據庫的用戶信息為:
mysql> select host,user,plugin,authentication_string from mysql.user; +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | host | user | plugin | authentication_string | +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | % | root | mysql_native_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | mysql_native_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | +-----------+------------------+-----------------------+------------------------------------------------------------------------+其他
1、掛載的原理
Docker內的文件系統工作情況。Docker鏡像被存儲在一系列的只讀層。當我們開啟一個容器,Docker讀取只讀鏡像并添加一個讀寫層在頂部。如果正在運行的容器修改了現有的文件,該文件將被拷貝出底層的只讀層到最頂層的讀寫層。在讀寫層中的舊版本文件隱藏于該文件之下,但并沒有被不破壞 - 它仍然存在于鏡像以下。當Docker的容器被刪除,然后重新啟動鏡像時,將開啟一個沒有任何更改的新的容器 - 這些更改會丟失。此只讀層及在頂部的讀寫層的組合被Docker稱為Union File System(聯合文件系統)。
為了能夠保存(持久)數據以及共享容器間的數據,Docker提出了Volumes的概念。很簡單,volumes是目錄(或者文件),它們是外部默認的聯合文件系統或者是存在于宿主文件系統正常的目錄和文件。
2、MySQL的表數據等,在本地宿主機上存儲的策略尚不完整,后續會另起篇幅,拿實際項目舉例說明。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40068.html
摘要:此時查詢數據庫的用戶信息為其他掛載的原理內的文件系統工作情況。此只讀層及在頂部的讀寫層的組合被稱為聯合文件系統。 簡介 對于企業應用架構來說,肯定不局限于一臺服務器,按照我的設想:至少一臺部署后臺接口的服務器;一臺部署前端頁面的服務器;一臺做代理的服務器;一臺裝載數據庫的服務器等等,這還不包括對某些應用做負載均衡。可是慷慨的許姓朋友只能贊助我一臺服務器,這時候我就想到了Docker。只...
摘要:參考鏈接外部容器的幾種方式參考內容中有些許實現不到位的地方,按照測試例子,跑不起來,故參考后進行了一些修改,重新寫了下文章記錄一下,有些自己理解的可能不是很到位,大家湊合著看下,有問題歡迎指出,在此先謝過了,。 參考:Docker Compose:鏈接外部容器的幾種方式參考內容中有些許實現不到位的地方,按照測試例子,跑不起來,故參考后進行了一些修改,重新寫了下文章記錄一下,有些自己理解...
閱讀 1655·2021-09-26 09:55
閱讀 5248·2021-09-22 15:40
閱讀 2013·2019-08-30 15:53
閱讀 1497·2019-08-30 11:15
閱讀 1714·2019-08-29 15:41
閱讀 1869·2019-08-28 18:13
閱讀 3146·2019-08-26 12:00
閱讀 1668·2019-08-26 10:30