使用docker部署项目到linux(超详细)

一、Docker 是什么

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

二、Docker 解决了什么

2.1环境不一致
本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。
2.2隔离性
哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。
2.3弹性伸缩
淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。

三、云计算和虚拟化 和 容器化

特性虚拟机容器
隔离级别操作系统级进程级
隔离策略HypervisorCGroups
系统资源5~15%0~5%
启动时间分钟级秒级
镜像存储GB-TBKB-MB
集群规模上百上万
高可用策略备份、容灾、迁移弹性、负载、动态

架构

在这里插入图片描述

工作原理

链接https://www.cnblogs.com/wn1m/p/11284560.html.

四、安装docker

切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker.

如遇yum安装问题(rpm: 未找到命令)可参考如下链接:
https://blog.csdn.net/weixin_56219549/article/details/122391551.

4.1下载Docker依赖的环境

旧版本的 Docker 称为 docker 或者 docker-engine,可使用以下命令卸载旧版本:(没有则忽略

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖IDK一样(yum install -y yum-utils)

[root@base ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

4.2指定Docker镜像源

默认下载Docker会去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.3安装Docker

更新 yum 软件源缓存,并安装 docker-ce。

yum install docker-ce docker-ce-cli containerd.io

其他参考执行(这里不要执行)

# 更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存
# 这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
yum makecache fast

# yum 会把下载的软件包和header存储在cache中而不自动删除。如果觉得占用磁盘空间,可以使用yum clean指令清除缓存
yum clean

# 单独安装指令
yum -y install docker-ce

# 显示 Docker 系统信息,包括镜像和容器数。
docker info

4.4Docker配置阿里云镜像加速

访问 https://help.aliyun.com/document_detail/60750.html.

进入控制台
在这里插入图片描述
找到镜像加速器
在这里插入图片描述
执行指令

vim /etc/docker/daemon.json

如报错看下是否有启动docker service

[root@base ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
  scan: Docker Scan (Docker Inc., v0.12.0)

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
[root@base ~]# systemctl daemon-reload
[root@base ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@base ~]# service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2021-12-22 16:49:50 CST; 9s ago
     Docs: https://docs.docker.com
 Main PID: 8634 (dockerd)
    Tasks: 9
   Memory: 36.7M
   CGroup: /system.slice/docker.service
           └─8634 /usr/bin/dockerd -H fd:// --containerd=/run/cont...

12月 22 16:49:49 base dockerd[8634]: time="2021-12-22T16:49:49.6...r
12月 22 16:49:49 base dockerd[8634]: time="2021-12-22T16:49:49.6..."
12月 22 16:49:49 base dockerd[8634]: time="2021-12-22T16:49:49.7..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.0..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1...2
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1..."
12月 22 16:49:50 base systemd[1]: Started Docker Application Con....
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.2..."
Hint: Some lines were ellipsized, use -l to show in full.
[root@base ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
  scan: Docker Scan (Docker Inc., v0.12.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.12
 Storage Driver: devicemapper
  Pool Name: docker-253:0-33672984-pool
  Pool Blocksize: 65.54kB
  Base Device Size: 10.74GB
  Backing Filesystem: xfs
  Udev Sync Supported: true
  Data file: /dev/loop0
  Metadata file: /dev/loop1
  Data loop file: /var/lib/docker/devicemapper/devicemapper/data
  Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
  Data Space Used: 11.73MB
  Data Space Total: 107.4GB
  Data Space Available: 16.3GB
  Metadata Space Used: 17.36MB
  Metadata Space Total: 2.147GB
  Metadata Space Available: 2.13GB
  Thin Pool Minimum Free Space: 10.74GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.170-RHEL7 (2020-03-24)
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1160.49.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.777GiB
 Name: base
 ID: DURT:ADTE:73X3:5MJD:PMCJ:VTAQ:ZLD7:QLAC:OE2O:I5OF:WTSH:6KHX
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release.
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
         Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
[root@base ~]# vim /etc/docker/daemon.json

添加如下内容,具体地址自己申请咯

{
  "registry-mirrors": ["https://****.mirror.aliyuncs.com"]
}

重启服务

systemctl daemon-reload
systemctl restart docker
docker info

4.5Docker启动及设置开机自动启动

启动Docker服务

systemctl start docker	

设置开机自动启动

systemctl enable docker	

4.6 寻找镜像 mysql下载到本地 并且跑起来

链接:https://hub.docker.com/_/mysql.
拉取mysql镜像

docker pull mysql

运行一个mysql的docker容器

[root@base ~]# docker run --name lht-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
d7a8f3a4b1ae201a0a553494560d42b42039d1cd35e3d1868c165680d10d2464
--name="nginx-lb": 为容器指定一个名称;
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-e username="ritchie": 设置环境变量;
 MYSQL_ROOT_PASSWORD即root账户的密码。
-d: 后台运行容器,并返回容器ID;
mysql:5.7 镜像

查看是否运行成功

[root@base ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
d7a8f3a4b1ae   mysql:5.7   "docker-entrypoint.s…"   6 minutes ago   Up 6 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   lht-mysql

五、镜像相关的指令

5.1 拉取镜像

docker pull 镜像名称[:tag]
# 举例 :docker pull daocloud.io/library/tomcat:8.5.15-jre8

5.2 查看本地全部镜像

#查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小
docker images

5.3 删除本地镜像

#镜像会占用磁盘空间,可以手动删除,表示通过查看获取
docker rmi 镜像的标识

5.4 镜像的导入导出

# 如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名和版本都是null,需要手动修改

# 讲本地镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像的名称
docker tag 镜像id 新镜像名称:版本

5.5 搜索镜像

docker search ******

六、容器相关指令

6.1 运行容器需要指定具体镜像,如果镜像不存在,会直接下载

# 简单运行
docker run 镜像的标识|镜像名称[:tag]

# 常用参数

docker run  -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d: 后台运行容器,并返回容器ID;
# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
# --name="nginx-lb": 为容器指定一个名称;
# -e username="ritchie": 设置环境变量;

6.2 查看正则运行的容器

docker ps [-qa]
# -a :查看全部的容器,包括没有运行的
# -q:之查看容器标识

6.3 查看容器日志

# 查看容器日志,以查看容器运行的信息
docker logs -f 容器id
#  -f:可以滚动查看日志的最后几行

6.4 进入容器内部

# 可以进入容器内部进行操作
docker exec -it 容器id bash

6.5 复制内容到容器

# 将宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径

6.6 重启&启动&停止&删除容器

# 重新启动容器
docker restart 容器id

# 启动停止运行的容器id
docker start 容器id

# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)

# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)

七、数据卷

7.1 什么是数据卷

数据卷:将宿主机的一个目录映射到容器的一个目录中。
可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着起改变。

7.2 创建数据卷

创建数据卷之后,默认会存放再一个目录下/var/lib/docker/volumes/数据卷名称/_data

docker volume create 数据卷名称

7.3 查看数据卷详情

查看数据卷详情信息,可以查询到存放路径,创建时间等等。

docker volume inspect 数据卷名称

7.4 查看全部数据卷

docker volume ls

7.5 删除数据卷

docker volume rm 数据卷名称

7.6 容器映射数据卷

映射有两种方式:
通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。
通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。

# 通过数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id

# 通过路径映射数据卷
docker run -v 路径:容器内部的路径 镜像id

7.7 案例

1: 创建mysql 镜像不带数据卷
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7

2:连上 添加数据
在这里插入图片描述
3: 删除再创建容器 刷新数据库后发现数据已经没有了

[root@base ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
ddc6af90851d   mysql:5.7   "docker-entrypoint.s…"   7 minutes ago   Up 7 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   some-mysql
[root@base ~]# docker rm -f dd
dd
[root@base ~]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306  -d mysql:5.7 
02d8ee5b48d9037ff22be4e77d4ff3f80a25cb239368ead631f01043fc6f4afc

在这里插入图片描述
4: 重新创建容器 带数据卷
4.1 创建新的数据卷
docker volume create mysqldata
4.2 创建容器带数据卷
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
或者
$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
宿主机路径 容器中路径
4.3 做删除容器再回复的实验(这一次刷新之后发现还在)
在这里插入图片描述
具体执行linux指令

[root@base ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
02d8ee5b48d9   mysql:5.7   "docker-entrypoint.s…"   20 seconds ago   Up 19 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   some-mysql
[root@base ~]# docker rm -f 02
02
[root@base ~]# docker volume create mysqldata
mysqldata
[root@base ~]# cd /var/lib/docker/volumes
[root@base volumes]# ls
02cefc2d2d72c82add15f798d7929405854c5c65359d5682b4c45838b180d45c  backingFsBlockDev                                                 mysqldata
750246a20f6ab042c9a71ccd3bedddbffa0c3348537a7857a035dc2a13e0c6d4  ef96b79bf04e5e35e4a02001e3f9265495d81d94637cb080f6fd9625ddf6334a
7d3cbb86159bff710d2063a82a756a701c01775ee885fabb68358d246460ebb3  metadata.db
[root@base volumes]# cd mysqldata/
[root@base mysqldata]# ls
_data
[root@base mysqldata]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
24a2456a2048171737ad3f0a2d5cc4e23397c7f2df63142f778ddbeba954494c
[root@base mysqldata]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
24a2456a2048   mysql:5.7   "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   some-mysql
[root@base mysqldata]# docker rm -f 24
24
[root@base mysqldata]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
66d2797cdf066d36e16197a4a0c9ceaa190dbf657352b481133dbc8d74dd2cee
#这里进入容器内部查看/var/lib/mysql
[root@base lib]# docker exec -it 66 bash
root@66d2797cdf06:/# ls 
bin  boot  dev	docker-entrypoint-initdb.d  entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@66d2797cdf06:/# cd /var/lib/mysql
root@66d2797cdf06:/var/lib/mysql# ls
auto.cnf    ca.pem	     client-key.pem  ib_logfile0  ibdata1  mysql	       private_key.pem	server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile1  ibtmp1   performance_schema  public_key.pem	server-key.pem	 test_volume
root@66d2797cdf06:/var/lib/mysql# 

八、Docker Dockerfile

8.1 什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
我们可以从中央仓库下载一个镜像,也可以自己手动去制作—个镜像,需要通过Dockerfile去指定自定义镜像的信息

8.2 Dockerfile的基本语法

创建自定义镜像就需要创建一个Dockerfile,如下为Dockerfile的语言
from:指定当前自定义镜像依赖的坏境
copy:将相对路径下的内容复制到自定义镜像中workdir :声明镜像的默认工作目录
run:执行的命令,可以编写多个
cmd:需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)

#举个例子,制作SSM容器镜像,而且ssm.war要放在Dockerfile的同级目录下
from daocloud.io/library/tomcat: 8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps

copy 与add
add 能完成copy的所有事情

  • add还能解压
  • add还能从url_拷贝文件到镜像
ADD http://example.com/ big.tar.xz /usr/src/things/
run cmd ENTRYPOINT

RUN命令执行命令并创建新的镜像层,通常用于安装软件包
CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行docker run时指定了其他命令)
env 环境变量设置
expose 容器暴露端口

8.3 通过Dockerfile创建镜像

编写完Dockerfile后需要通过命令将其制作为镜像,并且要在Dockerfile的当前目录下,之后即可在镜像中查看到指定的镜像信息,注意最后的 .

docker bui1d -t 镜像名称[:tag] .

8.4 举例

创建Dockerfile

FROM openjdk:8-jre--我要创建的镜像 继承jdk8的镜像
ENV HOME /home
run mkdir HOME--在镜像中执行命令
COPY ./my. jar HOME/my. jar--把宿主机中的文件copy 到容器中
WORKDIR HOME--workdir定义容器的工作目录
EXPOSE 8090
ENTRYPOINT [" java", " -jar", "my.jar"]--容器一启动马上执行的命令

创建镜像

docker build -t myhub:1.0 .
# docker build 要在和dockerfile 同一路径下执行

根据镜像创建容器

docker run -p 8080:8090 -d myhub:1.0

** 创建dockerfile 有参数的** 运行容器的时候 指定环境参数

FROM openjdk:8-jre
ENV HOME /home
ENV profile dev
run mkdir HOME
COPY ./my.jar HOME/my.jar
WORKDIR HOME
ENTRYPOINT java -jar my.jar --spring.profiles.active=$profile

创建镜像

docker build -t myhub1:1.0 .

运行的时候传参数

docker run -p 8081:8091 -e profile=prod -d myhub1:1.0

8.5 测试(准备一个项目,mvn package打包如有第三方jar包可参考以下网址打包)

链接:https://www.cnblogs.com/stm32stm32/p/9973325.html.
在这里插入图片描述

mvn clean
mvn install
mvn package--jar包文件打包在target目录中
java -jar target/项目名.jar--能在本地运行成功

将项目上传至git仓库(上传仓库可参考:https://editor.csdn.net/md/?articleId=121845507.)

linux配置ssh
链接https://gitee.com/help/articles/4181#article-header0.
如下

[root@base gitee]# ssh-keygen -t ed25519 -C "jsxllht@163com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:JJG4LKXW/NdFiq9uNAMSjSdbvyDLukVPJlkFtW8zLOE jsxllht@163com
The key's randomart image is:
+--[ED25519 256]--+
|     +o+o        |
|    * =o .  .    |
|   * Bo.+. o     |
|  + Ooo+o+. .    |
| . o+=ooE+*.     |
|   .o=. *ooo     |
|   .. .o +       |
|  ..    o        |
|  ..   o.        |
+----[SHA256]-----+
[root@base gitee]# cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1*************************************mwmykeFwAWFiMks jsxllht@163com
[root@base gitee]# ssh -T git@gitee.com
The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
Hi liar! You've successfully authenticated, but GITEE.COM does not provide shell access.

安装git,通过ssh拉取项目

# 安装git
yum install git

# 通过ssh拉取项目
git clone git@gitee.com:lht1999/dockerfile_demo.git

Linux 下载安装maven
官网:http://maven.apache.org/.
在这里插入图片描述

# 选择tar.gz 文件,复制链接地址;
https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
# 更改https 为 http 否则会出现如下错误
# 错误: 无法验证 dlcdn.apache.org 的由 “/C=US/O=Let's Encrypt/CN=R3” 颁发的证书:

#Linxu中wget下载
[root@base gitee]# wget http://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz

#解压,maven不用安装,解压后即可。
[root@base gitee]# tar -zxvf apache-maven-3.8.4-bin.tar.gz

-z或--gzip或--ungzip 通过gzip指令处理备份文件。
-x或--extract或--get 从备份文件中还原文件。
-v或--verbose 显示指令执行过程。
-f<备份文件>或--file=<备份文件> 指定备份文件。

删除压缩包

[root@base gitee]# rm -f apache-maven-3.8.4-bin.tar.gz

配置环境变量,编辑/etc/profile, 配置MVN_HOME环境变量

移动解压文件到/use/local目录下(软件一般安装到这个目录)
[root@base gitee]mv apache-maven-3.8.4 /usr/local/apache-maven-3.8.4

编辑/etc/profile
[root@base gitee]# vim /etc/profile

#添加export(如下图)

export MVN_HOME=/usr/local/apache-maven-3.8.4
export PATH=$MVN_HOME/bin:$PATH

在这里插入图片描述

立即生效

[root@base local]# source /etc/profile

验证是否成功

[root@base local]# mvn -version

如没配置javahome会报错如下(其实就是JDK)

[root@base local]# mvn -version
The JAVA_HOME environment variable is not defined correctly,--没有正确定义JAVA_HOME环境变量,  
this environment variable is needed to run this program.--运行这个程序需要这个环境变量。  

安装JDK步骤如下
官网链接:https://www.oracle.com/java/technologies/downloads/#java8-linux.
在这里插入图片描述
Oracle官网用Cookie限制下载方式,使得眼下只能用浏览器进行下载,使用其他方式可能会导致下载失败。

通过XFTP将压缩包放置服务器
百度网盘下载地址:链接:https://pan.baidu.com/s/1DSRndEfYHNdWOjdgt7eY-A .
提取码:apin
在这里插入图片描述
解压到当前文件夹

[root@base local]# tar -zxvf jdk-8u311-linux-x64.tar.gz

删除压缩包

[root@base local]# rm -f jdk-8u311-linux-x64.tar.gz
[root@base local]# ls
apache-maven-3.8.4  bin  etc  games  include  jdk1.8.0_311  lib  lib64  libexec  sbin  share  src

添加jdk的环境变量(按i进入编辑,在profile文件尾部添加如下内容)

export JAVA_HOME=/usr/local/jdk1.8.0_311  #jdk安装目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

在这里插入图片描述

验证是否成功

[root@base local]# javac
用法: javac <options> <source files>
其中, 可能的选项包括:
  -g                         生成所有调试信息
  -g:none                    不生成任何调试信息
  -g:{lines,vars,source}     只生成某些调试信息
  -nowarn                    不生成任何警告
  -verbose                   输出有关编译器正在执行的操作的消息
  -deprecation               输出使用已过时的 API 的源位置
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -endorseddirs <目录>         覆盖签名的标准路径的位置
  -proc:{none,only}          控制是否执行注释处理和/或编译。
  -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
  -processorpath <路径>        指定查找注释处理程序的位置
  -parameters                生成元数据以用于方法参数的反射
  -d <目录>                    指定放置生成的类文件的位置
  -s <目录>                    指定放置生成的源文件的位置
  -h <目录>                    指定放置生成的本机标头文件的位置
  -implicit:{none,class}     指定是否为隐式引用文件生成类文件
  -encoding <编码>             指定源文件使用的字符编码
  -source <发行版>              提供与指定发行版的源兼容性
  -target <发行版>              生成特定 VM 版本的类文件
  -profile <配置文件>            请确保使用的 API 在指定的配置文件中可用
  -version                   版本信息
  -help                      输出标准选项的提要
  -A关键字[=值]                  传递给注释处理程序的选项
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名

[root@base local]# java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
[root@base local]# 

再运行mvn -version发现已经可以了

[root@base local]# mvn -version
Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
Maven home: /usr/local/apache-maven-3.8.4
Java version: 1.8.0_311, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_311/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.49.1.el7.x86_64", arch: "amd64", family: "unix"

进入克隆git的文件夹将文件打成jar包

[root@base gitee]#cd dockerfile_demo/
[root@base dockerfile_demo]# mvn clean package -Dmaven.test.skip=true

把新iar包copy到和 dockerfile同级目录下准备创建新的镜像

[root@base dockerfile_demo]# ls
mvnw  mvnw.cmd  pom.xml  src  target
[root@base dockerfile_demo]# cd target
[root@base target]# ls
classes                             dockerfile_demo-0.0.1-SNAPSHOT.jar.original  generated-test-sources  maven-status      test-classes
dockerfile_demo-0.0.1-SNAPSHOT.jar  generated-sources                            maven-archiver          surefire-reports
# 创建多级目录
[root@base target]# mkdir -p /usr/docker/dockerfile
# 复制文件到刚创建的目录中
[root@base target]# cp dockerfile_demo-0.0.1-SNAPSHOT.jar /usr/docker/dockerfile/dockerfile_demo-0.0.1-SNAPSHOT.jar
# 进入创建的文件
[root@base target]# cd /usr/docker/dockerfile/
# 新建文件夹并编辑,这里名字只能是Dockerfile
[root@base dockerfile]# vim Dockerfile
# 查看内容是否有误
[root@base dockerfile]# cat Dockerfile
FROM openjdk:8-jre
ENV HOME /home
run mkdir HOME
COPY ./dockerfile_demo-0.0.1-SNAPSHOT.jar HOME/my.jar
WORKDIR HOME
ENTRYPOINT ["java", "-jar", "my.jar"]
# 查看文件
[root@base dockerfile]# ls
Dockerfile  dockerfile_demo-0.0.1-SNAPSHOT.jar
# 创建新的镜像(后面有一点不要忘记)
[root@base dockerfile]# docker build -t dockerfile:1.0 .
Sending build context to Docker daemon  17.56MB
Step 1/6 : FROM openjdk:8-jre
8-jre: Pulling from library/openjdk
0e29546d541c: Pull complete 
9b829c73b52b: Pull complete 
cb5b7ae36172: Pull complete 
99ce012bef04: Pull complete 
22dc2a72d098: Pull complete 
9c69a57e10d9: Pull complete 
Digest: sha256:c0ab1c0631266ef9420a414726a790733a2561efc5f4fa2f9b8186f4d6b00d53
Status: Downloaded newer image for openjdk:8-jre
 ---> 26ac3f63d29f
Step 2/6 : ENV HOME /home
 ---> Running in 88905b7c0c42
Removing intermediate container 88905b7c0c42
 ---> 967549eff1c4
Step 3/6 : run mkdir HOME
 ---> Running in 973543394c9d
Removing intermediate container 973543394c9d
 ---> 64beb2d7d7d5
Step 4/6 : COPY ./dockerfile_demo-0.0.1-SNAPSHOT.jar HOME/my.jar
 ---> 3eabf74d499e
Step 5/6 : WORKDIR HOME
 ---> Running in bcd0b5def4ce
Removing intermediate container bcd0b5def4ce
 ---> b012a9d79c46
Step 6/6 : ENTRYPOINT ["java", "-jar", "my.jar"]
 ---> Running in 623b1cc99df0
Removing intermediate container 623b1cc99df0
 ---> 7453ab2c8f27
Successfully built 7453ab2c8f27
Successfully tagged dockerfile:1.0
[root@base dockerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
dockerfile   1.0       7453ab2c8f27   4 minutes ago   291MB
openjdk      8-jre     26ac3f63d29f   31 hours ago    273MB
mysql        5.7       c20987f18b13   2 days ago      448MB
mysql        latest    3218b38490ce   2 days ago      516MB
# 运行docker 如果有指定环境可以通过-e 来设置 如(-e profile=test)
[root@base dockerfile]# docker run -d -p 7777:7777 --name dockerfile-test dockerfile:1.0
35074a683876f18c7d77949c35908f4722b7cfe17ae061a9cebb2132a58da38f
# 查看docker
[root@base dockerfile]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
35074a683876   dockerfile:1.0   "java -jar my.jar"       25 seconds ago   Up 23 seconds   0.0.0.0:7777->7777/tcp, :::7777->7777/tcp              dockerfile-test
66d2797cdf06   mysql:5.7        "docker-entrypoint.s…"   20 hours ago     Up 20 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   some-mysql
# 查看docker容器日志(如果项目需要连接数据库记得先打开数据库连接)
[root@base dockerfile]# docker logs -f 3507

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.2)

2021-12-23 06:06:09.485  INFO 1 --- [           main] c.e.d.DockerfileDemoApplication          : Starting DockerfileDemoApplication v0.0.1-SNAPSHOT using Java 1.8.0_312 on 35074a683876 with PID 1 (/HOME/my.jar started by root in /HOME)
2021-12-23 06:06:09.488  INFO 1 --- [           main] c.e.d.DockerfileDemoApplication          : No active profile set, falling back to default profiles: default
2021-12-23 06:06:10.740  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 7777 (http)
2021-12-23 06:06:10.753  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-12-23 06:06:10.753  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.56]
2021-12-23 06:06:10.846  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-12-23 06:06:10.847  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1267 ms
2021-12-23 06:06:11.250  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 7777 (http) with context path ''
2021-12-23 06:06:11.260  INFO 1 --- [           main] c.e.d.DockerfileDemoApplication          : Started DockerfileDemoApplication in 2.191 seconds (JVM running for 2.598)
2021-12-23 06:07:21.855  INFO 1 --- [nio-7777-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-12-23 06:07:21.855  INFO 1 --- [nio-7777-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-12-23 06:07:21.856  INFO 1 --- [nio-7777-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms

测试成功
在这里插入图片描述
可以通过映射不同端口创建多个容器再通过nginx实现负载均衡

九、maven docker 插件(原理,具体操作在CICD中)

9.1 把工程 自动达成镜像

  • 执行mvn clean package -Dmaven.test.skip=true
  • 把jar copy 到dockerfile 同一文件夹下面
  • 自己写dockerfile
  • 创建镜像

9.1 自动的把镜像上传到私服

  • 创建Dockerfile 放在 Resouces 下
    在这里插入图片描述
  • Dockerfile举例
FROM openjdk:8-jre
ENV ARTIFACTID dbtest
ENV ARTIFACTVERSION 1.0-SNAPSHOT
ENV HOME_PATH /home
WORKDIR $HOME_PATH
ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jar
ENTRYPOINT ["java", "-jar", "dbtest.jar"]
  • 加入 docker 插件(新写一个docker.xml原先依赖需要同步在加上 docker 插件)
    在这里插入图片描述
<!--docker 插件-->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <!--docker镜像相关的配置信息1-->
    <configuration>
        <!--镜像名,这里用工程名-->
        <imageName>${project.artifactId}</imageName>
        <!--Dockerfile文件所在目录-->
        <dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
        <!--TAG,这里用工程版本号-->
        <imageTags>
            <imageTag>${project.version}</imageTag>
        </imageTags>
        <!--构建镜像的配置信息-->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.artifactId}-${project.version}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

9.3 上传代码到git

git add .--本地
git commit -m""
git push orgin master--推送到远程仓库

9.4 开发服务器 拉取最新代码

git pull origin master

9.5 打包 并且打成镜像

mvn clean package -Dmaven.test.skip=true -f pom_docker.xml docker:build

9.6 通过镜像运行容器

docker run -d -p 8090:8090 --name dbtest01 dbtest:1.0-SNAPSHOT

9.7 测试

  • 55
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jsxllht

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值