「伸手摘星,即使一无所获,亦不致满手污泥」。
「请关注公众号:星河之码」
一、工程准备
我这里使用一个比较简单的应用,使用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 「浏览器访问」






