目录

引入初始镜像

基于初始镜像生成容器

搭建环境以及组件

安装jdk

安装mysql8.0

关于source /etc/profile需要注意的点

部署程序包

通过容器生成镜像

 

        需求: 将一个项目包括其运行依赖的第三方组件制作成一个docker镜像吗,实现在任意有docker的服务器上都可以快速部署运行。

引入初始镜像

        环境原因,使用的是欧拉系统的镜像,获取欧拉镜像 :

EulerOS_Server_V200R009C10SPC102B590-docker.x86_64.tar.xz

        执行指令如下:

docker import EulerOS_Server_V200R009C10SPC102B590-docker.aarch64.tar.xz euleros:2.9.5

        此时执行docker images,可以看到初始镜像euleros:2.9.5

基于初始镜像生成容器

        执行指令如下:

docker run --name="projectName" -v /opt/zy/project:/opt/project -p 8080:8080 -p 3306:3306 -d euleros:2.9.5 tail -f /dev/null

       其中--name="projectName"为容器的名称;-v来挂载容器内和外部载体的文件路径(对外部挂载的路径进行任意的修改容器内部都会改变),执行时可以设置多个-v;-p为端口映射,也可以设置多个-p(本项目对外端口有项目本身以及mysql的端口);-d为选择的景象,后面为镜像名:版本;tail -f /dev/null是为了让容器不会自动停止。

        执行完后,执行docker ps可以查看当前运行中的容器。

搭建环境以及组件

        根据docker ps获取刚创建的容器的id,即CONTAINER ID;执行docker exec -it 容器id /bin/bash 进入到该容器中。

        由于初始镜像中很多常用指令没有安装(如:vim、tar等),需要自己安装。

        我所在环境只能本地库安装,用yum -y install 指令名字。之后开始安装jdk以及mysql(业务原因,使用的是mysql8.0),安装过程与在平常虚拟机中安装操作相同,熟练者可直接跳过。

安装jdk

        通过容器与外部载体挂载的文件夹,将安装包同步进容器中,然后cp /被复制文件路径 /复制的目标路径,之后tar -vxf jdk-8xxx.tar.gz解压,在/etc/profile中添加环境变量:

export JAVA_HOME=/opt/zy/jdk1.8.0_342
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

        :wq后,执行source /etc/profile使环境变量生效,然后执行java -version测试jdk是否可用。

安装mysql8.0

        同理将mysql8.0的压缩包移动到目标文件夹下,解压。

        创建mysql用户和组,在mysql安装路径下给mysql用户赋权

groupadd mysql
useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql

        先去/etc/profile配置环境变量以及在/etc下新建my.cnf文件。

export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:${JAVA_PATH}:${MYSQL_HOME}/bin:${MYSQL_HOME}/lib

        注意:PATH配置多个组件的路径时用:隔开。

        然后执行source /etc/profile

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
user=mysql
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysql.pid
user=mysql
tmpdir=/tmp

        然后cd进入MySQL的文件夹下,执行bin/mysqld --initialize进行初始化,成功后获取到的密码进行记录。然后执行 ./support-files/mysql.server start,成功后进行密码修改。

        执行mysql -u root -p,然后输入密码进入mysql,mysql8.0修改密码的语句是:

alter user 'root'@'localhost' identified by '新密码';
flush privileges;

        然后quit;退出后再次使用新密码登录,然后设置mysql远程连接:

use mysql;
update user set host = '%' where user ='root';
flush privileges;

        完成后使用navicat远程连接mysql。

关于source /etc/profile需要注意的点

        完成环境搭建后,java和mysql测试正常,然后我退出容器(指令为exit)后,再次进入容器,执行java和mysql相关指令后报command not found需要再次执行source /etc/profile。

       参考文档:解决每次进入容器都要执行source /etc/profile        

        在/root/.bashrc文件下加上source /etc/profile,然后执行source /root/.bashrc。

这样重新进入容器环境变量不会丢失了。

部署程序包

        通过容器内外挂载的文件夹将项目jar包放入容器,然后移动到指定目录,然后通过指令后台运行。

nohup java -jar jar包名称.jar &    (普通运行)
nohup java -jar jar包名称.jar > output.log>& 1 &     (运行并输出日志)

在外部浏览器访问对应接口,成功则部署成功。

通过容器生成镜像

        docker inspect 容器名称,可查看容器详细信息。

        docker commit 容器名称 镜像名称:版本号,通过容器打包成镜像。

        docker export -o 镜像文件名称.tar 镜像名称,将制定镜像导出为文件。

        使用时,可以通过docker import 镜像文件 镜像名称,再次生成镜像,然后再通过镜像生成容器即可。

补充

        发现每次通过镜像部署或重启容器后,mysql都需要再次启动,可在已生成的镜像基础上在用Dockerfile文件进行加工。参考dockerfile详解

FROM auto:v1
LABEL version="1.0.0" desription="demo"
WORKDIR /usr/local
#CMD ["./mysql/bin/mysqld_safe"]
#启动时执行的指令
ENTRYPOINT ["./mysql/bin/mysqld_safe"," tail -f /dev/null"]

        执行docker build

docker build -f /usr/local/zytest/Dockerfile -t auto:v1 .

        然后再使用docker run 生成容器

 

navicat链接mysql失败,是因为需要设置mysql可被外部连接,操作步骤:

 登录mysql,输入下面指令

use mysql;
update user set host = '%' where user = 'root';
flush privileges;

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐