深圳网站建设平台,企业网站的宣传功能体现在(),网站后台添加图片显示不了,wordpress多域一网制作项目应用镜像
主要步骤#xff1a;
Step1、准备项目应用程序包 Step2、编写Dockerfile及启动脚本 Step3、docker build 构建镜像 Step4、docker run 启动容器 Step5、docker exec 进入容器进行验证 Step6、镜像的导入导出 Step7、提交容器生成新镜像
Step1、准备项目应…制作项目应用镜像
主要步骤
Step1、准备项目应用程序包 Step2、编写Dockerfile及启动脚本 Step3、docker build 构建镜像 Step4、docker run 启动容器 Step5、docker exec 进入容器进行验证 Step6、镜像的导入导出 Step7、提交容器生成新镜像
Step1、准备项目应用程序包
根据项目需要将应用程序包、Nginx配置文件、Mysql初始化sql脚本等文件保存到/opt/dockermaker/project_app下各文件夹内。
rootbg-244 project_app]# tree /opt/dockermaker/project_app
/opt/dockermaker/project_app
├── bootstrap.sh
├── Dockerfile
├── ibof
│ └── ibof-1.0.0.zip
├── ipy
│ ├── ipy-1.0.0.tar.gz
│ └── ipy_bootstrap.sh
├── isvr
│ ├── isvr-1.0.0.jar
│ └── isvr_bootstrap.sh
├── mysql
│ ├── createDB.sql
│ └── my.cnf
└── nginx_cnf├── https.conf├── nginx.conf├── server.crt└── server.keyStep2、编写Dockerfile及启动脚本
为了缩减镜像尺寸应尽量注意
在一个RUN语句中执行多个命令而不应该写多个RUN语句。 清理无用文件使用完的安装包yum缓存等。 下面是代码及说明。
Dockerfile
# 基础镜像
FROM centos-nmjpy:v1
LABEL maintainerjason jasonio_version1.0.0# 1、指定工作目录
WORKDIR /opt
COPY bootstrap.sh /opt# 2、复制文件
COPY mysql/my.cnf /opt/mysql/
COPY mysql/createDB.sql /opt/mysql/COPY ibof/ibof-1.0.0.zip /opt
COPY ipy/ipy-1.0.0.tar.gz /opt
COPY ipy/ipy_bootstrap.sh /opt
COPY isvr/isvr-1.0.0.jar /opt
COPY isvr/isvr_bootstrap.sh /optCOPY nginx_cnf/nginx.conf /opt/nginx
COPY nginx_cnf/https.conf /opt/nginx
COPY nginx_cnf/server.key /opt/nginx/security
COPY nginx_cnf/server.crt /opt/nginx/security# 3、准备工作
RUN mkdir -p /data/mysql_conf \ mkdir -p /opt/nginx/security \ mkdir -p /var/www/ibof \ mkdir -p /opt/isvr \ mkdir -p /opt/ipy \ cp -f /opt/mysql/my.cnf /data/mysql_conf/my.cnf \ chmod 777 /opt/bootstrap.sh# 4、暴露的容器端口
EXPOSE 22 80 443 3306 8090 8091# 5、容器运行时执行的脚本
ENTRYPOINT [/opt/bootstrap.sh]
CMD [/usr/sbin/init]bootstrap.sh
#!/bin/bash
set -x
echo #################################### bootstrap.sh start running...echo ############## init mysql start ...
INIT_ROOT_PASSWORDroottmp123
echo mysql root temp password INIT_ROOT_PASSWORD : $INIT_ROOT_PASSWORD# set project mysql root password by input. if input none, then set defult value.
MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD:-jason123}
echo project mysql root password MYSQL_ROOT_PASSWORD : $MYSQL_ROOT_PASSWORDmkdir -p /data/mysql/{data,log,tmp}
chown -R mysql:mysql /data/mysqlecho [--1--] change mysql config file: /etc/my.cnf - /data/mysql_conf/my.cnf
mv /etc/my.cnf /etc/my.cnf.old
ln -s /data/mysql_conf/my.cnf /etc/my.cnfecho [--2--] mysql new datadir /data/mysql/data
chown -R mysql:mysql /data/mysql
cp -rf /var/lib/mysql/* /data/mysql/data/
chown -R mysql:mysql /data/mysqlecho [--3--] start mysql ...
mysqld --usermysql
sleep 2
function start_mysql(){
for p in {3..0};doPORT$(ss -anlp|grep 3306|wc -l)if [ $PORT ! 1 ]; thenecho [WARN] MYSQL not run, now start...mysqld --usermysql sleep 2elseecho [WARN] MYSQL is runningbreakfiif [ $p 0 ]; thenecho 2 [ERROR] MYSQL start failed!exit 1fi
done
}
start_mysql
echo start_mysql return: $?echo [--4--] set new root password ...
sleep 5
MYSQL_CHmysql --connect-expired-password -uroot -p$INIT_ROOT_PASSWORD
$MYSQL_CH EOF
alter user rootlocalhost identified by $MYSQL_ROOT_PASSWORD;
grant all on *.* to root% identified by $MYSQL_ROOT_PASSWORD;
EOF
echo set new root password return: $?echo [--5--] excute init sql ...
PROJECT_DATABASE_NAMEjason_iodb;
MYSQLmysql --protocolsocket -uroot -p${MYSQL_ROOT_PASSWORD}
$MYSQL -e use $PROJECT_DATABASE_NAME; /dev/null 21
if [ $? ! 0 ]; thenecho creating new database $PROJECT_DATABASE_NAME ...$MYSQL /opt/mysql/createDB.sqlecho creating new database return: $?
fi
echo ############# init mysql finished.echo
echo ############# source /etc/profile
source /etc/profileecho
echo ############## show java version
java -versionecho
echo ############## show pip version
pip -Vecho
echo ############## nginx start by /usr/sbin/nginx
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
NGINX_DAEMON$(cat /opt/nginx/nginx.conf | grep daemon off; | wc -l)
if [ $NGINX_DAEMON ! 1 ]; thenecho daemon off; /opt/nginx/nginx.conf
fi
ln -sf /opt/nginx/nginx.conf /etc/nginx/nginx.conf
ln -sf /opt/nginx/https.conf /etc/nginx/conf.d/https.conf
ln -s /opt/nginx/security /etc/nginx/security
/usr/sbin/nginx echo ##############################################
echo ###### 下面内容 根据项目需要进行修改 #########
echo ##############################################echo
echo ############# run ibof
cd /var/www/ibof
unzip /opt/ibof-1.0.0.zip
mv ibof-1.0.0/* .
bash ibof_inzip_1.sh
bash ibof_inzip_2.sh
rm -rf ibof-1.0.0 echo
echo ############# run isvr
mv /opt/isvr-1.0.0.jar /opt/isvr/isvr-1.0.0.jar
mv /opt/isvr_bootstrap.sh /opt/isvr/isvr_bootstrap.sh
cd /opt/isvr
bash isvr_bootstrap.sh
java -jar isvr-1.0.0.jar echo
echo ############# call ipy
mv /opt/ipy-1.0.0.tar.gz /opt/ipy
mv /opt/ipy_bootstrap.sh /opt/ipy
cd /opt/ipy
tar xzvf ipy-1.0.0.tar.gz
bash ipy_bootstrap.shecho
echo ############## bootstrap.sh finished...
tail -f /dev/null my.cnf
[mysqld]
#datadir/var/lib/mysql
#socket/var/lib/mysql/mysql.sock
#log-error/var/log/mysqld.log
#pid-file/var/run/mysqld/mysqld.pid
symbolic-links0datadir/data/mysql/data
log-error/data/mysql/log/mysqld.err.log
pid-file/data/mysql/tmp/mysqld.pid
socket/data/mysql/tmp/mysqld.sock
tmpdir/data/mysql/tmp/lower_case_table_names1
character-set-serverutf8
max_connections3000[client]
#socket/data/mysql/mysql.sock
socket/data/mysql/tmp/mysqld.sock[mysql]
default-character-setutf8 createDB.sql
set names utf8;# set global validate_password.policyLOW;
# set global validate_password.length6;
CREATE DATABASE If Not Exists jason_iodb Character Set UTF8;
#CREATE USER jason_dbalocalhost IDENTIFIED BY jason123;
#GRANT all ON jason_iodb.* TO jason_dbalocalhost;
#GRANT all ON jason_iodb.* TO root%;use jason_iodb;create table IF NOT EXISTS tbl_user_images(
id INT UNSIGNED AUTO_INCREMENT,
user_id VARCHAR(40) NOT NULL,
label_name VARCHAR(255) NOT NULL,
image LONGBLOB NOT NULL,
vector VARCHAR(4000) NOT NULL,
PRIMARY KEY (id)
)ENGINEInnoDB DEFAULT CHARSETutf8; 代码说明
1ENTRYPOINT脚本执行
多个ENTRYPOINT语句存在的时候只执行最后一个ENTRYPOINT语句。 在构建项目应用镜像时需要复制环境镜像的booststrap.sh文件并在此基础上添加项目应用所需的步骤比如
mysql修改或替换配置文件、指定数据目录datadir、修改root密码、数据库表的初始化、为挂载做准备 nginx修改或替换配置文件 项目应用的启动 等等 通常要等环境应用都启动好之后再启动项目应用。所以Nginx启动命令后要加 。
/usr/sbin/nginx 为了避免ENTRYPOINT脚本执行结束后容器自动停止所以要在脚本最后添加
tail -f /dev/null 2mysql挂载数据目录datadir
容器是临时的容器一旦删除容器中的全部内容随之一并删除。 mysql的数据、日志、配置文件通常都需要持久化到宿主机磁盘而并不是保留在容器中。
容器中的挂载路径
配置文件/data/mysql_conf 数据目录/data/mysql其下有data、log、tmp三个子目录。 挂载的思路
1、启动mysql生成数据文件停止mysql这一步在基础镜像的mysql_init.sh中已完成数据存放于默认路径/var/lib/mysql/ 2、创建等待挂载的目录修改所属为mysql:mysql 3、使用新的配置文件/data/mysql_conf/my.cnf并创建链接替换原有配置文件/etc/my.cnf 4、修改配置文件指定数据存放路径datadir/data/mysql/data这一步可以根据项目需要事先修改好在启动容器时通过挂载覆盖容器中的配置文件 5、将原有数据文件复制过去 6、启动mysql 7、容器启动命令中通过-v参数进行挂载
# 2、make mount path
mkdir -p /data/mysql/{data,log,tmp}
chown -R mysql:mysql /data/mysql# 3、change mysql config file: /etc/my.cnf - /data/mysql_conf/my.cnf
mv /etc/my.cnf /etc/my.cnf.old
ln -s /data/mysql_conf/my.cnf /etc/my.cnf# 5、mysql new datadir /data/mysql/data
cp -rf /var/lib/mysql/* /data/mysql/data/# 6、start mysql
mysqld --usermysql 容器启动命令挂载示例
docker run ... \-v /xxxx/mount/mysql_conf/my.cnf:/data/mysql_conf/my.cnf \-v /xxxx/mount/mysql/:/data/mysql \... 3mysql修改密码
在投入项目使用前应根据项目需要修改密码。
INIT_ROOT_PASSWORDroottmp123
MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD:-jason123}MYSQL_CHmysql --connect-expired-password -uroot -p$INIT_ROOT_PASSWORD
$MYSQL_CH EOF
alter user rootlocalhost identified by $MYSQL_ROOT_PASSWORD;
grant all on *.* to root% identified by $MYSQL_ROOT_PASSWORD;
EOF
$INIT_ROOT_PASSWORD: root临时密码。基础镜像构建过程中在mysql初始化时设定。值为roottmp123。 $MYSQL_ROOT_PASSWORD: 项目中的root密码。容器启动命令中通过-e参数赋值。默认为jason123。
容器启动命令赋值示例
docker run ... -e MYSQL_ROOT_PASSWORDyourpassword123 ...
4mysql数据库表的初始化
在bootstrap.sh中登录mysql执行初始化脚本createDB.sql
# 项目DATABASE名称。容器启动命令中通过 -e 参数赋值。默认为jason_iodb。
PROJECT_DATABASE_NAME${PROJECT_DATABASE_NAME:-jason_iodb};
# 设置环境变量
MYSQLmysql --protocolsocket -uroot -p${MYSQL_ROOT_PASSWORD}
# 判断 项目DATABASE 是否存在
$MYSQL -e use $PROJECT_DATABASE_NAME; /dev/null 21
# 执行初始化脚本
$MYSQL /opt/mysql/createDB.sql
在createDB.sql中 创建一个数据库 jason_iodb新建一个表tbl_user_images
# 创建一个 DATABASE 命名为 jason_iodb
CREATE DATABASE If Not Exists jason_iodb Character Set UTF8;
use jason_iodb;
create table IF NOT EXISTS tbl_user_images(
)
5Nginx配置文件替换及启动根据项目需要进行修改 在Dockerfile中复制Nginx的配置文件。
COPY nginx_cnf/nginx.conf /opt/nginx
COPY nginx_cnf/https.conf /opt/nginx
COPY nginx_cnf/server.key /opt/nginx/security
COPY nginx_cnf/server.crt /opt/nginx/security
在bootstrap.sh中替换Nginx的配置文件并启动。
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
NGINX_DAEMON$(cat /opt/nginx/nginx.conf | grep daemon off; | wc -l)
if [ $NGINX_DAEMON ! 1 ]; thenecho daemon off; /opt/nginx/nginx.conf
fi
ln -sf /opt/nginx/nginx.conf /etc/nginx/nginx.conf
ln -sf /opt/nginx/https.conf /etc/nginx/conf.d/https.conf
ln -s /opt/nginx/security /etc/nginx/security/usr/sbin/nginx
如果想使用项目自己的Nginx配置可以在启动命令里通过-v参数进行挂载
docker run ... \-v /xxxx/mount/nginx/nginx.conf:/opt/nginx/nginx.conf \-v /xxxx/mount/nginx/https.conf:/opt/nginx/https.conf \-v /xxxx/mount/nginx/security/server.key:/opt/nginx/security/server.key \-v /xxxx/mount/nginx/security/server.crt:/opt/nginx/security/server.crt \
...6项目应用的复制、解压、启动根据项目需要进行修改
Dockerfile
COPY ibof/ibof-1.0.0.zip /opt
COPY ipy/ipy-1.0.0.tar.gz /opt
COPY ipy/ipy_bootstrap.sh /opt
COPY isvr/isvr-1.0.0.jar /opt
COPY isvr/isvr_bootstrap.sh /opt
RUN mkdir -p /var/www/ibof \ mkdir -p /opt/isvr \ mkdir -p /opt/ipy
bootstrap.sh
echo ############# run ibof
cd /var/www/ibof
unzip /opt/ibof-1.0.0.zip
mv ibof-1.0.0/* .
bash ibof_inzip_1.sh
bash ibof_inzip_2.sh
rm -rf ibof-1.0.0 echo
echo ############# run isvr
mv /opt/isvr-1.0.0.jar /opt/isvr/isvr-1.0.0.jar
mv /opt/isvr_bootstrap.sh /opt/isvr/isvr_bootstrap.sh
cd /opt/isvr
bash isvr_bootstrap.sh
java -jar isvr-1.0.0.jar echo
echo ############# call ipy
mv /opt/ipy-1.0.0.tar.gz /opt/ipy
mv /opt/ipy_bootstrap.sh /opt/ipy
cd /opt/ipy
tar xzvf ipy-1.0.0.tar.gz
bash ipy_bootstrap.sh
Step3、docker build 构建镜像 构建镜像 假设项目名为 io 所以将镜像命名为centos-io版本号v1。 若不写版本号则默认为latest。
# 进入 Dockerfile 文件所在路径
cd /opt/dockermaker/project_app
# build --- 创建镜像的命令
# -t --- 指定target 名称
# centos-io:v1 --- 镜像名称:镜像tag
# . --- 执行当前路径下的 Dockerfile 文件
docker build -t centos-io:v1 . 查看镜像
docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE
centos-io v1 c54f86a7261a 3 hours ago 6.23GB
centos-nmjpy v1 4bdd37c68d92 2 hours ago 6.14GB
centos centos7 5e35e350aded 3 months ago 203MB
删除镜像
# docker image rm 镜像名:tag 或 镜像ID
docker image rm centos-io:v1
docker image rm c54f86a7261a
Step4、docker run 启动容器 4.1、启动容器不挂载
docker run -v /tmp/:/tmp \-itd --privileged --cap-addSYS_ADMIN \-p 50022:22 \-p 50080:80 \-p 50443:443 \-p 53306:3306 \-p 58090:8090 \-p 58091:8091 \-e MYSQL_ROOT_PASSWORDyourpassword123 \--namecentos-io:v1 \centos-io \/usr/sbin/init
-v /tmp/:/tmp 挂载宿主机的一个目录格式宿主机目录:容器目录。 -it 启动互动模式。 -d 后台运行。 --privileged 指定容器是否是特权容器。在docker容器运行时让系统拥有真正的root权限。 --cap-add SYS_ADMIN 添加系统的权限不然系统很多功能都用不了的。 -p 53306:3306 端口映射格式宿主机端口:容器端口。 -e 环境变量赋值。格式变量名变量值。 --namecentos-io 将容器命名为centos-io。 centos-io:v1 指定镜像格式镜像名称:镜像tag /usr/sbin/init 初始容器里的CENTOS用于启动dbus-daemon。
4.2、启动容器挂载 准备 1、创建目录。 2、将编辑好的Mysql、Nginx配置文件放置于各自对应的目录下参考下面的文件结构。 3、创建容器之前一定要清空mount/mysql下data、log、tmp目录。 cd /opt/dockermaker/mount
mkdir -p /opt/dockermaker/mount/nginx/security
mkdir -p /opt/dockermaker/mount/mysql_conf
mkdir -p /opt/dockermaker/mount/mysql/{data,log,tmp}
rm -rf /opt/dockermaker/mount/mysql/{data,log,tmp}/*
文件结构
rootbg-244 ~]# tree /opt/dockermaker/mount
/opt/dockermaker/mount├── mysql│ ├── data│ ├── log│ └── tmp├── mysql_conf│ └── createDB.sql│ └── mysql.mount.cnf└── nginx├── https.conf├── nginx.conf└── security├── server.crt└── server.key
createDB.sql 挂载的createDB.sql会创建一个数据库jason_iodb_mount并创建一张表tbl_user_images_mount。
启动容器 挂载
docker run -v /tmp/:/tmp \-v /opt/dockermaker/mount/mysql_conf/mysql.mount.cnf:/data/mysql_conf/my.cnf \-v /opt/dockermaker/mount/mysql_conf/createDB.sql:/opt/mysql/createDB.sql \-v /opt/dockermaker/mount/mysql/:/data/mysql \-v /opt/dockermaker/mount/nginx/nginx.conf:/opt/nginx/nginx.conf \-v /opt/dockermaker/mount/nginx/https.conf:/opt/nginx/https.conf \-v /opt/dockermaker/mount/nginx/security/server.key:/opt/nginx/security/server.key \-v /opt/dockermaker/mount/nginx/security/server.crt:/opt/nginx/security/server.crt \-itd --privileged --cap-addSYS_ADMIN \-p 50022:22 \-p 50080:80 \-p 50443:443 \-p 53306:3306 \-p 58090:8090 \-p 58091:8091 \-e MYSQL_ROOT_PASSWORDyourpassword123 \-e PROJECT_DATABASE_NAMEjason_iodb--namecentos-io:v1 \centos-io \/usr/sbin/init Step5、docker exec 进入容器进行验证 进入容器
docker exec -it centos-io bash
退出容器不停止容器
CtrlPQ 同时按下
Step6、镜像的导入导出 镜像导出 镜像导出保存到指定的本地文件
docker save centos-io:v1 -o /opt/docker-image-centos-io-v1.tar
centos-io:v1 指定需要导出的镜像格式镜像名称:镜像tag -o /path/file.tar 指定本地文件 镜像导入 镜像导入不用指定镜像名称。
docker load -i /home/src/docker-image-nginx-1.13.tar-i /path/file.tar 指定本地文件 当出现如下提示时即表示成功
Loaded image: xxxx:xxx
Step7、提交容器生成新镜像 进入容器后可以操作容器操作容器会把容器置位新状态。 停止再启动后容器会保持新状态但是镜像没有变化这个新状态仍然是临时的。 但是基于相同的镜像再创建一个容器新容器将会是原始状态。
所以修改容器后可以将容器的新状态提交(commit)成一个新的镜像。 主要步骤 启动容器进入容器修改容器退出容器停止容器提交容器获得新镜像。
修改容器
如同操作Linux一样。
容器与宿主机之间的文件操作
容器 宿主机 将容器下/root/test.js复制到宿主机/opt
docker cp 容器名:/root/test.js /opt
宿主机 容器将宿主机/opt/test.js复制到容器下/root
docker cp /opt/test.js 容器名:/root
退出容器不停止容器
CtrlPQ 同时按下
提交容器
docker commit 容器id centos-io:v2
centos-io:v2新镜像格式镜像名称:镜像tag