前期准备:vmware 17.6、centos 7,可以参考我的上一篇文字 点这里

1. docker是什么?

这个问题在很多地方都能很方便的找到答案,在我简单的理解来说,docker就是一个方便你快速部署的工具。当然这个“方便”是有前提的,相对于单体应用,直接丢一个jar包到生产环境直接生效来说并没有更方便。但对于企业级应用来说,这个“方便”包括便于扩容部署、便于隔离不同的应用服务、便于最大化利用服务器资源,便于保持测试环境及生产环境一致性等等优势。对于企业应用来说具备非常大的吸引力,特别是DevOps团队。

2. 安装docker

首先检查一下centos的镜像配置文件/etc/yum.repos.d/CentOS-Base.repo是否指向国内镜像。

以下为默认的镜像设置,可以看到4个启用的mirrorlist都是指向mirrorlist.centos.org。baseurl则是注释掉的(前面加了#号)。

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

此时如果进行yum install会报错Cannot find a valid baseurl for repo: base/7/x86_64

解决办法很简单,将镜像配置中的4行mirrorlist注释掉,启用baseurl配置并改为国内的镜像,可以参考以下配置。

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

变更完后别忘了刷新一下

yum clean all
yum makecache
yum update

如果已经安装过docker,建议先进行删除,以安装新版或指定版本,下图为删除指令:

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-ce

开始安装(按默认配置)

sudo yum install -y docker-ce

安装完检查一下版本

docker -v
Docker version 26.1.4, build 5650f9b

启动并加入到开机自启中

systemctl start docker
systemctl enable docker

关闭docker防火墙

#关闭防火墙
systemctl stop firewalld
#禁止开机自启
systemctl disable firewalld
#查看防火墙状态
systemctl status firewalld

3. 打包hello world

接下来我们需要把hello world打包,打包的目的是把hello world所依赖的spring boot包全部整合起来,形成一个可以独立运行于JRE的可执行文件。使用IDEA的Maven可以方便得进行打包操作。

首先在IDEA的Project Structure中进行配置Main Class

检查一下pom.xml是否包含以下build配置

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

接下来我们选择使用maven开始进行打包,右侧菜单栏的m标志打开maven,先进行clean,再package,如下图:

底部console提示finished之后,可以在IDEA左侧project窗口中看到target文件夹,右键选择这个文件夹,选择Open In -> Explore,如下图:

在文件管理器中进入target文件夹,可以找到jar包,文件名类似“demo-0.0.1-SNAPSHOT.jar”

双击之后就可以直接在windows后台运行了,使用浏览器访问localhost:8080/hello验证一下:

如果要关闭这个后台程序,可以到任务管理器找到Java(TM) Platform SE binary进程并关闭。

接下来我们可以拿着这个jar包去docker打镜像、部署了。当然更方便的方法是在IDEA直接连接docker进行操作。我们先学习一下docker的独立操作,后面再补充IDEA的docker插件。

4. 编译docker镜像

因为之前我们的hello world是基于jdk21 build的,而centos7找不到openjdk:21的源,那我们先从jdk官网下载一个jdk21的tar包jdk-21_linux-x64_bin.tar.gz,先做一个jdk21的镜像。

在centos上找个目录,新建jdk-docker,把jdk21包放进去,同时新建一个Dockerfile文本文件,填以下脚本:

# Dockerfile
FROM centos:7

# 设置工作目录
WORKDIR /usr/local

# 复制本地JDK包到镜像中
COPY jdk-21_linux-x64_bin.tar.gz .

# 解压JDK并设置环境变量
RUN tar -xzf jdk-21_linux-x64_bin.tar.gz && \
    rm -f jdk-21_linux-x64_bin.tar.gz && \
    mv jdk-21* jdk-21

# 设置Java环境变量
ENV JAVA_HOME=/usr/local/jdk-21
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 验证安装
RUN java -version

# 设置默认命令
CMD ["/bin/bash"]

接着在这个目录开build

docker build -t centos-jdk21 .

接着找个地方再新建一个文件夹放hello world,我们命名为docker-demo,把hello world的jar包demo-0.0.1-SNAPSHOT.jar丢进来,同样新建一个Dockerfile文件,内容如下:

FROM centos-jdk21:latest

# 移除或重命名已有的/var/jar目录
RUN rm -rf /var/jar 2>/dev/null || true

# 然后创建新的空目录(如果需要)
RUN mkdir -p /var/jar

COPY demo-0.0.1-SNAPSHOT.jar  /var/jar

CMD ["java","-jar","/var/jar/demo-0.0.1-SNAPSHOT.jar", "&"]

完事后继续build

docker build -t centos-jdk21-hello .

看下build出来的镜像

docker images

5. 运行docker镜像

最后一步,可以开始运行刚才build好的centos-jdk21-hello

命令中有个两个端口,第一个80端口是宿主端口,即对外提供服务的端口,第二个是docker端口,需要跟我们的spring boot配置中指定的端口一致(spring boot未指定时使用默认端口8080)

docker run -d -p 80:8080 --name hello centos-jdk21-hello

成功后,就可以使用浏览器访问啦,大功告成。如下图,图中的ip地址是我的虚拟机地址,需根据自己的实际情况修改:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐