linux发布java程序docker(一)

环境配置

maven设置

maven下载:Index of /maven/maven-3/3.6.3/binaries

windows:https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip

Linux:https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

配置本地仓库件

<localRepository>C:\yykk\respository</localRepository>

配置阿里云镜像

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>        
</mirror>

配置maven的环境变量

 

开一个cmd黑窗口输入:mvn -v   ,查看是否配置成功

linux安装maven

参考文章:linux安装maven - 简书

购买服务器

准备阿里云ESC云服务器,操作系统是:centos7.x,并安装好Java环境,建议配置是:2core8G内存。

购买链接:https://www.aliyun.com/

配置环境

安装finalshell

Windows版下载地址:
http://www.hostbuf.com/downloads/finalshell_install.exe

macOS版下载地址:
http://www.hostbuf.com/downloads/finalshell_install.pkg

连接服务器

 

链接成功以后,把系统更新一遍

yum update

 安装jdk

yum install java-1.8.0-openjdk* -y

查看是否安装成功

java -v

一、SpringBoot原生打包部署jar

1、mvn clean package

将任何springboot应用程序项目使用:mvn clean package命令打包。将在target目录下生成可执行的jar包。

springboot的打包方式是 jar,默认情况下可以不写

<packaging>jar</packaging>

默认情况下,springboot打包的包名是:<artifactId>-<version>.jar

mydemo-0.0.1-SNAPSHOT.jar

如果你指定包名,如下

<build>
    <finalName>springdocker</finalName>
</build>

2、执行java -jar xxx.jar 

然后在cmd中执行java -jar xxx.jar 来运行springboot程序。但是一旦关闭cmd窗口,程序便被立即关闭从而无法访问了。

3、进程(守护式)方式启动

# 启动项目并指定端口为8088,日志在1.txt中进行打印
nohup java -jar xxx.jar --server.port=8088 >>1.txt &
# 打开1.txt的日志文件
tail -f 1.txt

关闭窗口不会结束运行,继续在后台运行

可以通过命令来查看运行的springBoot应用程序

ps -ef | grep xxxx

之后通过kill杀死进程

kill xxx
kill -9 xxx 强制杀掉进程

访问端口端口时,阿里云一定要把安全组中的端口号打开

 二、springboot打包部署docker

docker安装官网地址:Install Docker Engine on CentOS | Docker Documentation

1、安装docker

卸载旧的版本

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

设置存储库

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker 引擎

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

要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装:列出并排序您的存储库中可用的版本。此示例按版本号从最高到最低对结果进行排序,

 yum list docker-ce --showduplicates | sort -r
​
docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable

返回的列表取决于启用了哪些存储库,并且特定于您的 CentOS 版本(.el7在本例中由后缀表示)。

湾。通过其完全限定的包名称安装特定版本,即包名称 ( docker-ce) 加上版本字符串(第 2 列),从第一个冒号 ( :) 开始,一直到第一个连字符,用连字符 ( -)分隔。例如,docker-ce-18.09.1

安装指定的版本

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

启动docker

sudo systemctl start docker
sudo systemctl status docker

通过运行hello-world 映像来验证 Docker 引擎是否已正确安装。

sudo docker run hello-world

或者

docker --version

或者

docker info   #查看安装目录

配置docker镜像加速器

配置其他加速器

# 编辑该文件:
mkdir -p /etc/docker
vi /etc/docker/daemon.json  


# 在该文件中输入如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

# 配置多个如下:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"registry-mirrors": ["https://0wrdwnn6.mirror.aliyuncs.com"]
}

或者执行

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io

好处:可以快速帮助你下镜像。

 2、Docker的命令

# 启动docker:
systemctl start docker

# 停止docker:
systemctl stop docker
  
# 重启docker:
systemctl restart docker

# 查看docker状态:
systemctl status docker

# 开机启动:  
systemctl enable docker

# 查看docker概要信息
docker info

# 查看docker帮助文档
docker --help

# docker查看日志
docker logs -f 容器名字||容器Id 

# 查看镜像
docker images
#镜像内容如下:
#REPOSITORY:镜像名称 
#TAG:镜像标签 (默认是可以省略的,也就是latest) 
#IMAGE ID:镜像ID 
#CREATED:镜像的创建日期(不是获取该镜像的日期) 
#SIZE:镜像大小 
#这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

# 拉取镜像
docker pull 镜像名称
docker pull redis 
#等价于 
docker pull redis:latest
# 指定版本号
docker pull redis:6.2.6

# 删除镜像
docker rmi 镜像ID
docker rmi 镜像名称
docker rmi `docker images -q` 删除所有镜像(谨慎操作)
docker rmi $(docker images -f "dangling=true" -q)   删除所有没用为none的镜像


# 容器命令
# 查看容器
# 查看最后一次运行的容器
docker ps -l
# 查看运行容器
docker ps
# 查看所有容器
docker ps -a
#进入容器,其中字符串为容器ID:
docker exec -it d27bd3008ad9 /bin/bash
# 停用全部运行中的容器:
docker stop $(docker ps -q)
# 删除全部容器:
docker rm $(docker ps -aq)
# 一条命令实现停用并删除容器:
docker stop $(docker ps -q) & docker rm $(docker ps -aq)

# 创建容器
#创建容器命令
docker run

 -i:表示运行容器
 
 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
 
 - -容器命名。
 
 -v:表示目录映射关系(前者是宿主机目录,后者是映射到容器上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
 
 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
 
 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

# 交互式方式创建容器(创建以后就进入到容器内部了)
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
#这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态  
#退出当前容器
exit

# 守护式方式创建容器
docker run -di --name=容器名称 镜像名称:标签
# 登录守护式容器方式
docker exec -it 容器名称 (或者容器ID)  /bin/bash
docker exec -it 容器名称 (或者容器ID)  sh

#停止容器:
docker stop 容器名称(或者容器ID)   

# 启动容器:
docker start 容器名称(或者容器ID)   

# 重启容器:
docker start 容器名称(或者容器ID) 

# 删除指定的容器:
# 删除容器的时候,一定要先执行停止容器命令
docker rm 容器名称(容器ID)

# 查看容器日志
$ docker logs [OPTIONS] CONTAINER
 Options:
    --details    显示更多的信息
  -f, --follow     跟踪实时日志
    --since string  显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    --tail string  从日志末尾显示多少行日志, 默认是all
  -t, --timestamps   显示时间戳
    --until string  显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

docker logs -f 容器名字||容器Id 
# 查看指定时间后的日志,只显示最后100行
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
# 查看最近30分钟的日志
$ docker logs --since 30m CONTAINER_ID
# 查看某时间之后的日志:
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
# 查看某时间段日志
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

# 查看容器内部消息
docker inspect 容器名字||容器Id | 镜像id |  镜像名字
docker inspect tomcat

# 文件拷贝
docker cp 需要拷贝的文件或目录 容器名称:容器目录   
docker cp hello.txt mynginx:/usr/local
#也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp mynginx:/usr/local/hello.txt hello.txt

# 目录文件挂载
# 就是目录映射,修改宿主机的文件,会自动修改容器内部的文件。
# 可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器。
# 创建容器 添加-v参数 后边为 宿主机目录:容器目录
docker run -di -v /usr/local/myhtml:/usr/local/myhtml   --name=mycentos3 centos:7


搜索其他镜像

如果你需要从网络中查找需要的镜像,可以通过以下命令搜索 docker search 镜像名称

NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

 3、docker安装mysql

官网搜索:Docker Hub

 拉取mysql镜像

docker pull mysql:5.7.36

 创建容器

桥接模型:

docker run -di --name=mymysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mima  mysql:5.7.36 
# 或者
docker run --name mymysql1 -e MYSQL_ROOT_PASSWORD=mima -d mysql:5.7.36  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# 修改端口号
docker run -di --name=tensquare_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=mima  centos/mysql-57-centos7 

Host模型

docker run -di --name=mymysql2 --net=host -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mima  mysql:5.7.36

p 代表端口映射,格式为 宿主机映射端口:容器运行端口

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登陆密码

查看日志

docker logs -f mymysql

查询mysql服务的ip

docker inspect mymysql1

注意如果是云服务器上面宿主机的端口:3306(或修改端口的3307)必须在安全组开发。

在yml配置mysql时修改ip地址  

4、dockerfile构建镜像

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境; 
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了; 
3、对于运维人员:在部署时,可以实现应用的无缝移植。

常用命令

命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录

5、SpringBoot打包部署-Dockerfile + Maven发布项目

执行打包镜像命名

docker build -t='jdk1.8' .

.代表的就是:Dockerfile文件。jdk1.8:是镜像的名称

在项目根目录下创建Dockerfile文件。与target目录平齐。

#FROM java:8 设置基础镜像
FROM openjdk:8-jdk-alpine
#指定镜像创建者信息
MAINTAINER KsdPug
#切换工作目录
WORKDIR /
#创建执行目录
RUN mkdir -p /servers
# 切换指定命令
RUN cd /servers
# 传递参数,微服务打包的jar包名字
ARG JAR_FILE
# 将指定的JAR_FILE拷贝到 /servers/app.jar
COPY ${JAR_FILE}  /servers/app.jar
# 暴露指定的端口
EXPOSE 8082
# 执行发布命令
CMD ["nohup","java","-jar","/servers/app.jar","--server.port=8082","&"]

上面仅仅只是制作一个镜像,不是运行项目。

dockerfile-maven插件

在项目pom.xml文件的build中增加dockerfile-maven插件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.pug.ksd</groupId>
    <artifactId>spring-docker-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-docker-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <docker.image.prefix>example</docker.image.prefix>
    </properties>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--镜像的名称-->
                    <repository>${project.artifactId}</repository>
                    <!--镜像的版本号 latest-->
                    <tag>${project.version}</tag>
                    <!--构建的参数,给Dockerfile中ARG命令指定参数-->
                    <buildArgs>
                        <!--指定dockerfile的JAR_FILE的参数是-->
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Dockerfile必须和target平齐,否则找不到jar

镜像服务器的配置

参考配置地址:docker 远程连接设置 - 秋刀鱼的滋味w - 博客园

# 编辑docker
vim /lib/systemd/system/docker.service

修改此段

 把上面的代码替换成下面的代码即可

很多网站可能都是使用默认的端口是:2375。建议使用别的端口替代比如:2280

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2280 -H unix:///var/run/docker.sock

重启配置和docker服务即可

 systemctl daemon-reload && systemctl restart docker

配置环境变量

【我的电脑】 –【属性】—【高级系统设置】

DOCKER_HOST=tcp://47.107.225.126:2280 
执行推送命令
mvn clean package -Dmaven.test.skip=true dockerfile:build

创建docker容器

安装docker插件

创建docker服务 

 

 创建和运行容器

 

 

容器发布项目

 

  • 未来只需要修改代码

  • 打包项目

  • 重新发布项目即可

连接docker中的mysql

由于已经在linux中安装过MySQL,所以3306端口已经被使用,因此在安装docker的mysql时映射的是3307端口。

在连接sqlyog时可以采用如下方式连接:

 idea连接数据库

方法一host模式、使用阿里云私有ip地址+3307端口

方案二桥接模式、docker inspect CONTAINER ID,得到"IPAddress": "xxxxxx",idea数据库连接配置为xxxxxx:3306

关于IDEA打包的时候构建镜像读取不到系统环境变量更换的问题

在开发中,如果你更换了服务器,可能会直接去改系统环境变量参数。这个改了以后你会发现如下状况:

  • 在外部的cmd命令有效

  • 但是在idea还是旧的docker服务。

原因是:idea工具命令行有缓存,必须手动的去同步一下环境变量。修改如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值