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

news2024/11/16 7:31:13

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.1

4、进容器(可以在进容器里添加一些基本命令,如telnet、ifconfig命令,不然制作的镜像是没有这些基本命令的)
docker exec -it test  /bin/bash

安装一些常用的工具
yum -y install vim
yum -y install net-tools


5、 将镜像test:1.0.1保存为test.tar.gz,默认保存在当前目录
docker save -o test.tar.gz test:1.0.1

6、将test.tar.gz 导入镜像
docker load -i test.tar.gz

7、 通过test:1.0.1镜像启动容器
docker run -itd   --privileged=true --name test test:1.0.1


8、如果知道容器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.3
    container_name: nacos-server
    network_mode: "host"
    environment:
      - PREFER_HOST_MODE=ip
      - MODE=standalone
    volumes:
      - /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/data
    ports:
      - 8848:8848
    restart: always
  portainer:
    image: "portainer/portainer-ce"
    container_name: "portainer"
    ports:
      - "8000:8000"
      - "7000:9000"
    restart: always
    volumes:
      - "/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: always
    volumes:
      - "/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: always
    sysctls:
      - net.core.somaxconn=1024
    volumes:
      - "/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.conf
 test:
    image: "test:1.0.1"
    container_name: "test"
    network_mode: "host"
    restart: always
    environment:
      - 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:8060

    volumes:
      - "/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: 500m
    privileged: true
    command: /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 docker

echo "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_data


echo "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}/lib

cp ../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.conf

echo "=============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.coloradmin.cn/o/1377813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AdaM: An Adaptive Fine-Grained Scheme for Distributed Metadata Management——泛读论文

ICPP 2019 Paper 分布式元数据论文汇总 问题 为了同时解决元数据局部性和元数据服务器的负载均衡。 现有方法缺陷 基于哈希的方法:zFS [16],CalvinFS [21],DROP [24],AngleCut [8] 静态子树划分:HDFS [6], NFS [14…

【Golang】IEEE754标准二进制字符串转为浮点类型

IEEE754介绍 IEEE 754是一种标准,用于表示和执行浮点数运算的方法。在这个标准中,单精度浮点数使用32位二进制表示,分为三个部分:符号位、指数位和尾数位。 符号位(s)用一个位来表示数的正负,0表示正数,1表…

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

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

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差 题目描述解题思路 & 代码实现递归法迭代法 题目描述 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例&#…

VR全景技术如何应用在城市发展,助力城市宣传展示

引言: 随着科技的不断发展,VR全景技术正逐渐渗透到各行各业,其中较为广泛的应用之一便是城市展示。那么VR全景技术如何运用在城市展示领域,这项技术给城市发展带来了哪些好处? 一. VR全景技术简介 1.什么是VR全景技术…

Java十大经典算法——贪心算法

算法概念: 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法;贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但…

拯救者y9000p安装linux、windows双系统。

首先需要准备启动盘 我用的是Win32DiskImager来做的。资源使用的是ubuntu-20.04.6-desktop-amd64.iso。别用低版本,失败很多次之后的教训。 磁盘管理-磁盘分区-右键-压缩卷 这边分区出来之后,不要分配。安装时候会自动分配的。 重启之后F2进去BIOS设置…

计算机系统(软考版)----计算机系统基础知识、基本单位与进制(1)

文章目录 计算机系统基础知识一 硬件组成二 CPU功能三 CPU组成运算器控制器寄存器组 练习题(答案为加粗部分) 计算机基本单位与进制一 计算机基本单位二 进制1 概述2 进制转换3 进制加减 练习题(答案为加粗部分) 计算机系统基础知…

Blazor中使用impress.js

impress.js是什么? 你想在浏览器中做PPT吗?比如在做某些类似于PPT自动翻页,局部放大之类,炫酷无比。 官方示例直接放到Blazor中是不可用的。几经尝试,用以下方法可以实现。 (写文不易,请点赞、…

MySql前言

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 数据库有哪些软件?? Mysql MySql数…

数据科学竞赛平台推荐

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

叠加文件夹内所有png文件 python

→ import os import cv2 import matplotlib.pyplot as pltPATH "./1" #文件路径 i 0 #子文件夹路径 img10 for parent, dirs, files in os.walk(PATH):for file in files:if not file.endswith(.png):continueimg cv2.imread(os.path.join(parent, file))if i0:i…

mysql表的约束问题

目录 1. 表的约束问题: 主键约束: 案例: 非空约束 唯一约束: 默认值约束: 案例: 2.表的结构 前提:接上一张博客内容经行操作 1. 表的约束问题: 用来保证数据插入的安全性、完整性、正确性 主健,外键,唯一,默认值,非空,检查 主键…

TMC2226步进电机驱动---学习记录

基于TMC2226数据手册的学习 主要内容介绍: Package Outline TMC2226 手册中引脚解释(按照手册表格顺序) 了解每个引脚是接什么的,之后看原理图 (借用立创广场kirito的原理图,后期换个) 以前的疑…

202404读书笔记|《只愿你被这世界温柔相待》——我跌落于生活的荆棘,高傲,机敏,桀骜不驯

202404读书笔记|《只愿你被这世界温柔相待》——我跌落于生活的荆棘,高傲,机敏,桀骜不驯 CHAPTER1 只为途中与你相见CHAPTER2 只要有爱就有痛CHAPTER3 为自己的心安一个家CHAPTER4 让往事随风 《只愿你被这世界温柔相待》作者雪莱等&#xff…

基于AI视频智能分析技术的周界安全防范方案

一、背景分析 随着科技的不断进步,AI视频智能检测技术已经成为周界安全防范的一种重要手段。A智能分析网关V4基于深度学习和计算机视觉技术,可以通过多种AI周界防范算法,实时、精准地监测人员入侵行为,及时发现异常情况并发出警报…

【开源】基于JAVA语言的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

vue3打包后页面空白解决方法

vue3打包后页面空白解决方法 问题解决方法 问题 最近写一个小项目 没有打包的时候一切正常 技术栈用的vue3 vite 我用的是npm创建的项目 npm init vuelatest问题一 :打包后页面空白,什么都没有 问题二:刷新页面后找不到资源 把url的inde…

C++ 之LeetCode刷题记录(九)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅,多学多练,尽力而为。 先易后难,先刷简单的。 58. 最后一个单词的长度 给你一个字符串 s,由若干…

Minitab的单因子方差分析的结果

单因子方差分析概述 当有一个类别因子和一个连续响应并且想要确定两个或多个组的总体均值是否存在差异时,可使用 单因子方差分析。如果经检验,发现至少有一组存在差异,请使用单因子方差分析中的比较对话框来标识存在显著差异的组对。 例如&…