阿里云Linux利用dockerfile构建java+tomcat,php,node.js+npm容器

写文初心

本人受到学校期末综合实验的究极折磨,将自己的完成历程分享一下

docker配置

由于本博主是使用阿里云的,所以一开始要安装yum

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

然后设置本地镜像源

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

接下来安装docker

yum install -y docker-ce

或者一步到位

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

然后我们检查一下是否安装成功

systemctl start docker
systemctl status docker

在这里插入图片描述
然后重启一下防火墙

systemctl restart firewalld

至此安装成功。

参考文章
安装Docker
防火墙命令

防火墙端口放行方法

这个方法放在前面是为了在后面配置的过程中可以直接通过目录快速翻到怎么放行,或者多打开一个页面专门看这个方法。

通过防火墙放行该端口,我的是3306端口

firewall-cmd --permanent --add-port=3306/tcp

接下来是查看开放了哪些端口

firewall-cmd --list-ports

然后重启防火墙

firewall-cmd --reload

在这里插入图片描述

或者到阿里云的防火墙设置放行,有一说一,其实可以直接在阿里云的防火墙页面放行的,两步都做有心理上的加成。我这边是轻量服务器,如果用的是飞天计划的免费服务器是在安全组策略开的。
在这里插入图片描述如果完成之后不想让别人撞开自己的mysql可以把限制ip来源改为自己的服务器ip(前提是你自己的服务器不要给撞开了XD)

优先配置MySQL

在这里插入图片描述

这里博主用的软件是filezilla在/目录下面创建mysqld文件夹根据dockerfile需要放入以下文件(文件都在文末的百度网盘链接)

在这里插入图片描述

这里展示dockerfile内容

FROM centos:7
RUN yum -y install \
ncurses \
ncurses-devel \
bison \
cmake \
make \
gcc \
gcc-c++
RUN useradd -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j4 && make install
RUN chown -R mysql:mysql /usr/local/mysql/
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin/:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN /usr/local/mysql/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
RUN echo -e "#!/bin/sh \nsystemctl enable mysqld" > /run.sh
RUN chmod 755 /run.sh
RUN sh /run.sh
CMD ["init"]

这里的mysql-boost-5.7.20是根据tar包改的
然后利用这个dockerfile来build镜像,build之前先检查一下内存是否大于6G不然爆

docker build -t mysql:centos .

注意 . 是必须有的
构建完成之后是这个样子

在这里插入图片描述

注意这里有10G的镜像,所以使用的服务器最好是2核4G加2G的虚拟内存,2核2G加4G就不够需要自己增加(注意虚拟内存不是越大越好,可能会影响性能)2核加2G我没有安装成功过,4G,8G,16G,20G都测试过。
下面讲一下怎么增加虚拟内存
创建swap文件

cd /
mkdir swap

创建磁盘卷

dd if=/dev/zero of=/swap/swapadd bs=1024 count=2024288

创建完成之后

mkswap /swap/swapadd

创建完成启用

swapon /swap/swapadd

关闭虚拟内存

swapoff -v /swap/swapadd

关闭之后可以重新创建新的虚拟内存,重复上面的dd xxx
然后就是等待完成。
一般都是爆内存然后运行不下去了,那内存我们怎么看呢?
有free m可以看或者free -mh

free -mh

也可以每隔一段时间查询一下

free -s 10 -mh

这里的10是每10s查询一次
镜像创建完成之后就可以构建容器了

docker run -d --name=mysql--server -p 3306:3306 --privileged=true mysql:centos

注意这里的–name是可以自定义的,就是这个容器的名字,如果启动失败,或者启动了之后直接退出了可以在后面的–privileged=true可以放前面的放在-d前面和-it。-p后面是绑定端口号,第一个3306是宿主机端口好第二个3306是公网访问的时候识别的端口号如

docker run --privileged=true -it -d --name=mysql--server -p 3306:3306 mysql:centos

容器创建完成之后
在这里插入图片描述

这里看到最后一行,第一个是容器id,下面的命令用到了,这个命令是进入容器里面

docker exec -it 容器id /bin/bash

要检查mysql的运行情况
输入命令

systemctl status mysqld

以下是没有运行成功的容器
在这里插入图片描述

可以看到这边是active状态之后是start然后底下还有报错。下面的大概意思就是PID file root用户没有权限访问被拒绝了。这个时候就要用更加严格的绑定(当时博主遇到这个情况之后加了两个东西,不知道哪个有用,索性都写了)

docker run -d --name=mysql--server -v /sys/fs/cgroup:/sys/fs/cgroup -p 3306:3306 --privileged=true mysql:centos 

连接成功的状态是这样子的

在这里插入图片描述

然后登入mysql

mysql -u root -p

修改密码,所有MySQL语句都要加;号,

update mysql.user set authentication_string=password('新密码') where user = '用户名';

之后一定要刷新

 mysql > flush privileges;

退出

quit

再用新密码登入
然后修改用户远程登入权限,这一句是把user表的root用户的登入权限从本机修改为%也就是地址可连

UPDATE mysql.user SET Host='%' where user='root' AND Host='localhost' LIMIT 1;

那么怎么看这个表呢?
先进入mysql数据库

use mysql

在这里插入图片描述

然后再

show tables;

就可以直接对user表进行操作了。
查询

select Host, user FROM user

在这里插入图片描述

然后移步到防火墙端口放行方法操作

可以尝试从navicat等软件检测是否可以正常连接
在这里插入图片描述

注意这里的连接名可以随便起,主机号就是你的云服务器的公网ip地址。
点击测试连接,显示连接成功则MySQL配置完成
在这里插入图片描述

参考文章:
MySQL远程访问权限
启用虚拟内存
Dockerfile构建MySQL
修改数据库密码

Java+tomcat

首先把Java的jdk和tomcat的安装包上传至云服务器
在这里插入图片描述
这里展示dockerfile的内容,demo-linux.war是我的运行代码,讲解一下dockerfile,这里tar包的名字要修改为自己的包的名字然后暴露的接口要注意看看是否符合自己的情况,8080被其他应用占用就不能用了。自己写的源代码需要放到/usr/local/apache-tomcat-9.0.75/webapps里面

FROM centos
# 使用ADD指令,复制并解压到centos -> /usr/local/ 目录下
ADD jdk-8u371-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.75.tar.gz /usr/local/
# 配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_371
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.75
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#暴露Tomcat的8080端口
EXPOSE 8080
#启动Tomcat
CMD /usr/local/apache-tomcat-9.0.75/bin/startup.sh && /bin/bash

上传完成之后就可以构建镜像,一样的三步走,docker build,docker run,docker exec
现在进行docker build,这里的java-tomcat是名字后面的v0.0.1是tag

docker build -t java-tomcat:v0.0.1 . 

然后检查镜像是否配置成功

docker images

在这里插入图片描述

配置成功之后就可以创建容器

docker run --privileged=true -it -d  -p 8080:8080 java-tomcat:v0.0.1

检查容器是否创建成功并运行

docker ps 

如果没有正常运行,则使用

docker ps -a

检查启动失败的原因
在这里插入图片描述

exit()里面有可能是254等等的可以看下面的文章判断是什么原因导致退出的
exit代码解释

启动完成之后进入容器内

docker exec -it 容器id /bin/bash

然后cd到tomcat目录下面的webapps看看有没有ROOT文件夹,再cd到ROOT文件夹看看有什么。有东西说明tomcat配置成功并启动了,没有东西要手动启动一下tomcat。先从cd到ROOT开始

cd /usr/local/apache-tomcat-9.0.75/webapps/ROOT
ls

有文件就说明配置成功了,没有的话手动启动

cd /usr/local/apache-tomcat-9.0.75/bin
./startup.sh

启动成功之后再去ROOT目录看看,或者自己创建一个index.html随便放点东西看看有什么东西

cd /usr/local/apache-tomcat-9.0.75/webapps/ROOT
vi index.html

之后退出容器

exit

设置防火墙放行端口,操作和mysql的是一样的,要修改的只有放行的端口号
设置完成之后就可以在浏览器输入http://你的服务器公网ip:Java-tomcat端口号,就可以显示tomcat的页面了(可能稍微久一点,这里一定要是http不能是https)
在这里插入图片描述

至此Java-tomcat配置完毕
下面是将源代码放入容器中。在此之前,我们需要将springboot打成war包,注意请在打包之前对你的springboot项目进行修改。
在pom.xml里面增加

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

下面的是与你的MainApplication放在同一个文件夹下面
在这里插入图片描述

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        //Application的类名
        return application.sources(DemoApplication.class);
    }
}

打完war包之后要docker cp到你的容器里面

docker cp 要移动的文件在宿主机的位置 容器id:目的容器的文件夹位置

例如将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。

docker cp /www/runoob 96f7f14e99ab:/www/

配置完成之后可以访问http://你的服务器公网ip:Java-tomcat端口号/你的war包名称(不带.war)/你的controller里面的mapping参数
比如我的是list就写list
在这里插入图片描述如果不行就重启容器,再检查tomcat是否启动,就是访问http://你的服务器公网ip:Java-tomcat端口号,如果没有启动请看之前的手动启动方法

参考文章:
dockerfile构建java+tomcat
springboot打war包的注意事项
docker退出异常码
docker cp

php

配置php要加入以下文件
在这里插入图片描述

这里展示一下dockerfile,这里的centos:6在centos:7中照样可以用,其中出现了RUN mv cc.php /var/www/html这条命令,cc.php是你的php源代码,会一起复制到/var/www/html这个文件夹下方,可以通过浏览器运行这个php文件

FROM centos:6
COPY cc.php /usr/local
RUN sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
RUN yum clean all && yum makecache
RUN yum install httpd -y
RUN /etc/init.d/httpd start
RUN yum -y install php
RUN service httpd restart
RUN yum -y install php-mysql
WORKDIR /usr/local
RUN mv cc.php /var/www/html
WORKDIR /etc/httpd/conf
RUN  sed -i "s/#ServerName www.example.com:80/ServerName localhost:9090/g" httpd.conf
RUN  sed -i "s/Listen 80/Listen 9090/g" httpd.conf
EXPOSE 9090

然后根据dockerfile构建镜像

docker build -t php:v0.0.1 . 

构建完成之后检查一下是否构建成功

docker images

检查到有php:v0.0.1之后创建容器

docker run --privileged=true -it -d -p 9090:9090 php:v0.0.1

注意,如果创建容器之后直接退出,而且显示exit(254)的时候可以改为以下命令

docker run --privileged=true -it -d  -p 9090:9090 -v /d/docker/dockerfile/code:/var/www/html php:v0.0.1

然后进入容器

docker exec -it 容器id /bin/bash

在这里插入图片描述

这里进去是直接到conf文件夹内,项目是应该放在/var/www/html里面。

cd /var/www/html

可以看到里面有一个php文件,就是你的源代码,注意,此文件可以为空。因为你可以通过vi编辑器编写代码。
写完代码之后要通过重启httpd来连上网络

service httpd restart

之后要放行对应端口,异步防火墙端口放行方法
直接访问http://你的服务器公网ip:php端口/你的php文件
至此php配置完成

node.js+npm

同样的先把文件放入宿主机
在这里插入图片描述

注意这里的package.json文件是必要的可以docker cp到容器里面或者到时候vi一个,但是server.js可以不用,因为这个就是你的运行文件,你可以到容器里面vi一个然后自己调试,调试方法在下面。
下面是dockerfile的内容,这里只需要把node改成自己需要的就可以了,博主测试8.9.1是可行的

From centos:7

ADD node-v8.9.1-linux-x64.tar.xz /usr/local
RUN mv /usr/local/node-v8.9.1-linux-x64 /usr/local/node
ENV PATH $PATH:/usr/local/node/bin 

WORKDIR /app

EXPOSE 8081

然后build镜像

docker build -t node:v0.0.1 . 

通过docker images查看
检查到有名称为node:v0.0.1的容器之后开始构建容器

docker run --privileged=true -it -d  -p 8081:8081 node:v0.0.1

接下来进入容器

docker exec -it 容器id /bin/bash

进入容器是直接到/app目录下面
这个时候vi一个package.json

vi package.json

往里面输入以下内容

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2",
    "mysql": "^2.18.1"
  }
}

然后保存并退出vi编辑器
这个时候安装npm(为什么不直接在dockerfile里面就写RUN npm install呢,其实也可以,但是我测试的结果总是版本不匹配,总是要微调package.json,如果在dockerfile的时候就改了,那么每次重新修改都要重构镜像和容器,如果要加的话就需要在上面的dockerfile上面添加几句)

From centos:7

ADD node-v8.9.1-linux-x64.tar.xz /usr/local
RUN mv /usr/local/node-v8.9.1-linux-x64 /usr/local/node
ENV PATH $PATH:/usr/local/node/bin 
ADD package.json /app
WORKDIR /app
RUN npm install
EXPOSE 8081

安装npm的命令是

npm install

可以通过 npm -v检查是否安装成功
如果自己写完了源代码就直接vi一个server.js或者什么其他的js文件
使用node命令运行,进行debug(这个不能少)

node server.js

注意运行了之后不能操作,除非退出运行,退出方法是ctrl+c
退出运行之后可以通过forever命令来持久运行该程序

npm install forever -g

安装完成之后,运行程序

forever start server.js

可以通过

forvever list

查看程序
关闭运行的程序的命令是

forever stop server.js

然后请移步到上面的防火墙端口放行方法开启该端口
浏览器访问http://服务器公网ip:node的端口号/
至此node配置完成

Java源代码

Java(entity包可以不要,没用上)
在这里插入图片描述

controller(sql语句请自行修改)

package com.example.demo.controller;



import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@RestController
@CrossOrigin
@RequestMapping("/")
public class ClassController {
    @Resource
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/list")
    public List<Map<String, Object>> userList() {
        String sql = "select * from test";
        List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
        return result;
    }


}

DemoApplication

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

ServletInitializer

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        //Application的类名
        return application.sources(DemoApplication.class);
    }
}

application.yml(注意中文地方需要修改)

server:
  port: Java的端口

spring:
  datasource:
    url: jdbc:mysql://你的服务器公网ip:你的数据库端口/数据库库名?serverTimezone=UTC
    username: 数据库用户
    password: 数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver


mybatis:
  type-aliases-package: com.chenchao.springboot.entity #

logging:
  level:
    cn.piesat: debug

php源代码

修改中文和sql语句

<?php
        $mysql_server="你的服务器公网ip:数据库端口";
        $mysql_username="数据库用户名称";
        $mysql_password="密码";
        $mysql_database="数据库库名";
        //建立数据库链接
        $conn = mysql_connect($mysql_server,$mysql_username,$mysql_password) or die("数据库链接错误");
        //选择某个数据库
        mysql_select_db($mysql_database,$conn);
        mysql_query("set names 'utf8'");
        //执行MySQL语句
        $result=mysql_query("SELECT * FROM test");
        //提取数据
        $row=mysql_fetch_row($result);
        print_r($row);
        print('123');
?>

node源代码

注意中文要修改,sql语句也要修改,注意sql查询出来的参数的key名称要对应代码内容

var express = require('express');
var mysql = require('mysql');
var app = express();

var connection = mysql.createConnection({
    host: '你的服务器公网ip',
    port: '数据库端口',
    user: '数据库用户名称',
    password: '密码',
    database: '数据库库名'
});
connection.connect();
var sql = 'SELECT * FROM test';
var str = " ";
var name = " ";
var account = " ";
var clazz = " ";

connection.query(sql, function(err, result) {
    if (err) {
        console.log('[SELECT ERROR]:', err.message);
    }

    for(let key of result){
        name = key.name;
        number = key.number;
    }
    str = JSON.stringify(result);
    console.log(str);
});
app.get('/', function(req, res) {
    res.send("<table><tr><td>姓名</td><td>"+name+"</td></tr><tr><td>学号</td><td>"+number+"</td></tr>");
});
connection.end();
app.listen(node的端口号, function() {
    console.log('Server running at node的端口号 port');
});

百度网盘链接

链接:https://pan.baidu.com/s/1Qtw9ODMeoxpr_39Bl7E6HQ?pwd=2x94
提取码:2x94
–来自百度网盘超级会员V4的分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值