从无到有制作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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342696.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue前端开发自学,组件的嵌套关系demo

vue前端开发自学,组件的嵌套关系demo!今天开始分享的,前端开发经常用到的,组件的嵌套关系案例代码。下面先给大家看看,代码执行效果。 如图,这个是代码执行后,的效果布局! 下面给大家贴出来源码。方便大家…

String有没有最大长度限制?

大家都用过String字符串,有的人可能还不知道它的长度在某些方面是有一些限制。 public String(byte bytes[], int offset, int length);这是java.lang.String中的一个构造函数,可以看到它的长度是int类型,int的最大取值是2^31-1.但是我们却不…

redis 从0到1完整学习 (十七):内存回收之内存淘汰策略

文章目录 1. 引言2. redis 源码下载3. 内存回收策略4. 如何设置内存淘汰策略4.1 在 Redis 配置文件设置(推荐重启后生效)4.2 运行时动态调整 5. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装…

【java八股文】之MYSQL基础篇

1、数据库三大范式是什么 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键列只依赖于主键&#…

2024 IAA增长变现玩法拆解,NetMarvel提出进阶版攻略!

2023年的国内外市场,很多大甲方都表示消极,字节游戏业务高歌猛进后大撤退更是直接震惊了整个行业,更别说第二第三梯队的服务商了。 动荡和低迷的经济局势还没有消散,这给开发者带来接连不断的挑战。 01 市场反馈是正向的&#x…

VS Code 配置 Vue3 模板 详细步骤

1、打开 VS Code ,在页面左下角找到这个设置图标,然后找到 “用户代码片段” 2、接着点击 “新建全局代码片段文件” 3、在输入框中输入你要设置的模板名,然后回车确认 4、接下来配置自己想要模板代码,或者也可以借鉴我写的这个&…

JavaScript(第二篇)浮点数运算精度问题,一网打尽所有相关面试题

前言 本篇文章是《面试题一网打尽》专栏的 javascript 第二篇文章,彻底解决浮点数运算精度相关的面试题目。欢迎大家关注我的这个专栏。 一、IEEE 754 标准 我们经常在文档中看到这个标准感觉是什么高深的东西,其实 IEEE 是一个组织类似公司名称&…

Sublime Text 3配置 Python 开发环境

Sublime Text 3配置 Python 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 Python2. 接入 Python2.1 下载2.2 安装和使用 python2.2 环境变量配置 3. 配置 Python 开发环境4. 编写 Python 代码5. 运行 Python 代码 三、总结 一、引言 Python 是一种简洁但功能强…

记录一次数据中包含转义字符\引发的bug

后端返回给前端的数据是: { "bizObj": { "current": 1, "orders": [ ], "pages": 2, "records": [ { "from": "1d85b8a4bd33aaf99adc2e71ef02960e", …

LInux初学之路linux的磁盘分区/远程控制/以及关闭图形界面/查看个人身份

虚拟机磁盘分配 hostname -I 查看ip地址 ssh root虚拟就ip 远程连接 win10之后才有 远程控制重新启动 reboot xshell 使用(个人和家庭版 免费去官方下载) init 3 关闭界面 减小内存使用空间 init 5 回复图形界面 runlevel显示的是状态 此时和上…

抄代码对提升编程能力有用吗?

我毕业12年,做开发10年,一直用c语言在写程序,编程水平从菜,到能应付各种项目,我可以肯定告诉你,抄代码很有用,新手也只能先从抄开始。 刚开始,啥也不懂,就跟着教程&#…

简单明了,汽车级LM317系列LM317D2TR4G线性电压稳压器电源设计-参数应用方案分享

低压差线性稳压器(LDO),是指一种具有恒定电流输出电压的装置,主要由输入变压器、整流器、输出变压器三部分构成,工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压,再经过控制元件和开关器件将稳…