基础镜像制作
[TOC]
1.jar包的制作过程
jar包的运行需要java环境的支持,基于centos7.6.1810版本进行镜像制作. 镜像制作先手工实现一遍,随后将命令历史,依次写入dockerfile文件中,实现dockfile定制镜像
镜像的手工制作
- 启动centos7.6.1810镜像
- docker:命令
- run: 运行一个容器
- -itd: 以交互和后台方式启动容器
- --name="fleet_admin": 启动的容器名称
- -v /opt:/opt :磁盘挂载,前面为宿主机目录,后面为容器目录, 把容器的/opt/挂载到宿主机的/opt(opt中有java安装包和java配置文件)
- centos:7.6.1810:启动的基础镜像
[root@docker41 nginx]# docker run -itd --name="fleet_admin" -v /opt:/opt centos:7.6.1810
510b85fe81b5b91ef97a2e6366e4aa63e415397d448f9e5466d37f48edff6f27
- 进入容器
- exec :开启一个新终端登录容器,退出不会影响容器运行
- -it:以交互方式登录
- 510b85fe81b5b91e...:启动的容器ID
- bash:基础命令
[root@docker41 nginx]# docker exec -it 510b85fe81b5b91ef97a2e6366e4aa63e415397d448f9e5466d37f48edff6f27 bash
- 容器内命令操作
- 首先安装java环境
- 然后放置jar包和配置文件到相应目录
- 最后启动jar包测试
##创建java目录
mkdir /usr/local/java
##切换到/opt下面的安装包目录
cd /opt/install/java/
##解压安装包到创建好的java目录中
tar xfv jdk-8u144-linux-x64.tar.gz -C /usr/local/java/
##创建fleet用户,需要保持每一个容器中的fleet UID相同
useradd fleet -u 2020
echo "Fleet2020@DB."|passwd --stdin fleet
##修改目录属主属组
chown -R fleet:fleet /usr/local/java
##追加环境变量
cat environment.txt >> /etc/profile
##创建jar包目录
mkdir -p /opt/fleet
chown -R fleet:fleet /opt/fleet
##复制jar包和配置文件目录到/opt/fleet目录下
cp admin.jar /opt/fleet
cp -r javaconfig /opt/fleet/
##激活环境变量
source /etc/profile
##执行启动jar服务进行测试
nohup java -jar -Duser.timezone=UTC /opt/fleet/admin/admin.jar --spring.application.name=cloudunify-admin --spring.cloud.bootstrap.location=/opt/fleet/javaconfig/nacosConfig.properties &
至此java环境没有问题即可,docker内操作完毕jar包部署完毕,
镜像的dockerfile制作
dockerfile 目录介绍
相应的安装包和配置要先准备好
[root@docker41 admin]# tree -L 2
.
├── conf ##配置文件放置目录
│ ├── environment.txt ##环境变量文件
│ └── javaconfig ##java包连接信息文件
├── dockerfile ##dockfile文件
└── packages ##java环境安装包目录和jar包目录
├── admin.jar ##jar包
└── jdk-8u144-linux-x64.tar.gz ##java环境安装包
dockerfile文件编写
- 把手工执行的命令,按顺序放入dockerfile文件中
FROM centos:7.6.1810
RUN useradd fleet -u 2020 && echo "Fleet2020@DB."|passwd --stdin fleet
RUN mkdir /usr/local/java && chown -R fleet:fleet /usr/local/java
ADD packages/jdk-8u144-linux-x64.tar.gz /usr/local/java/
RUN mkdir -p /opt/fleet/admin && chown -R fleet:fleet /opt/fleet
ADD conf/environment.txt /opt/fleet/
RUN cat /opt/fleet/environment.txt >> /etc/profile
ADD conf/javaconfig /opt/fleet/
ADD packages/admin.jar /opt/fleet/
RUN mkdir /data && touch /data/start.sh
RUN echo "source /etc/profile" >>/data/start.sh
RUN echo "nohup java -jar -Duser.timezone=UTC /opt/fleet/admin.jar --spring.application.name=cloudunify-admin --spring.cloud.bootstrap.location=/opt/fleet/javaconfig/nacosConfig.properties &" >>/data/start.sh
RUN echo "tail -f /dev/null" >>/data/start.sh
ENTRYPOINT source /etc/profile && sh /data/start.sh
以上为正式的dockerfile文件,可复制使用
分割线---------------------------------------------------------------------------------------------------
以下为dockfile文件介绍
##dockerfile文件详解
FROM centos:7.6.1810 ##基于centos:7.6.1810基础镜像
RUN useradd fleet -u 2020 && echo "Fleet2020@DB."|passwd --stdin fleet ##执行命令:添加用户和密码
RUN mkdir /usr/local/java && chown -R fleet:fleet /usr/local/java ##执行命令:创建目录
ADD packages/jdk-8u144-linux-x64.tar.gz /usr/local/java/ ##添加文件:到/usr/local/java/中
RUN mkdir -p /opt/fleet/admin && chown -R fleet:fleet /opt/fleet ##执行命令:创建目录
ADD conf/environment.txt /opt/fleet/ ##添加文件: 到/opt/fleet
RUN cat /opt/fleet/environment.txt >> /etc/profile ##执行命令:把变量追加到/etc/profile文件中
ADD conf/javaconfig /opt/fleet/ ##添加文件:到/opt/fleet
ADD packages/admin.jar /opt/fleet/ ##添加文件:jar包到相应目录
RUN mkdir /data && touch /data/start.sh ##创建统一开始脚本
RUN echo "source /etc/profile" >>/data/start.sh ##追加命令到脚本中
RUN echo "nohup java -jar -Duser.timezone=UTC /opt/fleet/admin.jar --spring.application.name=cloudunify-admin --spring.cloud.bootstrap.location=/opt/fleet/javaconfig/nacosConfig.properties &" >>/data/start.sh ##添加启动jar包服务的命令到启动脚本中
RUN echo "tail -f /dev/null" >>/data/start.sh
ENTRYPOINT source /etc/profile && sh /data/start.sh ##设置容器开机第一执行命令为 sh /data/start.sh
注:以上添加的文件都在dockerfile目录下,以dockerfile当前目录为基准,
开始镜像构建
- docker build -t: 构建镜像命令
- fleet_datasvr_jar:v1:构建的镜像名称为fleet_datasvr_ja, 版本号为 v1
- dockerfile: 使用当前目录下的dockerfile文件构建
[root@docker41 datasvr]# docker build -t fleet_datasvr_jar:v1 dockerfile
出现以下信息则为构建成功
Step 14/14 : ENTRYPOINT source /etc/profile && sh /data/start.sh
---> Running in d34a94759cfe
---> cd24a0dc7a85
Removing intermediate container d34a94759cfe
Successfully built cd24a0dc7a85 ##成功构建镜像
启动刚刚构建的镜像
[root@docker41 datasvr]# docker run -d cd24a0dc7a85
进入容器进行检查,有java服务启动
- java -jar: java环境能够正常使用
docker exec -it ff386134922b3c135e80325d266ef6277e62ec5fc5173043ba5ffb9cb789cb76 bash
[root@ff386134922b /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:44 ? 00:00:00 /bin/sh -c source /etc/profile && sh /data/start.sh
root 12 1 0 06:44 ? 00:00:00 sh /data/start.sh
root 19 12 94 06:44 ? 00:00:12 java -jar -Duser.timezone=UTC /opt/fleet/datasvr.jar --spring.application.name=
root 20 12 0 06:44 ? 00:00:00 tail -f /dev/null
root 58 0 0 06:44 ? 00:00:00 bash
root 70 58 0 06:44 ? 00:00:00 ps -ef
如上admin.jar包的基础镜像构建完毕,其他的jar包镜像均按照上述进行即可
2.nginx的镜像制作
基础服务镜像制作,以nginx为例子,镜像制作先手动实现一遍,随后再把操作过程写入,dockerfile文件中,实现镜像定制,其他基础服务均是如此.手动执行操作过程比较简单略过,直接展示dockerfile文件
nginx dockerfile目录介绍
[root@docker41 nginx]# tree -L 2
.
├── conf
│ ├── default.conf ##nginx配置文件
│ ├── fea_web.tar.gz ##站点目录压缩包
│ ├── nginx ##nginx命令脚本
│ ├── nginx.conf ##nginx主配置文件
│ └── web.tar.gz ##站点目录压缩包
├── dockerfile ##nginx的dockerfile文件
└── packages
├── gperftools-libs-2.6.1-1.el7.x86_64.rpm ##nginx的依赖包
├── make-3.82-24.el7.x86_64.rpm ##nginx的依赖包
├── nginx-1.21.1-1.el7.ngx.x86_64.rpm ##nginx安装包
├── nginx-filesystem-1.20.1-9.el7.noarch.rpm ##nginx依赖包
├── openssl-1.0.2k-25.el7_9.x86_64.rpm ##nginx的依赖包
├── openssl11-libs-1.1.1k-3.el7.x86_64.rpm ##nginx的依赖包
└── openssl-libs-1.0.2k-25.el7_9.x86_64.rpm ##nginx1的依赖包
nginx dockerfile文件介绍
- FROM :基于什么镜像启动
- ADD:添加dockerfile当前目录的文件到容器内
- RUN:在容器中运行什么命令
- ENTRYPOINT:给构建的镜像一个第一命令,且不会被替换,让容器能够夯住.
FROM centos:7.6.1810
ADD packages /opt/packages
RUN rpm -ivh /opt/packages/openssl11-libs-1.1.1k-3.el7.x86_64.rpm
RUN rpm -ivh /opt/packages/gperftools-libs-2.6.1-1.el7.x86_64.rpm
RUN rpm -ivh /opt/packages/nginx-filesystem-1.20.1-9.el7.noarch.rpm
RUN rpm -ivh /opt/packages/openssl-libs-1.0.2k-25.el7_9.x86_64.rpm --force
RUN rpm -ivh /opt/packages/make-3.82-24.el7.x86_64.rpm
RUN rpm -ivh /opt/packages/openssl-1.0.2k-25.el7_9.x86_64.rpm
RUN rpm -ivh /opt/packages/nginx-1.21.1-1.el7.ngx.x86_64.rpm
RUN rm -fr /opt/packages
RUN mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
ADD conf/nginx.conf /etc/nginx/
ADD conf/default.conf /etc/nginx/conf.d/6379.conf
ADD conf/nginx /etc/init.d
RUN mkdir -p /opt/fleet/
ADD conf/web.tar.gz /opt/fleet/web
ADD conf/fea_web.tar.gz /opt/fleet/fea_web
RUN chkconfig nginx on
RUN echo -e "/etc/init.d/nginx start" >> /etc/rc.local
RUN mkdir /data
RUN touch start.sh
RUN echo -e "nohup /sbin/nginx &" >> /data/start.sh
RUN echo -e "/bin/bash" >> /data/start.sh
ENTRYPOINT sh /data/start.sh
ENTRYPOINT nginx -g 'daemon off;'
基于dockerfile构建镜像
[root@docker41 nginx]# docker build -t fleet_nginx:v1 .
最后出现以下信息则为构建成功
Step 24/26 : RUN echo -e "/bin/bash" >> /data/start.sh
---> Using cache
---> a2dda949bd0c
Step 25/26 : ENTRYPOINT sh /data/start.sh
---> Using cache
---> 3377f603af2d
Step 26/26 : ENTRYPOINT nginx -g 'daemon off;'
---> Using cache
---> 163372affd65
Successfully built 163372affd65
启动镜像进行测试
- -p 87:80 : 将容器的80端口映射到宿主机的87端口
root@docker41 nginx]# docker run -d 163372affd65 -p 84:80
a7db1017ca709c070d46287d9764a97b5ef2d6b89fde7c62aadf4db278eb9c5f
进行87端口访问测试,成功访问到网址
root@docker41 nginx]# curl 127.0.0.1:84
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=renderer content=webkit><meta name=force-rendering content=webkit><meta http-equiv=X-UA-Compatible content="IE=Edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>Fleet Edge - v6.9.12.TRUNK</title><script type=text/javascript>window.addEventListener('load', function() {
if (location.href.split('#')[1].split('/')[1] === 'testPlan') {
location.replace(location.href.split('#')[0])
}
})
// 加载百度、谷歌地图API的回调函数
function mapApiLoadCallback() {
window.mapApiLoadEvent && window.mapApiLoadEvent.$emit('loaded')
}</script><link rel="shortcut icon" href=./favicon.ico><link href=./static/css/chunk-commons~e73b60ec.a5eb23f7.css rel=stylesheet><link href=./static/css/chunk-elementUI~793f9119.15c3ffe5.css rel=stylesheet><link href=./static/css/app~b58f7129.f0593e1b.css rel=stylesheet><link href=./static/css/app~b482edb6.998874de.css rel=stylesheet><link href=./static/css/app~06837ae4.35467e6c.css rel=stylesheet><link href=./static/css/app~5a11b65b.b4dd6df9.css rel=stylesheet></head><body><div id=app></div><script src=./static/js/manifest.08590dab.js></script><script src=./static/js/chunk-commons~e73b60ec.e8e41685.js></script><script src=./static/js/chunk-elementUI~793f9119.795bf5fd.js></script><script src=./static/js/chunk-elementUI~59f3426a.48c1c54b.js></script><script src=./static/js/chunk-elementUI~6ed3fd28.bebec5a0.js></script><script src=./static/js/app~748942c6.16c14c3a.js></script><script src=./static/js/app~d939e436.06791b02.js></script><script src=./static/js/app~ee6f6234.1448ae40.js></script><script src=./static/js/app~2ee72088.76bfdef8.js></script><script src=./static/js/app~53bd17ed.95e83056.js></script><script src=./static/js/app~b58f7129.540ec491.js></script><script src=./static/js/app~f9ca8911.df0187f7.js></script><script src=./static/js/app~b482edb6.0d3f9526.js></script><script src=./static/js/app~78f83136.89ab72f0.js></script><script src=./static/js/app~678f84af.04636792.js></script><script src=./static/js/app~fdc6512a.21ba728b.js></script><script src=./static/js/app~daa565d3.91812a75.js></script><script src=./static/js/app~06837ae4.b16f3d5f.js></script><script src=./static/js/app~caf8df26.98fbf3c2.js></script><script src=./static/js/app~5a11b65b.70363d7d.js></script></body><script src=./static/js/jsencrypt.min.js></script><script src=./static/customized/conf.js></script><script>if (window.CustomizedConfig && window.CustomizedConfig.favicon) {
const link = document.head.querySelector('link[href="/favicon.ico"]')
link.href = window.CustomizedConfig.favicon
其他基础镜像的制作略