伸手摘星,即使一无所获,亦不致满手污泥。
请关注公众号:星河之码
一、工程准备
我这里使用一个比较简单的应用,使用Springboot构建一个web工程,集成mybatis读取数据,通过接口返回。
- 数据库脚本edwinedu.sql
CREATE DATABASE IF NOT EXISTS edwinedu DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
-- ----------------------------
-- Table structure for tbuser
-- ----------------------------
USE edwinedu;
DROP TABLE IF EXISTS tbuser;
CREATE TABLE tbuser (
id int(10) NOT NULL AUTO_INCREMENT,
username varchar(20) COLLATE utf8_bin DEFAULT NULL,
sex varchar(20) COLLATE utf8_bin DEFAULT NULL,
age int(10) DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tbuser
-- ----------------------------
USE edwinedu;
INSERT INTO tbuser(username,sex,age) VALUES ('edwin', '男', 20);
INSERT INTO tbuser(username,sex,age) VALUES ('星河之码', '男', 2);
INSERT INTO tbuser(username,sex,age) VALUES ('李四', '女', 18);
-
工程代码
由于代码比较简单,文件较多,就不贴出来了
如果需要,可以关注公众号【星河之码】回复dockerdome获取
二、制作mysql镜像
修改mysql官网镜像时区为东八区,然后初始化以上脚本
- 制作mysql-dockerfile 文件
FROM mysql:5.7.31
MAINTAINER "edwin:修改时区并初始化脚本"
ENV TZ Asia/Shanghai
COPY hmy.cnf /etc/mysql/conf.d/hmy.cnf
# 将edwinedu.sql放在 docker-entrypoint-initdb.d下,docker-entrypoint-initdb.d是mysql中初始化的目录,mysql服务启动之后会自动执行这个目录下的脚本
COPY edwinedu.sql /docker-entrypoint-initdb.d
-
编写hmy.cnf文件
这不是必须的,但是没有这个文件,初始化的脚本会中文乱码
[mysqld] skip-name-resolve character_set_server=utf8 datadir=/var/lib/mysql server-id=1000 [mysql] default-character-set = utf8 [mysql.server] default-character-set = utf8 [mysqld_safe] default-character-set = utf8 [client] default-character-set = utf8
-
上传
#创建一个文件夹,将上述mysql-dockerfile 和edwinedu.sql hmy.cnf都上传到该目录下
mkdir -p /data/mysqlinit
- 构建mysql镜像
#进入/data/mysqlinit 下执行
cd /data/mysqlinit
docker build --rm -t 192.168.242.130:5000/edwinedu/mysql:v1 -f mysql-dockerfile .
- 运行mysql镜像
#创建挂载目录 空目录 注意在执行启动时/data/mysql 一定是空目录,这是mysql数据的目录
mkdir -p /data/mysql
#启动mysql
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql 192.168.242.130:5000/edwinedu/mysql:v1 --character-set-server=utf8 --collation-server=utf8_general_ci
- 上传镜像到私服
# 可以不上传,上传可以备份
#上传之前要登录私服
docker login -u admin -p Harbor12345 192.168.242.130:5000
#推送到Harbor 私服中
docker push 192.168.242.130:5000/edwinedu/mysql:v1
三、打包项目
先将项目打成一个jar包,然后上传到虚拟机中,
- 打包工程
mvn clean package
#可以本地试试有没有问题
java -jar docker-demo-0.0.1-SNAPSHOT.jar
-
下载JDK
对于网速比较差的时候,我们可以先现在jdk 的镜像,然后打成一个压缩包存起来,以后直接使用。
这一步可以不执行,我这里网速还可以,直接在下面制作项目镜像的时候一起下载了
# 拉取jdk 镜像 docker pull openjdk:8-alpine3.9 #将jdk 镜像 打成一个压缩包jdk8.tar 以后用的时候直接输出就行 docker save openjdk:8-alpine3.9 -o jdk8.tar #将压缩包jdk8.tar 输出 也就是解压 docker load -i jdk8.tar
四、制作项目镜像
项目部署也以镜像的方式在docker中运行,先编写一个DockerFile文件,通过这个DockerFile文件,安装jdk,并且在docker中执行jar
- 制作dockerdemo-dockerfile文件
# 安装JDK
FROM openjdk:8-alpine3.9
MAINTAINER "edwin:安装JDK,并运行jar"
# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \
echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata --allow-untrusted
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
# 定义一个参数 这个参数在docker run的时候传进来,这里就是会用jar的名字
ARG JAR_FILE
# 修改一个固定的名字app.jar
COPY ${JAR_FILE} app.jar
#暴露端口,这个端口要跟我们application.yml 中的端口一致
EXPOSE 8080
#执行jar 启动jvm
ENTRYPOINT ["java","-jar","/app.jar"]
- 上传
#将docker-demo-0.0.1-SNAPSHOT.jar 和 dockerdemo-dockerfile文件上传到指定目录下
mkdir -p /data/dockerdemo
- 构建dockerdemo镜像
#创建一个文件夹,将上述dockerdemo-dockerfile 和docker-demo-0.0.1-SNAPSHOT.jar都上传到该目录下
cd /data/dockerdemo
#JAR_FILE 就是指定dockerdemo-dockerfile中需要的那个JAR_FILE
docker build --rm -t 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1 --build-arg JAR_FILE=docker-demo-0.0.1-SNAPSHOT.jar -f dockerdemo-dockerfile .
- 运行dockerdemo镜像
docker run -itd --name dockerdemo -p 8080:8080 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1
- 浏览器访问
http://192.168.242.128:8080/queryUserList
- 上传镜像到私服
# 可以不上传,上传可以备份
#我在构建镜像的时候是指定了私服地址 192.168.242.130:5000/edwinedu
#如果没有指定用tag命令打一个标签在上传 :
#docker tag dockerdemo:0.0.1 192.168.242.130:5000/edwinedu/dockerdemo:0.0.2
#推送到Harbor 私服中
docker push 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1
五、idea集成docker
5.1 docke远程服务访问配置
idea集成docker,需要修改服务器的docker.service服务信息,允许其他主机远程访问服务器的docker。
-
修改docker.service
#编辑docker.service vi /usr/lib/systemd/system/docker.service #在ExecStart行最后增加,开放远程主机访问权限。 -H tcp://0.0.0.0:2375 #修改之后的内容如下: # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
-
重启docker
systemctl daemon-reload systemctl restart docker
-
查看docker进程
ps -ef|grep docker
-
查看系统的网络端口
#检查docker进程是否在监听tcp的2375端口 netstat -tulp
-
如果执行报没有netstat,则安装netstat
yum install net-tools -y
-
5.2 Idea 连接远程Docker主机
Idea 连接远程Docker主机需要安装docker插件,高版本的Idea已经默认安装了。
如果没有安装,可以去官网下载安装
#官网地址
https://plugins.jetbrains.com/plugin/7724-docker/versions
安装好之后就可以连接Docker主机了,连接方法如下
-
连接Docker主机
settings->build execution...->docker->点击"+"按钮,新增docker服务器docker配置信息
-
Idea使用docker
配置成功后,会在idea开发工具下方窗口【docker】里显示信息,右键点击connect。连接成功可以查 看到container和images等信息。可以对container和images进行相关操作。
5.3 Idea 运行Docker镜像
idea连接主机之后就可以运行Docker中的一些镜像了,以上面的docker-dome工程为例,在idea中运行这个镜像,idea执行镜像,其实就是将命令执行的命令图形化
-
命令执行
docker run -itd --name dockerdemo -p 8080:8080 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1
-
idea执行
- idea执行就是将上述命令图形化,选中该镜像右键选中create container
-
配置启动命令,将上面的命令通过图形界面配置,然后执行
-
浏览器访问