记录一个用于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