>> 虛擬機服務器說明
- Ubuntu server x64 位:基礎Ubuntu系統;配置好賬號密碼;
- Ubuntu server x64 Docker:安裝Docker;
- Ubuntu server x64 Docker Gitlab:Github 自託管Git項目倉庫;
- Ubuntu server x64 Docker Nexus:Maven私服;
- Ubuntu server x64 Docker Registry:鏡像私服;
- Ubuntu server x64 Docker Deploy:拉取項目代碼,製作鏡像,推送到Git私服;
- Ubuntu server x64 Docker MySQL:數據庫服務器;
- Ubuntu server x64 Docker Myforum:拉取鏡像,運行容器;
>> GitLab - 代碼管理平臺
Git是一個第三方代碼託管平臺,互聯網企業,代碼不能放到第三方平臺上,但是又想用Git進行代碼託管,所以只能自己架設一個Git託管平臺;
開源的第三方託管平臺只有Gitlab;Gitlab既可以使用它的第三方託管,又可以本地部署;
Gitlab是利用Ruby on Rails實現的一個開源的版本管理系統,實現一個自託管的Git項目倉庫,可通過web界面訪問公開或私人項目,它擁有與Github類似的功能,能夠瀏覽源代碼、管理缺陷和註釋,可以管理團隊對倉庫的訪問,非常易於瀏覽提交過的版本並提供一個文件歷史庫;
~ GitLab 安裝
1、安裝gitlab的內存最低2G;
2、在docker鏡像中心搜索漢化社區版;
3、複製安裝鏈接:docker pull twang2218/gitlab-ce-zh
4、創建docker-compose.yml
測試最新版本是否能正常運行:
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh'
restart: always
hostname: '192.168.141.176'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.141.176:8080'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
-
hostname
:主機地址(主機名),這裏應該填寫域名,但是我們是本地部署,沒有域名,所以就用IP;hostname就是部署這臺機器的主機的IP地址; -
GITLAB_OMNIBUS_CONFIG
:GitLab初始化操作; -
external_url
:外部訪問地址:web頁面訪問的地址;這個gitlab能夠訪問是因爲使用了Nginx,使用了反向代理來代理了這臺lab被訪問;這個端口要跟Nginx監聽的端口一致; -
gitlab_rails
:SSH訪問:gitlab支持SSH訪問,GitHub也支持,這樣就做到了免密訪問;改成2222是因爲22已經被佔用了,這臺機器已經開了22端口;不改的話就會端口衝突; -
unicorn
:Gitlab的一個內部端口; -
ports
:左邊是宿主機端口,右邊是容器端口;
5、運行容器:root@Ubuntu:/usr/local/docker/gitlab# docker-compose up
(需要等好久好久…)
6、瀏覽器地址欄訪問:192.168.141.176:8080
用戶:root,修改初始密碼爲12345678;
用戶:zxj/12345678
~ Gitlab 基本設置
登錄時是使用的root賬戶,但是真正使用時一般不會使用root賬戶,而是創建一個自己使用的root賬戶;
GitLab 使用 SSH 免密登錄:同Github設置祕鑰一模一樣!
>> Nexus - 依賴管理平臺
Nexus:是一個強大的Maven倉庫管理器(Maven私服);Nexus僅僅是私服的一種;
Nexus是一種遠程倉庫;在遠程倉庫中,默認的是中央倉庫,中央倉庫是Maven核心自帶的遠程倉庫;
那就使用中央倉庫不就得了嗎,爲什麼我們要安裝Nexus使用私服呢?
我們從項目實際開發來看:
1,一些無法從外部倉庫下載的構件,例如內部的項目還能部署到私服上,以便供其他依賴項目使用;
2, 爲了節省帶寬和時間,在局域網內架設一個私有的倉庫服務器,用其代理所有外部的遠程倉庫,當本地Maven項目需要下載構件時,先去私服請求,如果私服沒有,則再去遠程倉庫請求,從遠程倉庫下載構件後,把構件緩存在私服上;這樣,及時暫時沒有Internet鏈接,由於私服已經緩存了大量構件,整個項目還是可以正常使用的;同時,也降低了中央倉庫的負荷;
~ Nexus 安裝
注意:安裝Nexus服務的服務器需要2G內存;
1、複製鏈接:docker pull sonatype/nexus3
2、創建目錄/usr/local/docker/nexus/
,創建docker-compose.yml
文件:
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus
ports:
- 8081:8081
volumes:
- /usr/local/docker/nexus/data:/nexus-data
3、運行容器:docker-compose up
4、啓動會報錯:nexus | Unable to update instance pid: Unable to create directory /nexus-data/instances
,這是因爲鏡像中掛載的數據卷/data
缺少操作權限;
5、刪除正在進行的容器:root@Ubuntu:/usr/local/nexus# docker-compose down
6、修改/data/
目錄操作權限:chmod 777 data/
7、瀏覽器訪問:192.168.141.178:8081
(Nexus暴露的端口是8081,Linux服務器的地址是178)
free -h
:可以查看內存使用狀態;htop
:安裝htop查看內存使用詳細狀態;沒有就安裝一個;
8、登錄:默認賬戶admin/admin123
. (可以登錄進去修改密碼)
~ 在項目中使用Maven私服
1、配置認證信息:
在Maven的settings.xml
中添加Nexus認證信息(servers節點下):
設置發行版的服務節點,和快照版的服務節點;
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
2、配置自動化部署 - 上傳jar/war包到私服
在項目的 pom.xml
中添加如下代碼:
有兩個倉庫地址:發行版和快照版;
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://Linux服務器的地址:8081/repository/maven-releases/</url> // 這個地址可以直接從Nexus中粘貼
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://Linux服務器的地址:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意:
- ID 名稱必須要與 settings.xml 中 Servers 配置的 ID 名稱保持一致;
- 項目版本號中有 SNAPSHOT 標識的,會發布到 Nexus Snapshots Repository, 否則發佈到 Nexus Release Repository,並根據 ID 去匹配授權賬號;
3、部署到倉庫:
在終端進入到項目目錄下執行:$ mvn deploy -Dmaven.test.skip=true
mvn package
:打包,在項目這兒打包;mvn install
:打包到本地倉庫;mvn deploy
:推到私服;服務器是自己架設的,不是每個人都能往上面推送依賴,所以需要在settings.xml
中設置賬號和密碼;
4、在瀏覽器頁面刷新,可以看到上傳了的文件包;
私服的步驟也是先安裝到本地,再上傳到服務器;
5、上傳第三方Jar包:
把無法通過公網從官服下載的第三方依賴,放到私服裏面;這樣別人就能用了;
# 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
mvn deploy:deploy-file
-DgroupId=com.aliyun.oss
-DartifactId=aliyun-sdk-oss
-Dversion=2.2.3
-Dpackaging=jar
-Dfile=D:\aliyun-sdk-oss-2.2.3.jar // 本地存放路徑
-Durl=http://127.0.0.1:8081/repository/maven-3rd/ // 要上傳到的地址
-DrepositoryId=nexus-releases
注意:
- 建議在上傳第三方 JAR 包時,創建單獨的第三方 JAR 包管理倉庫,便於管理有維護;(maven-3rd)
-DrepositoryId=nexus-releases
對應的是settings.xml
中 Servers 配置的 ID 名稱;(授權)
6、配置代理倉庫: 從私服下載依賴
在項目的 pom.xml
中添加如下代碼:
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://服務器IP地址:8081/repository/maven-public/</url> // 公共倉庫:是發行版和快照版倉庫的映射;包含2個地方的所有依賴;
<snapshots>
<enabled>true</enabled> // 允許依賴快照版;設置false,則快照版本無法下載;
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Plugin Repository</name>
<url>http://服務器IP地址:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
>> Registry - 鏡像管理平臺
官方的Docker hub是一個管理公共鏡像的地方,我們可以在上面找到想要的鏡像,也可以把自己的鏡像推送上去;但是有時候,我們的服務器無法訪問互聯網,或者不希望將自己的鏡像放到公網上去,那就需要Docker Registry,來存儲和管理自己的鏡像;
~ Registry 安裝
1、拉取鏡像:root@Ubuntu:~# docker pull registry
2、創建工作目錄/usr/local/docker/registry
,創建docker-compose.yml
文件;
version: '3.1'
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
3、運行容器:root@Ubuntu:/usr/local/docker/registry# docker-compose up -d
4、瀏覽器訪問:192.168.141.179:5000/v2
;(因爲裏面什麼都沒有,所以返回空的json)
~ Docker Registry 配置客戶端
重新克隆一個虛擬機,作爲docker registry 客戶端;然後再在這個客戶機上進行配置;
1、在/etc/docker/daemon.json
中添加下面內容:(若文件不存在,則新建)
root@Ubuntu:/etc/docker# vi daemon.json
root@Ubuntu:/etc/docker# cat daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.141.179:5000"
]
}
2、重啓docker服務,讓配置生效:root@Ubuntu:/etc/docker# systemctl restart docker
3、手動檢查客戶端配置是否生效:root@Ubuntu:/etc/docker# docker info
4、測試鏡像是否能上傳:
- 先拉取一個Tomcat鏡像到本地:
docker pull tomcat
- 使用tag標籤標記本地的Tomcat鏡像爲IP(服務器IP)、端口+名稱:
docker tag tomcat 192.168.141.179:5000/tomcat[:版本號]
拉取鏡像的時候,要的是完整的鏡像地址端口名稱,沒有指定地址端口,默認從中央倉庫拉取; - 推送鏡像到Registry倉庫:
docker push tomcat 192.168.141.179:5000[:版本號]
5、在瀏覽器查看Docker Registry服務器中是否有上傳的鏡像:
http://192.168.141.179:5000/v2/_catalog
:查看全部鏡像;http://192.168.141.179:5000/v2/tomcat/tags/list
:查看指定鏡像;
~ 部署 Docker Registry WebUI
在Docker Registry 服務器操作:
1、先關閉開啓的Registry服務:root@Ubuntu:/usr/local/docker/registry# docker-compose down
2、修改docker-compose.yml
文件,添加Registry的前端 服務:
frontend:
image: konradkleine/docker-registry-frontend:v2
ports:
- 8080:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.141.179
- ENV_DOCKER_REGISTRY_PORT=5000
3、啓動服務:root@Ubuntu:/usr/local/docker/registry# docker-compose up -d
4、瀏覽器訪問:http://192.168.141.179:8080
(Registry 前端的端口映射成了8080)
>> 實現一次構建 到處運行
(1)將項目代碼上傳到 Docker GitLab 服務器上
1、打開http://192.168.141.176:8080
,創建項目,添加readme文件直接提交,什麼也不寫;
2、將項目克隆到本地:
# zxj @ zhangxuejiaodeMacBook-Pro in ~/文檔/Git [15:47:23] C:127
$ git clone ssh://[email protected]:2222/zxj/myforum.git
3、將項目代碼複製到這個目錄下:(除了.git
文件夾)
4、將項目推送到倉庫:
git add .
git status
git commit -m "add all file"
git push -u origin master
(2)配置數據庫服務器 Docker mysql
安裝MySQL,並導入數據庫:https://blog.csdn.net/qq_37546891/article/details/92776939
(3)在docker deploy 服務器完成項目代碼的編譯打包上傳
1、每臺主機都需要在Git服務上添加本機的祕鑰,所以需要先在本機生成祕鑰對,然後在服務器上添加祕鑰:
ssh-keygen -t rsa -C "[email protected]"
:生成祕鑰;需要三次回車;
2、創建項目目錄,克隆:root@Ubuntu:/usr/local/docker# git clone ssh://[email protected]:2222/zxj/myforum.git
3、安裝Java:https://blog.csdn.net/qq_37546891/article/details/92077749
安裝maven:從本地宿主機上傳Maven安裝文件:
root@Ubuntu:/usr/local# tar -zxvf apache-maven-3.6.1-bin.tar.gz
:解壓縮;
4、配置環境變量:在root@Ubuntu:/usr/local# vi /etc/profile
添加:
export MAVEN_HOME=/usr/local/apache-maven-3.6.1
export JAVA_HOME=/usr/local/jdk1.8.0_211
export JRE_HOME=/usr/local/jdk1.8.0_211/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin:$PATH:$HOME/bin
5、使環境變量配置生效:root@Ubuntu:/usr/local# source /etc/profile
檢驗配置是否生效:java -version
、mvn -v
;
6、打包項目:root@Ubuntu:/usr/local/docker/myforum# mvn clean package -Dmaven.test.skip=true
7、打包鏡像:
-
root@Ubuntu:/usr/local/docker/myforum/target/myforum-0.0.1-SNAPSHOT# tar -czvf myforum.tar.gz .
:將tag目錄下的war包文件打成壓縮包; -
root@Ubuntu:/usr/local/docker/myforum/target/myforum-0.0.1-SNAPSHOT# mv myforum.tar.gz ../../image/
:將壓縮包文件移動到/usr/local/docker/myforum/image
目錄下; -
在
/usr/local/docker/myforum/image
目錄下編輯Dockerfile文件:
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
ADD myforum.tar.gz /usr/local/tomcat/webapps/ROOT
RUN rm -fr myforum.tar.gz
WORKDIR /usr/local/tomcat
-
製作鏡像:
root@Ubuntu:/usr/local/docker/myforum/image# docker build -t 192.168.141.179:5000/myforum .
-
將鏡像推送到倉庫:
root@Ubuntu:/usr/local/docker/myforum/image# docker push 192.168.141.179:5000/myforum
-
到倉庫中(
http://192.168.141.179:8080/tag//myforum/latest/
)複製鏡像地址:docker pull 192.168.141.179:5000/myforum:latest
(4)克隆虛擬機Docker Myforum
原則上一臺服務器啓動一個服務,應該克隆一個虛擬機Docker Myforum,在這臺服務器上拉取myforum鏡像並運行容器; 但是由於內存不夠再開一個虛擬機,所以直接在Docker Deploy這臺虛擬機上操作了;
root@Ubuntu:/usr/local/docker# vi docker-compose.yml
version: '3.1'
services:
myforum:
restart: always
image: 192.168.141.179:5000/myforum
container_name: myforum
ports:
- 8080:8080
root@Ubuntu:/usr/local/docker# docker-compose up -d
注意:若是在Docker Myforum,運行容器會出錯,原因是沒有配置客戶端:
myforum容器啓動成功,瀏覽器訪問:192.168.141.180:8080/
(由於使用的是docker mysql這臺服務器,所以地址是180)