Docker+Gitlib

wind_627發表於2020-11-28

Docker+Gitlib

學習筆記

B站配套視訊: https://www.bilibili.com/video/BV1sK4y1s7Cj

一. Docker介紹

1 引言

  1. 我本地執行沒問題啊。

     環境不一致
    
  2. 哪個哥們又寫死迴圈了,怎麼這麼卡?

     在多使用者的作業系統下,會互相影響。
    
  3. 淘寶在雙11的時候,使用者量暴增。

     運維成本過高的問題。
    
  4. 學習一門技術,學習安裝成本過高。

     關於安裝軟體成本過高。
    

二. 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的中央倉庫

  1. Docker官方的中央倉庫:這個倉庫是映象最全的,但是下載速度很慢。https://hub.docker.com
  2. 國內的映象網站:網易蜂巢、daoCloud…

https://c.163yun.com/hub#/home

http://hub.daocloud.io (推薦使用)

  1. 在公司內部會採用私服的方式拉取映象。(新增配置)
# 需要在/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 引言

專案部署

  1. 將專案通過maven進行編譯打包
  2. 將檔案上傳到指定的伺服器中
  3. 將war包放到tomcat的目錄中
  4. 通過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