最近嘗試搭建docker 環境,其實個人是比較喜歡“菜鳥學習系列”的知識的,怎奈它的講解是以Ubuntu為主的,最后找到一個搭建學習系列,感覺寫的很好,主要是頁面風格清晰明了,遂決定按照此教程學習搭建:https://www.cnblogs.com/ityouknow/p/8520296.html
但是該文章是2018年的,版本有點過時,跟着搭建過程中遇到了不少問題,記錄下來:
第一章是基礎介紹及安裝docker,並初次運行docker。
此處直接運行第一章是沒有問題的,但是運行下邊第二章的時候開始報錯,查了資料發現是版本不對,遂又找了別的文章安裝最新的docker:https://www.cnblogs.com/zhya/p/10605750.html,最后記得設為開機啟動
systemctl enable docker // 設為開機啟動
按照新的版本安裝后,初次運行 docker run hello-world 會查找本地是否有該鏡像,沒有會自動去服務器拉取,然后再運行,通過 docker ps -a 查看可以看到當前已運行的鏡像容器;
多次執行 docker run hello-world 會生成多個 hello-world 容器(如下圖)
第二章是根據 DockerFile搭建一個nginx服務。親手搭建過程中遇到一些問題,遂記錄下來:
1、Error response from daemon: Unknown instruction: VI。
此處為不識別的 vi 命令,所以實例中語句錯誤,DockerFile 中只需寫兩行就行了,另外from和run 可以不區分大小寫。
FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
# 本來想將/usr/share/nginx/html/index.html 改到自己的文件,發現不行,必須要nginx文件夾下。。。
運行 docker build -t nginx:v1 . 后通過 docker images查看會發現有兩個nginx,一個是nginx的最新版本nginx:latest,一個是自定義的鏡像 nginx:v1.
運行 docker run --name docker_nginx_v1 -d -p 80:80 nginx:v1,測試只能用80端口?其它端口無法訪問,難道是端口被限制了?
第三章是DockerFile文件的詳解。
第四章是嘗試搭建一個 Spring-Boot 項目,並發布到docker。
案例的最下方有源碼鏈接github或碼雲。先本地run跑通,然后按照教程上docker,一切正常。
但是有個不好的體驗就是 linux系統會變得很卡頓,目前還不知道原因,先把這個服務停了,后續再找原因。
第五章介紹 docker-compose。
1、推薦的安裝方法是一,linux下載的時候不要輸入那個sudo,從 curl -L 開始。通過地址:https://github.com/docker/compose/releases 查看可知當前最新版本是1.25.0
#下載 curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #安裝 chmod +x /usr/local/bin/docker-compose #查看版本 docker-compose version
2、安裝非常快,教程下面的實例可以不用測試~~
第六章嘗試用 docker-compose 搭建一個 nginx + mysql + spring-boot 的項目發布到docker。
1、項目需要本地先跑起來,所以 application-dev.properties 需要先改成自己的本地測試數據庫。
2、run 運行成功后遷移 docker。
3、有人說怎么沒提供建庫sql啊,實際上直接 docker-compose up -d 后會使用mysql 鏡像自動創建數據庫test,而且也創建表visitor,只不過這個mysql 訪問提示不存在,但是通過工具確實能連接。
4、docker-compose down 會殺死當前目錄下的所有鏡像,然后數據庫因為沒有綁定volumes 參數,所以會被注銷,重啟 docker-compose up -d 后會覆蓋原有數據庫,所以推薦使用volumes 創建永久數據庫磁盤。
------- 手動分界線 -------------------------------------------------------------------------------------------------------------
以下來自其他資料:
一、想在docker中配置以前的項目,但是以前的項目中沒有使用 spring-boot,所以想直接 java -jar 會報錯,沒有 no main manifest attribute ******,意思是沒有啟動的main,原來這個是boot特有的,需要pom.xml添加如下:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.4.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
如果不添加以上,可以用 java -cp ***.jar 帶有main函數的類名(不帶.class)。
二、即使加了以上配置,運行后成功但沒有效果,因為是web服務器,最終需要放到tomcat里,所以下面要docker安裝tomcat。
學習文章:https://www.jianshu.com/p/d053573ffab1
1、docker search tomcat 查看版本總感覺不太直觀,可以去官網查找想要的版本 https://hub.docker.com/_/tomcat?tab=tags&page=1
2、按照方法1完成后,訪問 Manager App 也會有2中的問題,可以根據2中的方法解決,則可以訪問Manager App。
3、上一步配置tomcat文件時用到vi,但docker中默認找不到vi,所以需要安裝:https://blog.csdn.net/huangbaokang/article/details/98029026
3、上傳自己的war文件以啟動相應web服務,可以根據此文章上傳 https://blog.51cto.com/4925054/2096995
三、由於項目前后分離開發,發布時最終需要通過nginx將兩者聯合在一起。
docker使用nginx上面的實例中有用到過,但太簡單,現在要求可以自定義配置nginx,學習文章:https://www.jianshu.com/p/721d971c3cd7
1、文章說的其實挺對,但是說的有點簡略,由於我之前的項目中有nginx配置文件,所以直接拿來用發現不行,docker run 會失敗並停止。
2、首先以為是在啟動的nginx容器中直接添加相應的文件夾來掛載,實驗后發現會重新生成一個CREATED狀態的新容器,然后docker start也並不能啟動也不報錯,只能docker rm將其刪除。
3、后來找其它文章:https://www.cnblogs.com/fudonghai/p/11316118.html 才明白,是要在docker容器外的宿主機(物理機或虛擬機)上創建這些文件夾。
4、以上文章都介紹到要掛載conf.d文件夾,發現conf.d文件夾下的*.conf配置文件中只允許有server項,其它項都被認為是不允許的文件夾,於是轉念一想直接替換nginx文件夾下的nginx.conf文件,里面可以包括所有字段,而且一定要掛載log文件夾,這樣失敗后能看到錯誤文件error.log。
5、最終運行語句為:(我是在/data/nginx中創建的對應掛載文件夾)
docker run --name mynginx -d -p 80:80 --restart=always -e TZ="Asia/Shanghai" -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/log:/var/log/nginx -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro nginx:v1
四、發布代碼到服務器上,管理項目發布,希望用到jenkins,有的文章說不推薦用docker安裝jenkins了,理由沒說,猜測可能是因為要安裝多次jdk,maven,甚至vi編輯文件不方便?個人感覺還是可以的,記錄下來。https://www.jianshu.com/p/12c9a9654f83
1、剛開始看上面文章怎么拉取的是jenkins/jenkins:lts,但用docker search jenkins看第一個是jenkins啊,而且star最高,於是選擇拉取鏡像docker pull jenkins,拉取下來發現不是docker.io版本(安裝后發現版本是2.60,當前版本已經是2.209,導致許多插件安裝失敗)最后才通過這篇文章 https://www.jianshu.com/p/9a3814c88bf2 發現原來jenkins已經不被更新了,現在更新維護的是jenkins/jenkins。。拉取安裝一切正常。
2、以上安裝完成並創建用戶后,強烈建議重啟一次jenkins對應的docker,然后重新登錄創建的用戶並選擇底部的“保持登錄狀態”。
3、以上安裝完成后如要配置maven項目,需要安裝maven相關插件否則無法創建maven類項目,安裝完jenkins默認jdk 會被安裝,我的centos7.5默認是openjdk-8被安裝在/usr/local/openjdk-8目錄下,后續可以根據 https://www.cnblogs.com/ming-blogs/p/10903408.html 安裝maven相關。在“系統設置 ——> 全局工具配置” 中點擊安裝JDK,自定義名稱后取消自動安裝,填寫JAVA_HOME為默認安裝的jdk路徑 /usr/local/openjdk-8。點擊安裝Maven,選擇自動安裝,被安裝3.6.*某版本並自定義保存名稱后點擊最底部的保存。(當然此處也非常推薦自己手動先安裝maven自己需要的版本,比如3.6.*,然后填寫maven配置跟上面JDK一樣,取消自動安裝,使用自己的maven安裝路徑)
4、在“系統管理 ——> 插件管理”中選擇第二個標簽“可選插件”,右上角過濾框輸入 Maven Integration 篩選插件,找到 Maven Integration 后選中前面的多選框,點擊“直接安裝”。實例中最底部的“安裝完成后重啟Jenkins(空閑時)”不建議選擇,否則會發現頁面卡住不動了,實際是安裝了某些插件后重啟了,然后頁面就不動了,所以這里我們不要選安裝后重啟。而是點擊右上角的“允許自動刷新”,這樣頁面就會默認每隔10秒刷新一次。
5、當所有插件安裝完后,手動重啟下jenkins對應的docker容器。然后重新登錄,發現此時可以創建maven項目了。
6、將自己的maven項目部署到jenkins,執行構建,正常是沒有問題的。如果使用的是自動安裝maven,則第一次會非常慢,如果是在第3 步手動安裝過maven的,則會直接執行下載maven對應插件,會快許多。如果是使用的自動安裝,耐心等待第一次構建完成吧,之后的maven便不再需要安裝。
7、第一次構建完成會發現有些慢,想要替換為國內maven鏡像,需要使用vi命令,但docker中默認找不到vi,所以需要:https://blog.csdn.net/huangbaokang/article/details/98029026
8、安裝完vi,便可以編輯文件,找到maven對應的文件夾下的conf文件夾(我的3.6.3版本默認是安裝在/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.6.3/conf),編輯setting.xml文件,添加mirror參數,此處以國內阿里鏡像為例:
<!-- 阿里雲中央倉庫 --> <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <mirrorOf>central</mirrorOf> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
9、有時候你可能需要手動安裝某些maven插件,比如sqlserver.jar,眾所周知默認sqlserver是無法通過鏡像安裝的,需要手動下載然后上傳到服務器再手動執行添加到服務器本地鏡像庫,下載安裝可以查看之前的文章:https://www.cnblogs.com/jying/p/11294615.html 第一步中的方式。本文重點介紹如何安裝到docker中,首先需要將下載的sqlserver.jar上傳到linux服務器,然后進入sqlserver.jar所在的目錄並通過docker cp sqlserver.jar 鏡像名稱/或鏡像id:/要存放的docker容器中的文件夾路徑(此處以根目錄下/data/tool_files為例);
10、此時你登錄docker容器,執行mvn相關操作提示找不到mvn,但是jenkins卻是可以執行maven相關操作的,說明maven已經安裝,但沒有綁定到環境變量,所以你需要綁定到環境變量,可以按照:https://www.cnblogs.com/chuijingjing/p/10430649.html 中的第二三步綁定。
11、如果提示錯誤,那應該是你執行的docker exec -it 鏡像名稱/或鏡像id bash 登錄進docker內部,此時登錄后是默認以jenkins用戶登錄的,該用戶角色沒有系統權限,
,需要添加-u 0參數使用root用戶登錄才行,
,然后便可以通過第10步綁定環境變量,並通過第9步中文章方式執行。
12、jenkins發布maven項目最后一步需要將war包放到tomcat中,點擊增加構建步驟默認是沒有Deploy war/ear to a container 的,需要在“系統管理——>插件管理”中第二個標簽“可選插件”,右上角過濾“Deploy to container Plugin”,點擊“直接安裝”。安裝完成后重啟dokcer容器,再登錄jenkins就可以選擇了~如下圖中,添加好憑證后,將tomcat對應的docker容器的接口地址填入,便可以將maven項目發布到tomcat對應的容器下的webapps啦~~
13、如果以上tomcat綁定后發布報錯:
則是因為沒有tomcat相應權限,需要添加權限:https://www.cnblogs.com/heiyexiaoguai/p/5162184.html,修改后可能需要重啟下tomcat對應的docker容器。
至此,docker搭建 jenkins + tomcat +nginx 鏡像容器全部完成(數據庫用的是單獨的服務器,沒有用docker),下一步將會寫一篇一步步完整的搭建過程~~