Docker+Gitlib
Docker+Gitlib
學習筆記
B站配套視訊: https://www.bilibili.com/video/BV1sK4y1s7Cj
一. Docker介紹
1 引言
我本地執行沒問題啊。
環境不一致
哪個哥們又寫死迴圈了,怎麼這麼卡?
在多使用者的作業系統下,會互相影響。
淘寶在雙11的時候,使用者量暴增。
運維成本過高的問題。
學習一門技術,學習安裝成本過高。
關於安裝軟體成本過高。
二. Docker的基本操作
2.1 安裝Docker
# 1. 下載關於Docker的依賴環境
yum -y install yum-utils device-mapper-persistent-data lvm2
# 2. 設定一下下載Docker的映象源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 安裝Docker
yum makecache fast
yum -y install docker-ce
# 4. 啟動,並設定為開機自動啟動,測試
# 啟動Docker服務
systemctl start docker
# 設定開機自動啟動
systemctl enable docker
# 測試
docker run hello-world
2.2 Docker的中央倉庫
- Docker官方的中央倉庫:這個倉庫是映象最全的,但是下載速度很慢。https://hub.docker.com
- 國內的映象網站:網易蜂巢、daoCloud…
https://c.163yun.com/hub#/home
http://hub.daocloud.io (推薦使用)
- 在公司內部會採用私服的方式拉取映象。(新增配置)
# 需要在/etc/docker/daemon.json
{
"registry-mirrors":["https://e7m5fxhx.mirror.aliyuncs.com"],
"insecure-registries":["ip:port"]
}
# 重啟兩個服務
systemctl daemon-reload
systemctl restart docker
2.3 映象的操作
# 拉取映象到本地
docker pull 映象名稱[:tag]
# 舉個例子
docker pull tomcat daocloud.io/library/tomcat:8.5.15-jre8
# 2. 檢視全部本地的映象
docker images
# 3. 刪除本地映象
docker rmi 映象的標識
# 4. 映象的匯入匯出(不規範)
# 將本地的映象匯出
docker save -o 匯出的路徑 映象id
# 載入本地的映象檔案
docker load -i 映象檔案
# 修改映象名稱
docker tag 映象id 新映象名稱:版本
2.4 容器的操作
# 1. 執行容器
# 簡單操作
docker run 映象的標識|映象名稱[:tag]
# 常用的引數
docker run -d -p 宿主機埠:容器埠 --name 容器名稱 映象的標識|映象名稱[:tag]
# -d:代表後臺執行容器
# -p 宿主機埠:容器埠:為了對映當前Linux埠和容器埠
# --name 容器名稱:指定容器的名稱
# 2. 檢視正在執行的容器
docker ps [-qa]
# -a:檢視全部的容器,包括沒有執行
# -p:只檢視容器得到標識
# 3. 檢視容器的日誌
docker logs -f 容器id
# -f:可以滾動檢視日誌的最後幾行
# 4. 進入到容器內部
docker exec -it 容器id bash
# 5.複製內容到容器
docker cp 檔名稱 容器id:容器內部路徑
# 6.容器的啟動,停止,刪除等操作,後續會經常使用到
#重新啟動容器
docker restart 容器id
#啟動停止執行的容器
docker start 容器id
#停止指定的容器(刪除容器前,需要先停止容器)
docker stop 容器id
#停止全部容器
docker stop $(docker ps -qa)
#刪除指定容器
docker rm 容器id
#刪除全部容器
docker rm $(docker ps -qa)
#Docker私有倉庫
1.私有倉庫搭建
1.1 拉取私有倉庫映象
docker pull registry
1.2 啟動私有倉庫容器
docker run -id --name=容器名稱 -p 宿主機埠:容器埠 registry
1.3 開啟瀏覽器 輸入地址http://私有倉庫伺服器ip:5000/v2/_catalog,看到{“repositories”:[]} 表示私有倉庫 搭建成功
1.4 修改daemon.json
vim /etc/docker/daemon.json
在上述檔案中新增一個key,儲存退出。此步用於讓 docker 信任私有倉庫地址;注意將私有倉庫伺服器ip修改為自己私有倉庫伺服器真實ip
{“insecure-registries”: [“私有倉庫伺服器ip:5000”]}
1.5 重啟docker服務
systemctl restart docker
docker start registry
2. 將映象上傳至私有倉庫
2.1 標記映象為私有倉庫的映象
docker tag centos:7 私有倉庫伺服器IP:5000/centos:7
2.2 上傳標記的映象
docker push 私有倉庫伺服器IP:5000/centos:7
3. 從私有倉庫拉取映象
docker pull 私有倉庫伺服器ip:5000/centos:7
三. Docker應用
3.1 準備SSM工程
# ssm.war下載 這是Jpress軟體包
https://download.lixian.fun/web_project/Jpress-0.4.0.tar.gz
修改SSM工程環境,設定為Linux中Docker容器的資訊
通過Maven的package重新打成war包
將Windows下的war包複製到Linux中
通過docker命令將宿主機的war包複製到容器內部
docker cp 檔名稱 容器id:容器內部路徑
測試訪問SSM工程
# MySQL資料庫的連線使用者名稱和密碼改變了,修改db.properties
3.2 準備MySQL容器
# 執行MySQL容器
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
3.3 準備Tomcat容器
# 執行Tomcat容器,為部署ssm工程做準備
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
#或者已經下載了tomcat映象
docker run -d -p 8080:8080 --name tomcat 映象的標識
# 可以通過命令將宿主機的內容服務到容器內部
docker cp 檔名稱 容器id:容器內部路徑
# 舉個例子
docker cp ssm.war fe:/usr/local/tomcat/webapps
3.4 資料卷
為了部署SSM的工程,需要使用到cp命令將宿主機內的ssm.war檔案複製到容器內部。
資料卷:將宿主機的一個目錄對映到容器的一個目錄中。
可以在宿主機中操作目錄中的內容,那麼容器內部對映的檔案,也會跟著一起改變。
# 1. 建立資料卷
docker volume create 資料卷名稱
# 建立資料卷之後,預設會存放在一個目錄下 /war/lib/docker/volumes/資料卷名稱/_data
# 2. 檢視資料卷的詳細資訊
docker volume inspect 資料卷名稱
# 3. 檢視全部資料卷
docker volume ls
# 4. 刪除資料卷
docker volume rm 資料卷名稱
# 5. 應用資料卷
# 當你對映資料卷時,如果資料卷不存在,Docker會自動幫你建立,會將容器內部自帶的檔案,儲存在預設的存放路徑中
docker run -v 資料卷名稱:容器內部的路徑 映象id
docker run -d -p 8080:8080 --name tomcat -v 資料卷名稱:容器內部的路徑 映象id
# 直接指定一個路徑作為資料卷的存放位置,這個路徑下是空的。
docker run -v 路徑:容器內部的路徑 docker run -d -p 8080:8080 --name tomcat -v 路徑(/root/自己建立的資料夾):容器內部的路徑 映象id
四. Docker自定義映象
中央倉庫上的映象,也是Docker的使用者自己上傳過去的。
# 1. 建立一個Dockerfile檔案,並且指定自定義映象資訊
# Dockerfile檔案中常用的Dockerfile的語言
from:指定當前自定義映象依賴的環境
copy:將相對路徑下的內容複製到自定義映象中
workdir:宣告映象的預設工作目錄
run:執行的命令,可以編寫多個
cmd:需要執行的命令(在workdir下執行的,cmd可以寫多個,只以最後一個為準)
# 舉個例子,自定義一個Tomcat映象,並且將ssm.war部署到Tomcat中
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# 2. 將準備好的Dockerfile和相應的檔案拖拽到Linux作業系統中,通過Docker的命令製作映象
docker build -t 映象名稱:[tag]
五. Docker-Compose
之前執行一個映象,需要新增大量的引數。
可以通過Docker-Compose編寫這些引數。
Docker-Compose可以幫助我們批量的管理容器。
只需要通過一個docker-compose.yml檔案去維護即可。
1.24.1版本的Docker-Compose對應 version:'3.1’
下載路徑:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
5.1 下載Docker-Compose
# 1. 去GitHub官網搜尋docker-compose,下載最新版本的Docker-Compose
# 2. 將下載好的檔案,拖拽到Linux作業系統中
# 3. 需要將Docker-Compose檔名稱修改一下,給予DockerCompose檔案一個可執行的許可權
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
# 4. 配置一個環境變數,方便後期操作。
# 將docker-compose檔案移動到/usr/local/bin,修改了/etc/profile檔案,給/usr/local/bin配置到PATH中
mv docker-compose /usr/local/bin
vi /etc/profile
export PATH=$JAVA_HOME:/usr/local/bin:$PATH
source /etc/profile
# 5. 測試一下
# 在任意目錄下輸入docker-compose
5.2 Docker-Compose管理MySQL和Tomcat容器
yml檔案以key:value方式指定配置資訊
多個配置資訊以換行+縮排的方式來區分
在docker-compose.yml檔案中,不要使用製表符
version:'3.1'
services:
mysql: # 服務的名稱
restart: always # 代表只要Docker啟動,那麼這個容器就跟著一起啟動
image: daocloud.io/library/mysql:5.7.4 # 指定映象路徑
container_name: mysql # 指定容器名稱
ports:
- 3306:3306 # 指定埠號的對映
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT使用者登入密碼
TZ: Asia/Shanghai # 指定時區
volumes:
- /opt/docker_mysql-tomcat/mysql_data:/var/lib/mysql # 對映資料卷
tomcat:
restart: always # 代表只要Docker啟動,那麼這個容器就跟著一起啟動
image: daocloud.io/library/tomcat:8.5.15-jre8 # 指定映象路徑
container_name: tomcat # 指定容器名稱
ports:
- 8080:8080 # 指定埠號的對映
environment:
TZ: Asia/Shanghai # 指定時區
volumes:
- /opt/docker_mysql-tomcat/tomcat_webapps:/usr/local/tomcat/webapps # 對映資料卷
- /opt/docker_mysql-tomcat/tomcat_logs:/usr/local/tomcat/logs # 對映資料卷
5.3 使用Docker-Compose命令管理容器
在使用docker-compose的命令時,預設會在當前目錄下找docker-compose.yml檔案
# 1. 基於docker-compose.yml啟動管理的容器
docker-compose up -d
# 2. 關閉並刪除容器
docker-compose down
# 3. 開啟|關閉|重啟已經存在的由docker-compose維護的容器
docker-compose start|stop|restart
# 4. 檢視由docker-compose管理的容器
docker-compose ps
# 5. 檢視日誌
docker-compose logs -f
5.4 docker-compose配置Dockerfile使用
使用docker-compose.yml檔案以及Dockerfile檔案在生成自定義映象的同時啟動當前映象,並且由docker-compose去管理容器
docker-compose.yml
# yml檔案
version: '3.1'
services:
ssm:
restart: always
build: # 構建自定義映象
context: ../ # 指定Dockerfile檔案所在路徑 ../上一級資料夾
dockerfile: Dockerfile # 指定Dockerfile檔名稱
image: ssm:1.0.1
container_name: ssm
ports:
8081:8080
environment:
TZ: Asia/Shanghai
Dockerfile檔案
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# 執行
# 可以直接啟動基於docker-compose.yml以及Dockerfile檔案構建的自定義映象
docker-compose up -d
# 如果自定義映象不存在,會幫助我們構建出自定義映象,如果自定義映象已經存在,會直接執行這個自定義映象
# 重新構建自定義映象
docker-compose build
# 執行前,重新構建
docker-compose up -d --build
六. Docker DI、CD
6.1 引言
專案部署
- 將專案通過maven進行編譯打包
- 將檔案上傳到指定的伺服器中
- 將war包放到tomcat的目錄中
- 通過Dockerfile將Tomcat和war包轉成一個映象,由DockerCompose去執行容器
專案更新了
將上述流程再次的從頭到尾的執行一次
6.2 CI介紹
CI( continuous intergration )持續整合
持續整合:編寫程式碼時,完成了一個功能後,立即提交程式碼到Git倉庫中,將專案重新的構建並且測試
- 快速發現錯誤
- 防止程式碼偏離主分支
6.3 實現持續整合
6.3.1 搭建GItLab伺服器
1、建立一個全新的虛擬機器,並且至少指定4G的執行記憶體
2、安裝docker以及docker-compose
3、將ssh的預設22埠,修改為60022埠
vi /etc/ssh/sshd_config
PORT 22 -> 60022
systemctl restart sshd
4、編寫docker-compose.yml檔案去安裝GitLab(下載和執行的時間比較長的)
version: '3.1'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:11.1.4'
container_name: "gitlab"
restart: always
privileged: true
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG:
external_url 'http://192.168.199.110'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['gitlab_shell_ssh_port'] = 22
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- /opt/docker_gitlab/config:/etc/gitlab
- /opt/docker_gitlab/data:/var/opt/gitlab
- /opt/docker_gitlab/logs:/var/log/gitlab
6.3.2 搭建GitLab-Runner
1.準備檔案
daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": [ip:ports]
}
資料夾 environment裡面準備maven安裝包,jdk1.8安裝包,Dockerfile,daemon.json以及docker-compose
2.開始搭建
建立工作目錄 /usr/local/docker_gitlab-runner
將docker-compose.yml檔案以及environment目錄全部複製到上述目錄中
在宿主機啟動docker程式後先執行 sudo chown root:root /var/run/docker.sock (如果重啟過 docker,重新執行)
在/usr/local/docker_gitlab-runner 目錄中執行docker-compose up -d –build 啟動容器
新增容器許可權,保證容器可以使用宿主機的dockerdocker exec -it gitlab-runner usermod -aG root gitlab-runner
註冊Runner資訊到gitlab
3.進入後續步驟
docker exec -it gitlab-runner gitlab-runner register
# 輸入 GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.199.109/
# 輸入 GitLab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh
# 輸入 Runner 的說明
Please enter the gitlab-ci description for this runner:
可以為空
# 設定 Tag,可以用於指定在構建規定的 tag 時觸發 ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
# 這裡選擇 true ,可以用於程式碼上傳後直接執行(根據版本,也會沒有次選項)
Whether to run untagged builds [true/false]:
true
# 這裡選擇 false,可以直接回車,預設為 false(根據版本,也會沒有次選項)
Whether to lock Runner to current project [true/false]:
false
# 選擇 runner 執行器,這裡我們選擇的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
6.3.3 整合專案入門測試
1、建立maven工程,新增web.xml檔案,編寫html頁面
2、編寫gitlab-ci.yml檔案
stages:
- test
test:
stage: test
script:
- echo first test ci # 輸入的命令
3、將maven工程推送到Gitlab中
執行git命令推送到Gitlab
git push origin master
4、可以在Gitlab中檢視到gitlab-ci.yml編寫的內容
6.3.4 修改gitlab-ci.yml檔案 完善專案配置
1、編寫gitlab-ci.yml測試命令使用
# ci.yml
stages:
- test
test:
stage: test
script:
- echo first test ci
- /usr/local/maven/apache-maven-3.6.3/bin/mvn package
- cp target/testci-1.0-SNAPSHOT.war docker/testci.war
- docker-compose down
- docker-compose up -d --build
- docker rmi $(docker images -qf dangling=true)
2、編寫關於Dockerfile以及docker-compose檔案的具體內容
# 1. Dockerfile
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps
# 2. docker-compose.yml
version: "3.1"
services:
testci:
build: docker
restart: always
container_name: testci
ports:
- 8080:8080
3、測試
7.4 CD介紹
剩下的是Jenkins+Gitlib實現自動化部署上線,感興趣的小夥伴可以學習學習。地址如下:
Gitlib文章:https://www.lixian.fun/category/devops/gitlib
Jenkins文章:https://www.lixian.fun/category/devops/jenkins