前言:
目前公司分配给我一个关于”xxx发展“的一个项目,主要是要求我利用docker将这个项目搭起来,之后方便开发人员进行后续工作,本次工作大约历时2天6个小时,由于是第一次做,遇到了很多很难,因此在这里进行一次总结,以便增长自己的知识。
1.Docker的安装
公司分配一台华为云上的ECS服务器,IP地址为114.1xx.xxx.101;操作系统为Ubuntu。在此之前都是在Centos上安装docker,故我在菜鸟教程文档的帮助下安装了docker,操作流程如下:
卸载原有docker
*sudo apt-get remove docker docker-engine docker.io containerd runc*
此处留个坑,目前没有ubuntu操作系统,当时安装步骤有些忘记,留着下次填上 ,下面是菜鸟教程地址。
https://www.runoob.com/docker/ubuntu-docker-install.html
2.制作含有Jar包的Docker image
开发同事给了一个jar包,因此需要编写一份Dockerfile然后使用docker build命令来创建image,操作流程如下:
Dockerfile文件内容:
FROM openjdk:8-jdk-slim
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
JAVA_OPTS="" \
CUP_SLEEP=0
VOLUME /logs
CMD echo "The application will start in ${CUP_SLEEP}s..." && \
sleep ${CUP_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar
# add directly the jar
ADD target/*.jar /app.jar
FROM: 表示image信息
ADD: 需要将jar包放到ADD指定的位置,这里目前指在target目录下
注意:1.此dockerfile目前针对的是jar包
2.在编写dockerfile前需要将image拉取下来
创建容器
写好dockerfile,并创建好ADD指定目录后,使用:
docker build -t openjdk1 . -f Dockerfile
等待下方出现两个successfully时 即表示创建成功,我们可以运行docker images
来查看(暂时没有图片,以后需要补上)
编写docker-compose.yml文件
一开始的时候是直接使用的docker run命令,后来发现每次关闭再重启的时候需要敲一大段命令 而且之后还有很多的坑,于是乎及时止损,选择使用了docker-compose 并且容器之间的链接也容易写得明了。
version: "3.3"
services:
jeecg:
container_name: jeecg
image: openjdk1.3:latest
ports:
- "8080:8080"
volumes:
- type: bind
source: /data/jdk
target: /opt/jeecg-boot/upload
environment:
- JAVA_OPTS=-Dactive-profile=prod
- TZ=Asia/Shanghai
networks:
- frontend
- backend
jeecgdb:
container_name: jeecgdb
image: mysql:5.7.24
ports:
- "3333:3306" # exposing 3333 for external connects
volumes:
- type: bind
source: /data/mysql/data
target: /var/lib/mysql
- type: bind
source: /data/mysql/conf
target: /etc/mysql/conf.d
environment:
- MYSQL_ROOT_PASSWORD=12345
- TZ=Asia/Shanghai
networks:
- backend
nginx:
container_name: jeecg_nginx
image: nginx:latest
ports:
- "80:80"
volumes:
- type: bind
source: /data/nginx/logs
target: /var/log/nginx
- type: bind
source: /data/nginx/www
target: /usr/share/nginx/html
- type: bind
source: /data/nginx/nginx.conf
target: /etc/nginx/nginx.conf
- type: bind
source: /data/nginx/conf.d
target: /etc/nginx/conf.d
environment:
- TZ=Asia/Shanghai
networks:
- backend
- frontend
redis:
container_name: jeecg_redis
image: redis:3.2
ports:
- "6379:6379"
volumes:
- type: bind
source: /data/redis/conf
target: /etc/redis
environment:
- TZ=Asia/Shanghai
networks:
- backend
- frontend
networks:
frontend:
backend:
以上是我将四个容器的配置写了进去,yaml源自公司的文件,之后对它有一定的修改,增加
mysql配置
在写docke-compose之前我是使用docker run命令安装的mysql ,可能是版本问题(直接下载的8)也可能是本身就有的问题,当我启动成功后,使用navicat怎么也不能访问,之后查到了几条命令,便可以解决,一下包括进入容器-修改完成命令
docker exec -ti <continue id> /bin/bash mysql -u root -p(passwd) alter user 'root'@'%' identified with mysql_native_password by '12345'; flush privileges; exit
这样就解决了不能访问的问题
接下来是恢复数据库的操作
create database xxx; use xxx; source /路径/路径/xxxxxxx.sql; exit
以上是关于mysql的配置
nginx配置文件
配置文件包含两个 一个是自己写的nginx.conf 一个是找单总要来的nginx.conf 放置位置不同,所以两个都是有用的。
##自己写的nginx.conf,用来放在/nginx/conf.d目录下
server {
listen 80;
server_name 114.xxx.xxx.101;
#后台服务配置,配置了这个location便可以通过http://域名/jeecg-boot/xxxx 访问
location ^~ /jeecg-boot {
proxy_pass http://jeecg:8080/jeecg-boot/;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题
location / {
root /usr/share/nginx/html;
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 break;
# break;
}
}
}
##找单总要来的nginx,用来放在nginx目录下
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 2000m;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
思路
将本次实验过程详细叙述一遍 ,期间遇到的问题会随之往下列举出来:
编写好dockerfile后使用docker build 命令创建好容器,之后编写好docker-compose,使用docker-compose run -d启动docker。
1.在使用docker run启动mysql的时候遇到了很多问题,在上面已有解决办法,之后使用docker-compose就没有了(目前不知道是配置问题还是版本问题)
2.最多的难点都在于nginx上。之前已经解决了mysql+jdk+redis 因此后台方面没有问题了,在前端上出现了一些问题:
①刚开始的时候访问显示500;之后将配置文件中rewrite 后面的last修改成break
②这个问题是在找单总要另一份nginx之前遇到的问题。需要添加一个http{}以及再添加一个events{worker_connections 1024; ##Default: 1024}
③以上解决方案都没有解决网页错乱的问题,最后找单总要来了一份nginx.conf(通用)放在了nginx目录下,将自己的nginx.conf放置在nginx/conf.d下最后重启nginx容器(注:对于自己写的nginx文件 需要将②里面的http和events删除。)然后解决该问题
④留下一个坑 ,网页上有一个logo.png显示不出来 暂时不知道什么原因。。先遗留着吧~