一、部署项目,配置基本环境
- 1、MySQL部署
(1)拉取MySQL镜像
docker pull mysql:5.7
(2)查看镜像
docker images
(3)创建MySQL容器
docker run -id --name test_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
(4)进入MySQL容器
docker exec -it test_mysql /bin/bash
(5)登陆MySQL
mysql -uroot -p123456
(6)开启远程访问MySQL
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
flush privileges;
- 2、 redis部署
- (1)拉取镜像
docker pull redis
- (2)运行容器
docker run -id --name test_redis -p 6379:6379 redis:latest --requirepass "123456"
- 3、与当前项目无关的部分部署
(1)nginx部署
拉取nginx镜像:docker pull nginx
运行nginx容器:docker run -id--name test_nginx -p 80:80 nginx:latest
测试nginx容器是否正常:浏览器正常访问 http://目标IP
(2)FastDFS部署
拉取FastDfs镜像:
docker pull registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs
创建FastDfs容器:
systemctl start firewalld
docker run -d --restart=always --privileged=true --net=host --name=fastdfs -e IP=47.95.234.255 -e WEB_PORT=80 -v ${HOME}/fastdfs:/var/local/fdfs registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs
***注: 需要先开启防火墙,运行完容器后再开放对应的端口或者是关闭防火墙,否则访问不到
(3)测试FastDfs
关闭防火墙:systemctl stop firewalld
docker exec -id --name fastdfs /bin/bash
进入到Fastdfs容器中执行: echo “hello” > index.html
fdfs_test /etc/fdfs/client.conf upload index.html
二、项目部署,Dockerfile构建
- 1、拉取centos7用作镜像运行基础环境
docker pull centos:7
- 2、从Oracle官网下载jdk1.8的包放于构建jdk的文件夹(没有特别规定文件夹)
下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
在同一文件夹下创建Dockerfile,输入如下内容:
FROM centos:7
MAINTAINER Joi
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u281-linux-x64.tar.gz /usr/local/java
ENV JAVA_HOME /usr/local/java/jdk1.8-8u281
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin/:$PATH
Dockerfile部分指令说明:
## 执行构建:
docker build -t="jdk1.8" .
## 进入容器:
docker exec -it jdk1.8 /bin/bash
## 测试jdk配置,查看版本号:
java -version
注:
1、如果不使用默认的Dockerfile文件名,可以通过 . -f JDKDockerfile指定文件名构建( . 不可缺少)
2、如果遇到“/bin/bash: java: command not
found”的问题,获取容器中jdk安装在/usr/local/java/jdk1.8.0_281/的目录,执行以下命令:ln -s -f /usr/local/java/jdk1.8.0_281/bin/java /usr/bin/java
- 3、部署项目
docker run -id --name=test_project.jar -p=8282:8082 -v=/test_project:/test_project jdk1.8:8u281 java -jar /test_project/test_project.jar
-v挂在宿主机目录到jdk1.8容器中的指定目录
//除了在容器中运行,也可以直接在Linux中配置好jdk环境(我尝试的这种方式,因为我没有挂载成功- _ -!)
//直接运行java -jar test_project.jar
//通过 “tail -f 目标日志文件” 或者 “tailf 目标日志文件” 指令实时查看运行日志
三、maven插件构建镜像
- 1、开启Docker远程访问
vi /lib/systemd/system/docker.service
其中ExecStart=后添加配置
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
修改后如图:
- 2、刷新配置,重启服务
systemctl daemon-reload
systemctl restart docker
访问测试:http://目标IP:2375
如果测试不通过,检查安全组合防火墙。
- 3、增加Docker插件
在工程pom.xml 增加插件
<build>
<finalName>test_project</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker的maven插件,官网: https://github.com/spotify/docker‐maven‐plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--镜像名 PetHome:1.0-->
<imageName>${project.artifactId}:${project.version}</imageName>
<!--基础镜像-->
<baseImage>jdk1.8</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}
</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--docker远程主机-->
<dockerHost>http://ip:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
- 4、构建镜像
进入test_project所在的目录,输入以下命令,进行打包和上传镜像
注意:项目名 artifactId中的名称不能有大写,否则不认识
mvn clean package -Dmaven.test.skip=true docker:build
四、部署实战
- 学习的部署方案
- 1、后端部署,基于test_project镜像运行容器(使用link方式)
docker run -id --name=test_project-p 8082:8082 --link test_redis:test_redis --link test_mysql:test_mysql test_project:1.0-SNAPSHOT
- 2、前端部署
(1)把前端打包
前端使用Nginx进行部署,首先我们需要把前端项目打包成静态资源 , 然后使用Dockerfile自动构建一个Ningx镜像,Docerfile脚本构建镜像时需要把前端代码自动拷贝到容器中。
需要在Window电脑上准备前段项目并打包,准备好Dockerfile和nginx.config配置等,待会儿直接打包上传到Linux执行镜像构建即可。
把前端代码准备好之后需要使用压缩工具(7z2000-x64.exe)把前端代码打包成 tar.gz格式,因为这种格式在构建Dockerfile镜像的时候可以自动解压。打包操作如下:
压缩成tar之后,再压缩一次,改一下名字,变成 test_project.tar.gz
(2)编写Dockerfile脚本
编写Dockerfile脚本,构建Nginx镜像,同时拷贝前段到Nginx镜像中。
FROM nginx:latest
RUN mkdir /usr/share/nginx/test_admin
RUN mkdir /usr/share/nginx/test_front
ADD ./pethome_admin.tar.gz /usr/share/nginx/test_admin
ADD ./pethome_front.tar.gz /usr/share/nginx/test_front
ADD ./nginx.conf /etc/nginx/conf.d/
WORKDIR /usr/share/nginx
RUN chmod -R a+rx * test_admin
RUN chmod -R a+rx * test_front
(3)编写Nginx配置文件
server {
listen 80;
server_name www.wolfboy.xyz;
location / {
root /usr/share/nginx/test_front;
index index.html;
}
}
server {
listen 80;
server_name admin.wolfboy.xyz;
location / {
root /usr/share/nginx/test_admin;
index index.html;
}
}
server {
listen 80;
server_name api.wolfboy.xyz;
location / {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE,PUT,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,U-TOKEN,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE,PUT,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,U-TOKEN,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
root html;
index index.html index.htm;
proxy_pass http://test_project:8082; #这里跟后端服务的link名字
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5;
}
}
准备好的目录结构与下图相似
(4)上传代码到Linux,构建镜像
## cd到 项目上传的目录,执行镜像构建命令,下面构建的镜像名字为: test_nginx
docker pull nginx:latest
docker build -t="test_nginx" ./
(5) 创建容器
docker run -di --name=test_web -p 80:80 --link test_project:test_project test_nginx
docker run -id --name=test_web --link test_project:test_project -p=8881:80 -p=8882:80 pethome-nginx
注意:这里一定要是“–link test_project:test_project” ,因为在nginx.conf中使用了这个link名字来反向代理到后端服务
启动测试