【docker】应用程序容器化
·
文章目录
一、构建应用程序镜像
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
三、谢谢观看
更多推荐
所有评论(0)