一、构建应用程序镜像

1.基于scratch构建简单的镜像

(1)准备一个熟饭用的可执行文件
scratch是空镜像,提供给scratch的可执行程序必须使用静态编译方式

  • 搭建C编译环境
 yum install gcc
 vi /etc/yum.repos.d/centos.repo #将[crb]节中的enabled值改为1
yum makecache
yum install glibc-static # 完成libc-static静态库的安装
  • 建立项目目录scratch-img用作镜像构建上下文
 mkdir scratch-img
  • 在该目录下编写hello.c(C语言程序)
#include <stdio.h>
int main(void)
{
	printf("Hello,Docker!\n");
	return 0;
}
  • 对该源程序进行编译生成可执行文件
gcc hello.c -static -o hello
./hello

(2)基于scratch构建镜像

  • 创建Dockerfile并添加
mkdir Dockerfile
vi Dockerfile

添加

FROM scratch
ADD hello /
CMD ["/hello"]
  • 构建镜像
cd scratch-img
docker build --tag hello . #不要忘记后面的"." 它用来将当前目录作为构建上下文
  • 查看hello镜像的基本信息
docker images --filter "referrnce-hello"
  • 查看要运行的二进制文件hello的大小
ls -lh hello

可知:基于scratch构建的镜像的大小与加入镜像的二进制文件的大小差距很小。

  • 运行新镜像
docker run --rm hello

2.制作基于VNC的Firefox镜像

  • 建立目录fx-vnc用于构建上下文,并切换到该目录
mkdir fx-vnc 
cd fx-vnc
cd dockerfile
  • 在该目录下创建dockerfile并添加
FROM ubuntu:20.04
#安装 VNC、Xvfb 和 Firefox
#1. 换源
RUN sed -i 's@http://.*.ubuntu.com@http://mirrors.aliyun.com@g' /etc/apt/sources.list \
 && apt-get clean \
 && apt-get update -y
RUN apt update && apt install -y x11vnc xvfb firefox

#创建 VNC 配置目录
RUN mkdir ~/.vnc

#设置 VNC 登录密码为 1234
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd

#启动时自动运行 Firefox(添加到 .bashrc)
RUN bash -c 'echo "firefox" >> /.bashrc'

#暴露 VNC 默认端口
EXPOSE 5900

#启动 Xvfb 和 x11vnc
CMD ["x11vnc", "-forever", "-usepw", "-create"]

  • 构建镜像
docker build --tag fx-vnc .

在这里插入图片描述

  • 运行新镜像
docker run --rm -p 5900:5900 fx-vnc

在这里插入图片描述

  • 安装VNC客户端
yum install tigervnc
  • 查看当前启动目标
systemctl get-default
#如果返回 multi-user.target → 纯命令行,需要装图形界面。
#如果返回 graphical.target → 已带 GNOME,直接跳到 “三、本地打开终端”。
  • 安装 GNOME
# 1. 安装图形组
yum groupinstall -y "Server with GUI"   # CentOS 7

# 2. 临时图形启动
systemctl isolate graphical.target
  • 去虚拟机终端输入
vncviewer localhost:5900

二、对应用程序进行容器化

容器化简单的Java应用程序

1.搭建Maven环境

(1)安装JDK

yum install java-11-openjdk-devel
javac --version

(2)安装Maven软件
Maven官网下载其二进制安装包并上传软件包到linux中

sudo wget https://archive.apache.org/dist/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
  • 解压缩
tar -zxvf apache-maven-3.8.6-bin.tar.gz
sudo mv apache-maven-3.8.6 maven
mvn -v
  • 配置环境
echo 'export MAVEN_HOME=/opt/maven' | sudo tee /etc/profile.d/maven.sh
echo 'export PATH=$MAVEN_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/maven.sh
sudo chmod +x /etc/profile.d/maven.sh
source /etc/profile.d/maven.sh

2.创建java项目并构建

(3)创建java项目并构建

  • 构建一个java项目
mvn archetype:generate -DgroupId=org.example.java-DartifactId-java-hello -DinteractiveMode-=false
  • 自动生成java项目目录,查看该目录
tree java-hello
  • 修改pom.xml文件,在""顶级节点添加以下内容
 - <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
  • 构建java项目
mvn package
  • 运行生成的java类
java -cp target/java-hello-1.0-SAPASHOT.jar org.example.java.APP

3.构建镜像并启动容器

  • 在项目目录中创建Dockerfile,并添加一下内容
touch Dockerfile
vi Dockerfile
FROM openjdk:11
COPY target/java-hello-1.0-SNAPSHOT.jar /usr/src/java-hello-1.0-SNAPSHOT.jar
CMD java -cp /usr/src/java-hello-1.0-SNAPSHOT.jar  org.examples.java.App

  • 基于Dockerfile构建镜像
docker image build -t java -hello .
  • 运行镜像并启动容器
docker run --rm java-hello

容器化Spring Boot应用程序

  • 创建项目目录spring-boot
mkdir spring-boot
cd spring-boot
mkdir app
mkdir nginx
  • 准备Spring Boot应用程序代码
cd spring-boot/app/src/main/java/com/abc/hello/Application.java
vi Application.java
package com.abc.hello;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }
}
cd spring-boot/app/src/main/java/com/abc/hello/HelloController.java
vi HelloController.java
package com.abc.hello;
 
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
 
@RestController
public class HelloController {
    @RequestMapping("/")
    public String index() {
        return "Hello, Spring Boot!\n";
    }
}

使用maven构建需要编写pom.xml文件

cd app
touch pom.xml
cd pom.xml
vi pom.xml

在这里插入图片描述

  • Spring Boot使用内置的tomcat服务器提供web服务
cd app
touch dockerfile
cd dockerfile
vi dockerfile
FROM maven:3.8-jdk-8

提供Nginx配置文件

cd nginx
mkdir conf.d
cd conf.d
touch app.conf
vi app.conf
server {
    listen 80;          # 监听 80 端口(外部访问端口)
    charset utf-8;
    access_log off;     # 关闭访问日志(可选,简化输出)
 
    location / {
        # 转发请求到 Spring Boot 服务(服务名“app”由 Compose 维护)
        proxy_pass http://app:8080;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 
    # 静态资源配置(示例,若无需静态资源可暂时注释)
    location /static {
        access_log off;
        expires 30d;    # 静态资源缓存 30 天
        alias /app/static;
    }
}

使用Compose编排的服务可通过服务名称进行通信

cd spring boot
touch compose.yaml
vi compase.yaml
services:
  # 1. Nginx 服务:反向代理 + 暴露 80 端口
  nginx:
    container_name: spbt-nginx
    image: nginx:1.16
    restart: always    # 容器异常时自动重启
    ports:
      - "80:80"        # 主机 80 端口 → 容器 80 端口
      - "443:443"      # HTTPS 端口(示例预留,可暂不关注)
    volumes:
      # 本地 Nginx 配置 → 容器内 Nginx 配置目录
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - app            # 确保 Nginx 在 Spring Boot 服务后启动
 
  # 2. MySQL 服务:数据库存储
  mysql:
    container_name: spbt-mysql
    image: mysql/mysql-server:8.0
    environment:
      MYSQL_DATABASE: test        # 初始化数据库名
      MYSQL_ROOT_PASSWORD: root   # root 用户密码
      MYSQL_ROOT_HOST: '%'        # 允许任意主机连接 root
      LANG: C.UTF-8               # 字符集配置
    ports:
      - "3306:3306"    # 主机 3306 端口 → 容器 3306 端口(可选,方便外部连接)
    volumes:
      - mysql-data:/var/lib/mysql # 持久化 MySQL 数据
    restart: always
 
  # 3. Spring Boot 服务:业务应用
  app:
    container_name: spbt-app
    build: ./app       # 从 ./app 目录的 Dockerfile 构建镜像
    restart: always
    working_dir: /app  # 容器内工作目录
    volumes:
      - ./app:/app             # 本地代码 → 容器内代码目录(热更新用)
      - ~/.m2:/root/.m2        # 本地 Maven 仓库 → 容器内 Maven 仓库(加速依赖下载)
    expose:
      - "8080"         # 暴露容器内 8080 端口(供 Nginx 转发)
    depends_on:
      - mysql          # 确保 Spring Boot 在 MySQL 后启动
    command: mvn clean spring-boot:run  # 启动命令:清理 + 启动 Spring Boot
 
volumes:
  mysql-data:  # 持久化 MySQL 数据的卷(容器删除后数据不丢失)
  • 启动应用程序
mvn clean spring-boot:run
  • 将根目录下生成的目标Target文件清除
mvn clean
  • 启动整个应用程序
dcoker compose up --build
  • 访问http://127.0.0.1

三、谢谢观看

更多推荐