java基礎-day67-Docker02

七、Docker應用


7.1 Docker安裝Tomcat

運行Tomcat容器,為部署SSM工程做準備

# 運行Tomcat容器
[root@localhost ~]# docker run -d -p 8080:8080 --name mytomcat b8dfe9ade316

7.2 Docker安裝MySQL

運行MySQL容器,為部署SSM工程做準備

# 拉取MySql鏡像
[root@localhost ~]# docker pull daocloud.io/library/mysql:5.7.4

# 運行MySql容器
[root@localhost ~]# docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4

7.3 部署SSM工程

  • 修改SSM工程環境,設置為Linux中Docker容器的信息
  • 通過Maven的package重新打成war包
  • 將Windows下的war包復制到Linux中
  • 通過docker命令將宿主機的war包復制到容器內部
  • 測試訪問SSM工程

八、數據卷【重點


為了部署SSM的工程,需要使用到cp的命令將宿主機內的ssm.war文件復制到容器內部。

數據卷:將宿主機的一個目錄映射到容器的一個目錄中。

可以在宿主機中操作目錄中的內容,那么容器內部映射的文件,也會跟著一起改變。

8.1 創建數據卷

創建數據卷之后,默認會存放在一個目錄下 /var/lib/docker/volumes/數據卷名稱/_data

docker volume create 數據卷名稱

#創建一個名為tomcat的數據卷
[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker volume create tomcat
[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd /var/lib/docker/volumes

8.2 查看數據卷詳情

查看數據卷的詳細信息,可以查詢到存放路徑,創建時間等等

docker volume inspect 數據卷名稱

[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker volume inspect tomcat

8.3 查看全部數據卷

查看全部數據卷信息

docker volume ls

[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker volume ls

8.4 刪除數據卷

刪除指定數據卷

docker volume rm 數據卷名稱

[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker volume rm tomcat

8.5 容器映射數據卷

映射有兩種方式:

  • 第一種:通過數據卷名稱映射,如果數據卷不存在。Docker會幫你自動創建,會將容器內部自帶的文件,存儲在默認的存放路徑中。
  • 第二種:通過路徑映射數據卷,直接指定一個路徑作為數據卷的存放位置。但是這個路徑下是空的。
# 第一種:通過數據卷名稱映射
docker run -v 數據卷名稱:容器內部的路徑 鏡像id

[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker volume create mytomcat_volume
[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker run -d -p 8080:8080 --name mytomcat -v mytomcat_volume:/usr/local/tomcat/webapps b8
[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd /var/lib/docker/volumes
[root@iz8vbdmrir2n6xqzrbd93hz volumes]# ls
3fdc377f615693578180d1e7433d30e42baa53058eb55ebf86b6c4d0ed27d87a  metadata.db mytomcat_volume
[root@iz8vbdmrir2n6xqzrbd93hz volumes]# cd mytomcat_volume/
[root@iz8vbdmrir2n6xqzrbd93hz mytomcat_volume]# ls
_data
[root@iz8vbdmrir2n6xqzrbd93hz mytomcat_volume]# cd _data/
[root@iz8vbdmrir2n6xqzrbd93hz _data]# ls
docs  examples  host-manager  manager  ROOT


# 第二種:通過路徑映射數據卷
docker run -v 路徑:容器內部的路徑 鏡像id

[root@iz8vbdmrir2n6xqzrbd93hz ~]# docker run -d -p 8080:8080 --name mytomcat -v /opt/yangl:/usr/local/tomcat/webapps b8
f70074ae145572c85c00afa5be9c2abb938906238be1c958b51d02806975f8de
[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd opt
-bash: cd: opt: No such file or directory
[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd /opt/yangl
[root@iz8vbdmrir2n6xqzrbd93hz yangl]# ls
[root@iz8vbdmrir2n6xqzrbd93hz yangl]# mkdir ROOT
[root@iz8vbdmrir2n6xqzrbd93hz yangl]# cd ROOT/
[root@iz8vbdmrir2n6xqzrbd93hz ROOT]# vim index.html

九、Dockerfile自定義鏡像【重點


我們可以從中央倉庫下載一個鏡像,也可以自己手動去制作一個鏡像,需要通過Dockerfile去指定自定義鏡像的信息

9.1 Dockerfile

創建自定義鏡像就需要創建一個Dockerfile,如下為Dockerfile的語言

from: 指定當前自定義鏡像依賴的環境
copy: 將相對路徑下的內容復制到自定義鏡像中
workdir: 聲明鏡像的默認工作目錄
run: 執行的命令,可以編寫多個
cmd: 需要執行的命令(在workdir下執行的,cmd可以寫多個,只以最后一個為準)

# 制作SSM容器鏡像,video-web.war要放在Dockerfile的同級目錄下
# 右鍵創建文件,命名為:Dockerfile 該文件無后綴,然后在文件添加如下內容
from daocloud.io/library/tomcat:8.5.15-jre8
copy video-web.war /usr/local/tomcat/webapps

# 在root目錄下創建一個目錄,然后把Dockerfile文件和video-web.war都拷貝過來
[root@iz8vbdmrir2n6xqzrbd93hz ~]# mkdir myssm
[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd myssm
[root@iz8vbdmrir2n6xqzrbd93hz myssm]# ls
Dockerfile  video-web.war

9.2 通過Dockerfile制作鏡像

編寫完Dockerfile后需要通過命令將其制作為鏡像,并且要在Dockerfile的當前目錄下,之后即可在鏡像中查看到指定的鏡像信息,注意最后的 .

docker build -t 鏡像名稱[:tag] .

[root@iz8vbdmrir2n6xqzrbd93hz myssm]# docker build -t tomcat-video:1.0 .
Sending build context to Docker daemon   18.4MB
Step 1/2 : from daocloud.io/library/tomcat:8.5.15-jre8
 ---> b8dfe9ade316
Step 2/2 : copy video-web.war /usr/local/tomcat/webapps
 ---> cb8ea4a83137
Successfully built cb8ea4a83137
Successfully tagged tomcat-video:1.0

[root@iz8vbdmrir2n6xqzrbd93hz myssm]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE
tomcat-video                 1.0                 cb8ea4a83137        About a minute ago   352MB
hello-world                  latest              bf756fb1ae65        7 months ago         13.3kB
daocloud.io/library/tomcat   8.5.15-jre8         b8dfe9ade316        3 years ago          334MB
daocloud.io/library/mysql    5.7.4               aa5364eb3d85        5 years ago          252MB

[root@iz8vbdmrir2n6xqzrbd93hz myssm]# docker run -d -p 8081:8080 --name tomcat-video-ssm cb8
c5faa261b5b01d77467ce7e3ac6a7310aac6f21aabfdc9f002b5790381f96c52


十. Docker-Compose【重點


之前運行一個鏡像,需要添加大量的參數,可以通過Docker-Compose編寫這些參數。而且Docker-Compose可以幫助我們批量的管理容器。這些信息只需要通過一個docker-compose.yml文件去維護即可。

10.1 下載并安裝Docker-Compose

10.1.1 下載Docker-Compose

去github官網搜索docker-compose,下載1.24.1版本的Docker-Compose

下載路徑:https://github.com/docker/compose/releases/tag/1.24.1

10.1.2 設置權限

需要將docker-compose-Linux-x86_64文件拷貝到/usr/local 目錄下,然后設置docker-compose-Linux-x86_64文件的權限

[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd /usr/local
[root@iz8vbdmrir2n6xqzrbd93hz local]# ls
aegis  bin  docker-compose-Linux-x86_64  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@iz8vbdmrir2n6xqzrbd93hz local]# chmod 777 docker-compose-Linux-x86_64 

10.1.3 配置環境變量

方便后期操作,配置一個環境變量,查看之前配置jdk的環境文件

[root@iz8vbdmrir2n6xqzrbd93hz local]# vim /etc/profile
# 添加內容:export PATH=/usr/local:$PATH
[root@iz8vbdmrir2n6xqzrbd93hz local]# source /etc/profile
# source /etc/profile加載成功后,在任意目錄下執行:docker-compose-Linux-x86_64 會出現以下信息
[root@iz8vbdmrir2n6xqzrbd93hz local]# docker-compose-Linux-x86_64 
測試效果
image.png

10.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
    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

10.3 使用docker-compose命令管理容器

在使用docker-compose的命令時 ,默認會在當前目錄下找docker-compose.yml文件,由于docker-compose.yml文件的volumes指定的地址是 /opt/docker_mysql_tomcat,所以我們首先需要在opt目錄下創建docker_mysql_tomcat目錄,然后進入該目錄創建docker-compose.yml文件,并粘貼以上寫好的內容

[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd /opt
[root@iz8vbdmrir2n6xqzrbd93hz opt]# ls
containerd  yangl
[root@iz8vbdmrir2n6xqzrbd93hz opt]# mkdir docker_mysql_tomcat
[root@iz8vbdmrir2n6xqzrbd93hz opt]# ls
containerd  docker_mysql_tomcat  yangl
[root@iz8vbdmrir2n6xqzrbd93hz opt]# cd docker_mysql_tomcat/
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# vim docker-compose.yml 

# 停止之前的所有的容器并刪除
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker stop $(docker ps -qa)
0274ca45914b
f70074ae1455
2db5a3fe0a92
425b6e8e1806
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker rm $(docker ps -qa)
0274ca45914b
f70074ae1455
2db5a3fe0a92
425b6e8e1806
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# 使用docker-compose命令
# 1. 基于docker-compose.yml啟動管理的容器
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker-compose-Linux-x86_64 up -d
Creating network "docker_mysql_tomcat_default" with the default driver
Creating mysql  ... done
Creating tomcat ... done

# 2. 查看由docker-compose管理的容器
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker-compose-Linux-x86_64 ps
 Name               Command               State           Ports         
------------------------------------------------------------------------
mysql    /entrypoint.sh mysqld --da ...   Up      0.0.0.0:3306->3306/tcp
tomcat   catalina.sh run                  Up      0.0.0.0:8080->8080/tcp
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# 

# 3. 查看日志
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker-compose-Linux-x86_64 logs -f

# 4. 關閉并刪除容器
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker-compose-Linux-x86_64 down
Stopping tomcat ... done
Stopping mysql  ... done
Removing tomcat ... done
Removing mysql  ... done
Removing network docker_mysql_tomcat_default

# 5. 開啟|關閉|重啟已經存在的由docker-compose維護的容器
docker-compose-Linux-x86_64 start|stop|restart

10.4 docker-compose配合Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定義鏡像的同時啟動當前鏡像,并且由docker-compose去管理容器

10.4.1 為了方便操作,在盤符下創建docker_ssm文件夾,在該目錄下創建Dockerfile文件以及拷貝video-web.war

編寫Dockerfile文件

from daocloud.io/library/tomcat:8.5.15-jre8
copy video-web.war /usr/local/tomcat/webapps
10.4.2 在docker_ssm目錄下創建docker-compose文件夾,在docker-compose目錄下創建docker-compose.yml

編寫docker-compose.yml文件

# yml文件
version: '3.1'
services:
  video:  # mysql數據庫的名稱
    restart: always
    build:            # 構建自定義鏡像
      context: ../      # 指定dockerfile文件的所在路徑
      dockerfile: Dockerfile   # 指定Dockerfile文件名稱
    image: video-ssm:1.0.1
    container_name: video-ssm
    ports:
      - 8081:8080
    environment:
      TZ: Asia/Shanghai
10.4.3 把docker_ssm目錄拷貝到虛擬機上的opt目錄下,然后測試

步驟如下:

[root@iz8vbdmrir2n6xqzrbd93hz opt]# ls
containerd  docker_mysql_tomcat  docker_ssm  yangl
[root@iz8vbdmrir2n6xqzrbd93hz opt]# cd docker_ssm/
[root@iz8vbdmrir2n6xqzrbd93hz docker_ssm]# ls
docker-compose  Dockerfile  video-web.war
[root@iz8vbdmrir2n6xqzrbd93hz docker_ssm]# cd docker-compose/
[root@iz8vbdmrir2n6xqzrbd93hz docker-compose]# ls
docker-compose.yml

# 可以直接啟動基于docker-compose.yml以及Dockerfile文件構建的自定義鏡像
[root@iz8vbdmrir2n6xqzrbd93hz docker-compose]# docker-compose-Linux-x86_64 up -d
Building video
Step 1/2 : from daocloud.io/library/tomcat:8.5.15-jre8
 ---> b8dfe9ade316
Step 2/2 : copy video-web.war /usr/local/tomcat/webapps
 ---> 557e0830e974
Successfully built 557e0830e974
Successfully tagged video-ssm:1.0.1
WARNING: Image for service video was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating video-ssm ... done
# 出現以上內容后,可使用瀏覽器訪問進行測試(注意:提前在mysql創建對應名字的數據庫并導入數據)

WARNING: Image for service video was built because it did not already exist. To rebuild this image you must use docker-compose build or docker-compose up --build.

以上警告表示內容如下:

# 如果自定義鏡像不存在,會幫助我們構建出自定義鏡像,如果自定義鏡像已經存在,會直接運行這個自定義鏡像
# 重新構建的話。
# 重新構建自定義鏡像
docker-compose build
# 運行當前內容,并重新構建
docker-compose up -d --build

十一. Docker CI、CD


11.1 CI、CD引言

項目部署

  • 將項目通過maven進行編譯打包
  • 將文件上傳到指定的服務器中
  • 將war包放到tomcat的目錄中
  • 通過Dockerfile將Tomcat和war包轉成一個鏡像,由DockerCompose去運行容器

項目更新后,需要將上述流程再次的從頭到尾的執行一次,如果每次更新一次都執行一次上述操作,很費時,費力。我們就可以通過CI、CD幫助我們實現持續集成,持續交付和部署。

11.2 CI介紹

CI(continuous intergration)持續集成

持續集成:編寫代碼時,完成了一個功能后,立即提交代碼到Git倉庫中,將項目重新的構建并且測試。

  • 快速發現錯誤。
  • 防止代碼偏離主分支。

11.3 搭建Gitlab服務器

實現CI,需要使用到Gitlab遠程倉庫,先通過Docker搭建Gitlab

11.3.1 準備工作
  • 創建一個全新的虛擬機,并且至少指定4G的運行內存,4G運行內存是Gitlab推薦的內存大小。
  • 并且安裝Docker以及Docker-Compose
11.3.2 修改ssh的22端口

將ssh的默認22端口,修改為60022端口,因為Gitlab需要占用22端口

vi /etc/ssh/sshd_config
  PORT 22 -> 60022
systemctl restart sshd
11.3.3 編寫docker-compose.yml

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

11.4 搭建GitlabRunner

查看資料中的gitlab-runner文件即可安裝

11.5 整合項目入門測試

11.5.1 創建項目

創建maven工程,添加web.xml文件,編寫html頁面

11.5.2 編寫.gitlab-ci.yml

編寫.gitlab-ci.yml文件

stages:
  - test

test:
  stage: test
  script:
    - echo first test ci   # 輸入的命令
11.5.3 將maven工程推送到gitlab中

執行git命令推送到Gitlab

git push origin master
11.5.4 查看效果

可以在gitlab中查看到gitlab-ci.yml編寫的內容

效果圖
image.png

11.6 完善項目配置

添加Dockerfile以及docker-compose.yml, 并修改.gitlab-ci.yml文件

11.6.1 創建Dockerfile
# Dockerfile
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps
11.6.2 創建docker-compose.yml
# docker-compose.yml
version: "3.1"
services:
  testci:
    build: docker
    restart: always
    container_name: testci
    ports:
      - 8080:8080
11.6.3 修改.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)
11.6.4 測試
測試效果
image.png

11.7 CD介紹

CD(持續交付,持續部署)

持續交付:將代碼交付給專業的測試團隊去測試

持續部署:可以直接將指定好tag的代碼直接部署到生產環境中

CICD圖
image.png

11.8 安裝Jenkins

11.8.1 編寫docker-compose.yml

官網:https://www.jenkins.io/

version: "3.1"
services:
  jenkins:
   image: jenkins/jenkins
   restart: always
   container_name: jenkins
   ports:
     - 8888:8080
     - 50000:50000
   volumes:
     - ./data:/var/jenkins_home
11.8.2 運行并訪問Jenkins

第一次運行時,會因為data目錄沒有權限,導致啟動失敗

chmod 777 data

訪問http://192.168.199.109:8888

訪問速度奇慢無比。。。。。

訪問成功后,需要輸入密碼,可在日志中查看

image.png

手動指定插件安裝:指定下面兩個插件即可

publish ssh.

git param.

image.png

安裝成功后,需要指定上用戶名和密碼,登陸成功

image.png

11.9 配置Jenkins的目標服務器

執行過程為代碼提交到Gitlab,Jenkins會從Gitlab中拉取代碼,并在Jenkins中打包并發布到目標服務器中。

11.9.1 點擊左側的系統設置
左側導航
image.png
11.9.2 選中中間區域的系統設置
系統設置
image.png
11.9.3 搜索Publish over SSH
Publish over SSH
image.png
11.9.4 點擊上圖新增
新增SSH連接
image.png

11.10 配置GitLab免密碼登錄

鏈接Gitlab需要使用密碼,我們可以通過SSH的方式,免密碼登陸Gitlab拉取代碼,避免每次都輸入密碼。

11.10.1登錄Jenkins容器內部
docker exec -it jenkins bash
11.10.2 輸入生成SSH秘鑰命令
ssh-keygen -t rsa -C "郵箱(隨便寫)"
11.10.3將秘鑰復制到GitLab的SSH中
配置密鑰
image.png

11.11 配置JDK和Maven

我們需要再Jenkins中將代碼打包,需要依賴JDK和Maven的環境

11.11.1 復制軟件到data目錄下
效果
image.png
11.11.2 在監控界面中配置JDK和Maven
配置環境變量
image.png
11.11.3 手動拉取gitlab項目

使用SSH無密碼連接時,第一次連接需要手動確定

手動拉取一次
image.png

11.12 創建maven任務

實現通過Jenkins的Maven任務,自動去Gitlab拉取代碼,并在本地打包,發布到目標服務器上

11.12.1 創建maven工程,推送到GitLab中

隨便創建一個即可……

11.12.2 Jenkins的監控頁面中創建maven任務
指定GitLab地址
image.png
指定maven打包方式
image.png
11.12.3 執行maven任務
立即構建,并查看日志
image.png
控制臺查看日志信息
image.png
11.12.4 最終效果
打包成功
image.png

11.13 實現持續交付持續部署

實現根據tag標簽,實現持續交付和持續部署

11.13.1 安裝Persistent Parameter的插件
安裝插件
image.png
11.13.2 重新指定構建項目的方式
根據標簽構建項目
image.png
自定義構建
image.png
11.13.3 構建項目成功后,需要將內容發布到目標服務器
發布服務器后執行的命令
image.png
11.13.4 添加程序代碼
# Dockerfile 文件
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps

# docker-compose.yml文件
version: "3.1"
services:
  testcd:
    build: docker
    restart: always
    container_name: testcd
    ports:
      - 8081:8080
11.13.5 測試
根據標簽修改發布版本
image.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容