centos7用docker-compose安装支持java8的tomcat和mysql并且服务自启动

994 2025-04-07 16:52 2026-01-18 10:11

以下是一个基于docker-composeCentOS 7上安装支持Java 8TomcatMySQL的示例,并且实现服务自启动:

1. 安装 Docker 和 Docker Compose

首先确保你的系统中已安装 Docker 和 Docker Compose。如果尚未安装,可以按照以下步骤进行安装:

安装 Docker

bash
 
复制
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
 

安装 Docker Compose

bash
 
复制
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')" /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
 

2. 创建 docker-compose.yml 文件

在合适的位置(例如/home/user/myapp)创建一个目录,并在该目录中创建docker-compose.yml文件,内容如下:
yaml
 
复制
version: '3.8'

services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: your_database_name
      MYSQL_USER: your_username
      MYSQL_PASSWORD: your_password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always

  tomcat:
    image: tomcat:8.5-jre8
    container_name: tomcat
    ports:
      - "8080:8080"
    volumes:
      - ./webapps:/usr/local/tomcat/webapps
    depends_on:
      - mysql
    restart: always

volumes:
  mysql_data:
 

3. 配置说明

  • MySQL
    • 使用mysql:5.7镜像。
    • 设置环境变量MYSQL_ROOT_PASSWORDMYSQL_DATABASEMYSQL_USERMYSQL_PASSWORD,用于初始化数据库。
    • 将容器的3306端口映射到宿主机的3306端口。
    • 使用volumes挂载数据卷mysql_data,确保数据持久化。
    • 设置restart: always,确保服务自启动。
  • Tomcat
    • 使用tomcat:8.5-jre8镜像,支持Java 8
    • 将容器的8080端口映射到宿主机的8080端口。
    • 使用volumes挂载./webapps目录到容器的/usr/local/tomcat/webapps目录,方便部署应用。
    • 设置depends_on,确保TomcatMySQL启动后启动。
    • 设置restart: always,确保服务自启动。

4. 启动服务

docker-compose.yml文件所在的目录下运行以下命令启动服务:
bash
 
复制
docker-compose up -d
 

5. 验证服务

  • 访问http://<你的服务器IP>:8080,如果看到Tomcat的欢迎页面,则表示Tomcat服务已成功启动。
  • 使用mysql -h 127.0.0.1 -u your_username -p连接到MySQL数据库,输入密码后,如果能够成功登录,则表示MySQL服务已成功启动。

6. 服务自启动

由于在docker-compose.yml中设置了restart: always,服务会在容器退出或系统重启后自动启动。此外,Docker 服务本身也会在系统启动时自动启动,因为之前执行了systemctl enable docker命令。
通过以上步骤,你就可以在CentOS 7上使用docker-compose安装支持Java 8TomcatMySQL,并且实现服务自启动。

 

 

docker exec -it mysql /bin/bash

mysql -u root -p
[root@iZ2zed4vmulmu2gioymytpZ mnt]# ll
total 36
drwxr-xr-x 4 root    root  4096 Apr 12 13:57 docker-compose-yml
drwx------ 2 root    root 16384 Apr 12 09:25 lost+found
drwxr-xr-x 6 polkitd root  4096 Apr 12 14:48 mysql_data
drwxr-xr-x 2 root    root  4096 Apr 12 14:31 user1
drwxr-xr-x 4 root    root  4096 Apr 12 11:45 vsftp
drwxr-xr-x 3 root    root  4096 Apr 12 14:42 webapps
[root@iZ2zed4vmulmu2gioymytpZ mnt]# rm -rf mysql_data
[root@iZ2zed4vmulmu2gioymytpZ mnt]# rm -rf vsftp
[root@iZ2zed4vmulmu2gioymytpZ mnt]# ll
total 28
drwxr-xr-x 4 root root  4096 Apr 12 13:57 docker-compose-yml
drwx------ 2 root root 16384 Apr 12 09:25 lost+found
drwxr-xr-x 2 root root  4096 Apr 12 14:31 user1
drwxr-xr-x 3 root root  4096 Apr 12 14:42 webapps
[root@iZ2zed4vmulmu2gioymytpZ mnt]# 
mkdir -p /mnt/vsftp/ftp_user
mkdir -p /mnt/vsftp/log/vsftpd
mkdir -p /mnt/mysql_data
mkdir -p /mnt/webapps

 

restart: always

restart: unless-stopped有什么区别

restart: alwaysrestart: unless-stopped 的主要区别在于对手动停止操作的响应行为

核心区别对比

表格
 
复制
场景 restart: always restart: unless-stopped
容器意外崩溃 ✅ 自动重启 ✅ 自动重启
容器正常退出 ✅ 自动重启 ✅ 自动重启
系统重启/Docker重启 ✅ 自动重启 ✅ 自动重启
手动执行 docker stop 仍会重启 不再重启
维护操作后 需要移除重启策略才能保持停止 尊重停止状态,维护完成手动启动即可

详细解释

restart: always - 无条件重启

  • 行为:无论容器如何停止(崩溃、正常退出、手动停止),Docker都会尝试重启
  • 特点:"强迫症"式重启,不区分停止原因
  • 问题:执行docker stop后,如果Docker服务重启,容器会自动启动,可能打断维护操作

restart: unless-stopped - 智能重启

  • 行为:容器因自身原因停止时会自动重启,但尊重用户的手动停止操作
  • 特点:Docker会记住"已停止"状态,手动停止后即使系统重启也不会自动启动
  • 优势:更适合生产环境,允许进行维护操作

使用建议

生产环境推荐:unless-stopped

yaml
 
复制
services:
  webapp:
    image: myapp:latest
    restart: unless-stopped
 

特殊场景使用:always

仅在以下情况考虑:
  • 容器必须持续运行,即使管理员手动停止后也需要自动恢复
  • 关键基础设施服务,如监控代理

实际应用示例

yaml
 
复制
version: '3.8'
services:
  # 数据库 - 推荐 unless-stopped
  db:
    image: postgres:13
    restart: unless-stopped
    volumes:
      - db_data:/var/lib/postgresql/data
  
  # Web应用 - 推荐 unless-stopped  
  web:
    image: nginx:latest
    restart: unless-stopped
    ports:
      - "80:80"
    depends_on:
      - db

volumes:
  db_data:
 
总结unless-stopped 通常是更安全、更符合管理员意图的选择,因为它能正确响应维护需求。

 

 

 

 

全部评论

·