从0开始搭建阿里云服务器-前后端

182 阅读1分钟

做个笔记,万一哪天出问题了有个操作指南,有问题欢迎交流

各种安装

注意 创建容器有两种方式:

  1. 每个都通过docker run指令加一堆参数
  2. 使用docker-compose,推荐用这种,比较方便

Docker

先安装Docker

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
systemctl daemon-reload && systemctl start docker
#测试
docker run hello-world

配置镜像加速器,我使用的是阿里云 cr.console.aliyun.com/cn-hangzhou…

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["填自己的加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

开启远程访问

vi /lib/systemd/system/docker.service
#修改ExecStart开头的一行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
systemctl daemon-reload
service docker restart

在ECS上添加安全组,放开2375端口

MySQL

docker pull mysql
#运行容器
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql 
#修改配置 将docker的mysql的配置文件拷贝出来 因为docker里没有vim mysql是容器的name
docker cp mysql:/etc/mysql/my.cnf /root/my.cnf
vim /root/my.cnf
#内存占用过高 修改参数
table_open_cache=512
table_definition_cache=400
docker cp /root/my.cnf mysql:/etc/mysql/my.cnf
#进入容器
docker exec -it mysql bash 
#登陆mysql
mysql -u root -p 

Redis

docker pull redis
# 创建文件夹存放配置文件和持久化数据
mkdir /root/docker/redis
mkdir /root/docker/redis/data
cd /root/docker/redis
#下载配置文件并修改
wget https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf -O redis.conf
#------修改的内容------
bind 127.0.0.1 #注释掉这部分,这是因为限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no #默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
dir  ./ #输入本地redis数据库存放文件夹(可选)
appendonly yes #redis持久化(可选)
requirepass  密码 #配置redis访问密码
#-----------------
#运行 加上--privileged=true会启动失败
docker run -d --name redis -p 6379:6379 -v /root/docker/redis/redis.conf:/etc/redis/redis.conf -v /root/docker/redis/data:/data redis redis-server /etc/redis/redis.conf 
#进入
docker exec -it redis redis-cli
auth password

Nginx

主要工作是将配置文件挂载到docker的nginx中

如果需要配置反向代理,注意格式别写错了

#第一种
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
#代理到URL:http://127.0.0.1/test.html

#第二种(相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
#代理到URL:http://127.0.0.1/proxy/test.html

#第三种:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html

#第四种(相对于第三种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
#代理到URL:http://127.0.0.1/aaatest.html

步骤

docker pull nginx
mkdir nginx
cd nginx
#创建目录 用于外挂
mkdir html logs conf conf.d
#先创建一个容器把配置文件copy出来 随后删除
#ID是容器的ID
docker run -itd nginx nginx
docker cp ID:/etc/nginx/nginx.conf conf/nginx.conf
docker cp ID:/etc/nginx/conf.d/default.conf conf.d/default.conf

#基础配置
vim conf/nginx.conf
#具体内容不贴了没变动 开启gzip
#----------------------------#
gzip  on;
gzip_comp_level 6;
gzip_types application/javascript text/css text/xml;
#----------------------------#
#配置代理
vim nginx/conf.d/default.conf
#----------------------------#
server {
    listen       80;
    server_name  ip;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
#----------------------------#

#运行
docker run -d --name nginx -p 80:80 --net host \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/logs:/var/log/nginx \
-v /root/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
nginx

RabbitMQ

#这是带控制台的
docker pull rabbitmq:management

Docker-compose

实测发现,容器的时间和宿主机的时间对不上,使用volumes: - "/etc/localtime:/etc/localtime:ro" 解决

docker-compose -f docker-compose-server.yml up -d
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - "80:80"
    container_name: "nginx"
    volumes:
      - "/root/nginx/html:/usr/share/nginx/html"
      - "/root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
      - "/root/nginx/logs:/var/log/nginx"
      - "/root/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf"
      - "/etc/localtime:/etc/localtime:ro"
  mysql:
    image: mysql
    ports:
      - "3306:3306"
    container_name: "mysql"
    volumes:
      - "/etc/localtime:/etc/localtime:ro"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
  redis:
    image: redis
    ports:
      - "6379:6379"
    container_name: "redis"
    volumes:
      - "/root/docker/redis/redis.conf:/etc/redis/redis.conf"
      - "/root/docker/redis/data:/data"
      - "/etc/localtime:/etc/localtime:ro"
    command: redis-server /etc/redis/redis.conf
  rabbitmq:
    image: rabbitmq:management
    ports:
      - "5672:5672"
      - "15672:15672"
    container_name: "rabbitmq"
    volumes:
      - "/etc/localtime:/etc/localtime:ro"

增加虚拟内存

由于服务器内存只有2G,实测运行一个java容器都需要300M左右,容器过多会导致内存不足将其他容器停掉。开始的时候mysql就被挤掉过,找了半天也没发现问题,最后才发现是内存不足的原因。因此通过设置虚拟内存的方式来扩容

blog.csdn.net/herobacking…

1.打开终端,切换到root用户,输入:free -m查看内存状态
[maker@LLM ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:            992         189          79          13         722         614
Swap:             0           0           0
Swap也就是虚拟内存为0
 
2.选择一个较大的分区,建立分区文件
[root@LLM ~]# dd if=/dev/zero of=/opt/swap bs=1024 count=1024000
1024000+0 records in
1024000+0 records out
1048576000 bytes (1.0 GB) copied, 16.6877 s, 62.8 MB/s
[root@LLM ~]#
该命令表示在opt分区建立名为swap,大小为1G的虚拟内存文件
 
3.将swap文件设置为swap分区文件
chmod 600 /opt/swap    //注意更改swap文件的权限
[root@LLM ~]# mkswap /opt/swap
Setting up swapspace version 1, size = 1023996 KiB
no label, UUID=fc47f29e-31af-401e-856d-0fec5262179e
 
4.激活swap,启用分区交换文件
swapon /opt/swap
5.现在看下结果
[root@LLM ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         191          63          13         737         625
Swap:           999           0         999    

Vue打包

#更改vue.config.js 
publicPath: './'
#运行
npm run build:prod
#如果不成功 看看package.json里的scripts的build带不带参数

成功之后多出一个dis文件夹

image-20200516121240244

将dist路径下的所有文件复制到刚才创建的html下即可

访问地址首页显示如下

image-20200518160454662

后台打包

docker环境默认为ip:2375,所以需要在环境变量中添加DOCKER_HOST=tcp://ip:2375 ,然后重启

Dockerfile

以eureka-server-single模块为例,在模块根路径下创建Dockerfile文件

内容如下

FROM java:8
VOLUME /tmp
ADD target/eureka-server-single-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-jar","/app.jar"]

配置是网上找的,大致说明一下意思:

FROM是基础镜像

ADD的前半部分是项目打成jar包之后的路径

RUN是要执行的命令

EXPOSE是要暴露的端口

pom.xml

打包使用了dockerfile-maven-plugin,因此在build下配置

			<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--     镜像名称-->
                    <repository>${project.artifactId}</repository>
				   <!--    镜像的tag 默认就是latest-->
                    <tag>latest</tag>
                    <dockerfile>Dockerfile</dockerfile>
                    <!--     Dockerfile的路径-->
                    <contextDirectory>${project.basedir}</contextDirectory>
                    <buildArgs>
                        <!--     项目jar包路径-->
                        <!--     finalName = artifactId + version-->
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>

打包

配置完上述之后,直接用maven的Lifecycle打包即可

多模块打包见 blog.csdn.net/qq_30299977…

docker-compose

1、 打包失败

要注意打包的项目是不是依赖其他的包。比如本项目需要oauth2模块先启动

有问题继续更新

欢迎大家关注公众号