Docker:基于初始欧拉镜像制作项目容器以及镜像
需求: 将一个项目包括其运行依赖的第三方组件制作成一个docker镜像,实现在任意有docker的服务器上都可以快速部署运行。
目录
需求: 将一个项目包括其运行依赖的第三方组件制作成一个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;
更多推荐
所有评论(0)