当前位置: 首页 > news >正文

从无到有制作docker镜像、容器详细步骤

1、编写一个Dockerfile文件,内容如下

# 基础镜像jdk,jdk里包含里操作系统
FROM openjdk:8u282-jdk# 工作目录,也就是容器里目录
WORKDIR /home/prq/# 添加ppp目录下的文件到容器/home/prq/里
ADD ./ppp /home/prq/# 暴露端口8080
EXPOSE 8080# 启动脚本
CMD ./startup.sh

2、ppp目录下准备以下文件,用于运行项目(ppp目录和Dockerfile文件在同一层目录下)

  a、一个运行jar ,例如 test.jar  ,后面修改代码升级时,用到的jar名称需修改成test.jar

 b、启动脚本startup.sh

c、日志目录 logs

d、配置文件目录 conf

3、在Dockerfile所在的目录下执行以下命令

1、 生成test:1.0.1镜像,最后的点不用省略
docker build -t test:1.0.1 .2、 查看生成的镜像
docker images 3、 通过test:1.0.1镜像启动容器
docker run -itd   --privileged=true --name test test:1.0.14、进容器(可以在进容器里添加一些基本命令,如telnet、ifconfig命令,不然制作的镜像是没有这些基本命令的)
docker exec -it test  /bin/bash安装一些常用的工具
yum -y install vim
yum -y install net-tools5、 将镜像test:1.0.1保存为test.tar.gz,默认保存在当前目录
docker save -o test.tar.gz test:1.0.16、将test.tar.gz 导入镜像
docker load -i test.tar.gz7、 通过test:1.0.1镜像启动容器
docker run -itd   --privileged=true --name test test:1.0.18、如果知道容器id,也可以通过容器id转镜像(将294oajfhfnci容器保存为镜像abcdef)
docker commit 294oajfhfnci test:1.0.1

4、每次升级时,需要把修改的test.jar 通过docker cp命令传到容器里,比较麻烦,所有有了另一种方式,通过compose文件volumes对宿主机和容器做个映射关系。

1、把javaDump.hprof从容器id为db0906d6e687,容器路径为/home/ppp/logs中把javaDump.hprof文件拿到宿主机/home/ppp/目录下
docker cp db0906d6e687:/home/ppp/logs/javaDump.hprof /home/ppp/2、把宿主机/home/ppp/logs/javaDump.hprof复制到容器id为db0906d6e687的/tmp目录下
docker cp /home/ppp/logs/javaDump.hprof  db0906d6e687:/tmp

compose.yml内容

# yaml 配置
version: '3'
services:nacos-server:image: nacos/nacos-server:v1.4.3container_name: nacos-servernetwork_mode: "host"environment:- PREFER_HOST_MODE=ip- MODE=standalonevolumes:- /home/docker/volumes/ppp/_data/nacos_data/logs/:/home/nacos/logs- /home/docker/volumes/ppp/_data/nacos_data/conf/application.properties:/home/nacos/conf/application.properties- /home/docker/volumes/ppp/_data/nacos_data/data/:/home/nacos/dataports:- 8848:8848restart: alwaysportainer:image: "portainer/portainer-ce"container_name: "portainer"ports:- "8000:8000"- "7000:9000"restart: alwaysvolumes:- "/var/run/docker.sock:/var/run/docker.sock"- "/home/docker/volumes/portainer_data/_data:/data"- "/etc/localtime:/etc/localtime"- "/etc/timezone:/etc/timezone"portainer-agent:image: "portainer/agent"container_name: "portainer-agent"ports:- "9001:9001"restart: alwaysvolumes:- "/var/run/docker.sock:/var/run/docker.sock"- "/home/docker/volumes:/var/lib/docker/volumes"- "/etc/localtime:/etc/localtime"- "/etc/timezone:/etc/timezone"redis:image: "redis:6.2.1"container_name: "redis"ports:- "6379:6379"restart: alwayssysctls:- net.core.somaxconn=1024volumes:- "/home/docker/volumes/ppp/_data/redis_data/conf/redis.conf:/etc/redis/redis.conf"- "/home/docker/volumes/ppp/_data/redis_data/data:/data"- "/etc/localtime:/etc/localtime"- "/etc/timezone:/etc/timezone"command: redis-server /etc/redis/redis.conftest:image: "test:1.0.1"container_name: "test"network_mode: "host"restart: alwaysenvironment:- TZ=Asia/Shanghai- NACOS_SERVER=10.12.12.12:8848- NACOS_NAMESPACE=yreyehhfdsd-ea28-47b9-a3fa-e818gege5- ADMIN_SERVER_URL=http://10.12.12.12:8060volumes:- "/home/docker/volumes/ppp/_data/test/startup.sh:/home/ppp/startup.sh"- "/home/docker/volumes/ppp/_data/test/conf:/home/ppp/conf"- "/home/docker/volumes/ppp/_data/logs_data:/home/ppp/logs"- "/home/docker/volumes/ppp/_data/test/node1/test.jar:/home/ppp/test.jar"- "/home/docker/volumes/ppp/_data/wait-for-it.sh:/home/ppp/wait-for-it.sh"- "/etc/localtime:/etc/localtime"- "/etc/timezone:/etc/timezone"logging:options:max-size: 500mprivileged: truecommand: /home/ppp/wait-for-it.sh 10.12.12.12:8848 -t 0 --strict  -- /bin/sh -c 'sh startup.sh'

其中wait-for-it.sh(网上可下载这个文件)
#wait-for-it.sh ip:端口 检测该ip与端口是否已经能连接,能了就执行后面的命令
#-t 0 超时参数 检测该ip与端口是否已经能连接,超过指定时间后无论ip与端口是否已经能连接都执行后续命令 
#-t 0 不设置超时参数  ip与端口不能连接就不执行后续命令
#不加 -t 0 或者 -t 超时时间 都会在超时时间过了之后执行后续命令 不管ip与端口是否已经能连接
#默认超时时间 15秒
./wait-for-it.sh 10.12.12.12:8848 -t 0 -- java -jar /user_ms_docker.jar

10.12.12.12:8848通的话,才执行echo,不通不执行,一直等待

执行脚本insatll.sh

#!/bin/bash
#引入外部脚本
#source ./sysctl.sh
echo "preparing for system envrionment ..."image_home="../images"
image_redis="redis-6.2.1.tar.gz"
image_portainer="portainer.tar.gz"
image_portainer_agent="portainer-agent.tar.gz"
image_nacos="nacos-v1.4.3.tar.gz"
image_test="test.tar.gz"ppp="/home/docker/volumes/ppp/_data"echo "=============update docker path ... ============"
cp ../conf/common/docker.service /etc/systemd/system/multi-user.target.wants/
systemctl daemon-reload
systemctl restart dockerecho "Loading docker images ..."
docker load -i ${image_home}/${image_redis}
docker load -i ${image_home}/${image_portainer}
docker load -i ${image_home}/${image_portainer_agent}
docker load -i ${image_home}/${image_test}
docker load -i ${image_home}/${image_nacos}echo "Creating volumes ..."
docker volume create ppp
docker volume create portainer_dataecho "preparing for envrionment ..."mkdir -vp ${ppp}/redis_data ${ppp}/portainer_data ${ppp}/nacos_data
mkdir -vp ${ppp}/redis_data/conf  ${ppp}/redis_data/data
mkdir -vp ${ppp}/nacos_data/conf ${ppp}/nacos_data/data ${ppp}/nacos_data/logs
mkdir -vp ${ppp}/zookeeper_data ${ppp}/keepalived_data
mkdir -vp ${ppp}/logs_data
mkdir -vp ${ppp}/lib
mkdir -vp ${test} ${test}/node1 ${test}/node1/logs ${test}/node1/data
cp  ../conf/ioms/startup.sh ${test}/
cp -r ../conf/ioms/custom-config ${test}/
cp ../conf/common/wait-for-it.sh ${ppp}cp  -r ../lib ${ppp}/libcp ../conf/common/redis.conf ${ppp}/redis_data/conf/cp ../conf/common/application.properties ${ppp}/nacos_data/conf/echo "copy keepalived config file ..."
cp ../conf/keepalived/keepalived.conf ${ppp}/keepalived_data/chmod 777 -R ${ppp}
chmod 644 ${ppp}/keepalived_data/keepalived.confecho "=============Starting containers...========== "echo "=============creating all containers ...==================="
docker-compose -f ../compose.yml up -d nacos-server
docker-compose -f ../compose.yml up -d redis
docker-compose -f ../compose.yml up -d portainer
docker-compose -f ../compose.yml up -d portainer-agent
docker-compose -f ../compose.yml up -d test

卸载脚本uninstall.sh

#! /bin/bash# 停止容器
docker-compose -f ../compose.yml down# 删除镜像
docker rmi -f $(docker images -qa)# 删除数据
docker volume rm test portainer_data


查看完整的容器id和command
docker ps -a --no-trunc

相关文章:

  • 【cmu15445c++入门】(5)c++中的模板类
  • flask flask-sqlalchemy sqlit3
  • 如何顺滑使用华为云编译构建平台?
  • J3-DenseNet实战
  • 并发编程(九)
  • Vue3组件库 -- element plus 树形选择器组件怎样显示已有的树形菜单?
  • VuePress部署到GitHub Pages
  • Spark SQL基础
  • 浅研究下 DHCP 和 chrony
  • BSP视频教程第29期:J1939协议栈CAN总线专题,源码框架,执行流程和应用实战解析,面向车通讯,充电桩,模组通信等(2024-01-08)
  • Python 基础(八):函数
  • 一种DevOpts的实现方式:基于gitlab的CICD(二)
  • ROS OpenCV 图像基本处理函数
  • kylin集群使用nginx反向代理
  • 快速预览图片类PDF报告,PDF转文字并统计词频
  • 深入了解以太坊
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 2017-09-12 前端日报
  • css的样式优先级
  • C学习-枚举(九)
  • Electron入门介绍
  • es6
  • Git的一些常用操作
  • Hibernate最全面试题
  • python 装饰器(一)
  • Vue ES6 Jade Scss Webpack Gulp
  • 从伪并行的 Python 多线程说起
  • 基于webpack 的 vue 多页架构
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 责任链模式的两种实现
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Java性能优化之JVM GC(垃圾回收机制)
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​Java并发新构件之Exchanger
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #{}和${}的区别?
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (力扣)1314.矩阵区域和
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)setTimeout 和 setInterval 的区别
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)我也是一只IT小小鸟
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net6 Api Swagger配置
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • @cacheable 是否缓存成功_Spring Cache缓存注解