记录一个用于Demo演示的Docker镜像的实现步骤

因工作需要,构造一个用于演示的多应用的Docker镜像,记录下其中的步骤和坑。

需要依次安装Jdk、mysql、redis、nginx、6个java应用、3个react应用

1. 安装基础镜像

sudo docker pull docker.io/ubuntu
sudo docker run -it containerId /bin/bash

2. 进入容器安装必要依赖

apt update
apt install net-tools 
apt install vim

3. 安装Jdk

apt install -y openjdk-8-jdk

4. 安装Redis

apt install -y  redis

#设置redis相关配置
vi /etc/redis/redis.conf 
daemonize yes
requirepass 123456

#启动redis
redis-server /etc/redis/redis.conf

#访问redis
redis-cli

5. 安装Mysql

apt install -y  mysql-server
apt install -y  mysql-client

6. 启动Mysql

#检查mysql服务状态
service mysql status 

#启动mysql
/etc/init.d/mysql start

#停止mysql
/etc/init.d/mysql stop

7. 配置Mysql

#初始化设置密码,按提示要求选择yes or no
mysql_secure_installation 

#进入mysql实例
mysql -h localhost -u root -p123456
#设置root账户,跟5.7之前不太一样 CREATE
USER 'root'@'%' IDENTIFIED BY '123456'; grant all privileges on *.* to 'root'@'%'; flush privileges; #设置普通账户,root账户不允许远程访问,只好通过普通账户访问 CREATE USER 'user'@'%' IDENTIFIED BY '123456'; grant all privileges on *.* to 'user'@'%'; flush privileges;

8. 安装Nginx

apt install -y nginx

#nginx配置项位置
ll /etc/nginx/nginx.conf

#启动nginx
nginx

9. 构造第一层基础镜像

# 杀死所有进程
kill nginxpid
kill redispid
/etc/init.d/mysql stop

# 在容器外,对该运行的容器提交commit,创建了新镜像
sudo docker commit -a "your name" -m "image name" containerId portal:v1

10. 基于基础镜像加入应用程序

# 运行基础镜像容器
sudo docker run -it imageId /bin/bash

# 在宿主机上,将应用程序从宿主机拷贝至容器内,其他的如sql脚本也类似导入进来
sudo docker cp /home/portal.zip containerId:/home/resources

# 在容器内建立相应java程序目录,解压java程序
unzip portal.zip

# 授权脚本执行能力
chmod +x startup.sh

11. 构建Dockerfile 最后执行的运行脚本,以启动多个程序,该startup.sh脚本放在/opt/下:

#!/bin/sh 
# 需要设置字符集,否则ubuntu默认的字符集是不支持中文的,会造成显示乱码 
export LANG=C.UTF-8
# 依次启动各个程序
nginx
redis-server /etc/redis/redis.conf
/etc/init.d/mysql start

sleep 15s

cd /opt/datachannel/1/
nohup java -server -Xmx256m -Xms256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -cp .:data-channel-1.0-SNAPSHOT.jar:./lib/* com.quality.dataChannel.Application >/dev/null 2>log &

cd /opt/datachannel/2/
nohup java -server -Xmx256m -Xms256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -cp .:data-channel-1.0-SNAPSHOT.jar:./lib/* com.quality.dataChannel.Application >/dev/null 2>log &

cd /opt/datachannel/3/
nohup java -server -Xmx256m -Xms256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -cp .:data-channel-1.0-SNAPSHOT.jar:./lib/* com.quality.dataChannel.Application >/dev/null 2>log &

cd /mnt/portal-1
nohup java -jar -Dname=portal-admin.jar  -Duser.timezone=Asia/Shanghai -Xms256M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection  portal-admin.jar >/dev/null 2>log &

cd /mnt/portal-2
nohup java -jar -Dname=portal-admin.jar  -Duser.timezone=Asia/Shanghai -Xms256M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection  portal-admin.jar >/dev/null 2>log &

cd /mnt/portal-3
nohup java -jar -Dname=portal-admin.jar  -Duser.timezone=Asia/Shanghai -Xms256M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection  portal-admin.jar >/dev/null 2>log &

#加入一个循环,保持前台程序,防止docker挂掉 while [ true ]; do sleep 1 done

12. 初始化数据库

#在容器内设置字符集的环境变量
export LANG=C.UTF-8

#启动mysql
/etc/init.d/mysql start

#进入mysql
mysql -h localhost -u root -p123456

#创建数据库
create database portal;

#导入sql脚本
source /home/resources/portal.sql

13. 构建第二层镜像

# 在各种初始化完成、应用程序安装好后,杀掉所有进程
sudo docker commit -a "your name" -m "image name" containerId portal:v2

14. 在宿主机目录下构造一个Dockerfile

from portal:v2

#开放端口
expose 12000 12500 12502

#执行启动程序
cmd ["/opt/startup.sh"]

15. 在Dockerfile目录下执行命令,创建最终镜像

sudo docker build -t portal:v2.1 .

16. 运行最终容器

sudo docker run -it -d --name portal -p 12000:12000 -p 12500:12500 -p 12502:12502 portal:v2.1

17. 其他常用容器执行命令

#容器恢复运行
sudo docker start containerId
#重新进入容器
sudo docker exec -it containerId /bin/bash
#重启容器
sudo docker restart containerId
#监控容器资源消耗情况
sudo docker stats
#停止容器
sudo docker stop
containerId
#删除容器
sudo docker rm -f containerId
#删除镜像
sudo docker rmi imageId
#查看全部容器
sudo docker ps -a
#查看活的容器
sudo docker ps
#镜像列表
sudo docker images
#查看容器内完整信息,如网络等
sudo docker inspect containerId
#查看容器日志
sudo docker logs containerId

 

 

 




posted @ 2021-12-28 21:09  可可心心  阅读(230)  评论(0编辑  收藏  举报