Dockerfile实战---构建SSH、Tomcat、MySQL、Nginx镜像

目录

引言

一、安装docker程序

二、构建SSH镜像

1.创建镜像

2.基于sshd镜像创建容器

三、构建tomcat镜像

1.创建镜像

2.基于tomcat镜像创建容器

四、构建MySQL镜像

1.创建镜像

2.基于mysqld镜像创建容器

五、构建nginx镜像

1.创建镜像

2.基于nginx镜像创建容器


引言

创建自定义镜像主要是通过Dockerfile文件以及使用docker build命令工具实现,其意义在于可以在基础镜像中添加符合自己公司产品需求的镜像文件,只需要创建一次镜像,就可以在多台服务器上使用,不需要再进行繁琐的服务安装与文件配置,只要是基于此镜像创建的容易,都可以直接提供相同的服务

一、安装docker程序

关闭防火墙与核心防护

[root@docker ~]#systemctl stop firewalld.service
[root@docker ~]#setenforce 0

安装依赖包

[root@docker ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
#安装依赖环境
yum-utils      #提供了 yum-config-manager 工具。
device mapper  #是Linux内核中支持逻辑卷管理的通用设备映射机制
               #它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
               #device mapper存储驱动程序需要 device-mapper-persistent-data和lvm2

添加阿里云镜像源

安装docker

[root@docker ~]#yum install -y docker-ce docker-ce-cli containerd.io
 
docker-ce
#Docker社区版的简称,Docker的免费版本,它包含了运行Docker容器所需的主要服务和命令行工具
 
docker-ce-cli:
#社区版客户端工具。主要是为了支持只需要Docker命令行工具而不运行Docker daemon的场景
#比如在无服务器环境或者远程管理 Docker宿主机。
 
containerd.io
#负责容器和镜像的生命周期管理,是Docker以及其他容器平台背后的核心组件之一

启动服务

添加加速器地址

浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置

获取centos镜像

[root@docker ~]#docker pull centos:7

二、构建SSH镜像

1.创建镜像

[root@docker ~]#mkdir -p /data/ssh
#创建项目目录
[root@docker ~]#cd  /data/ssh/
[root@docker ssh]#vim Dockerfile
#构建Dockerfile文件
[root@docker ssh]#cat Dockerfile 
FROM centos:7
MAINTAINER this is ssh image <sshd>
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo 'abc1234' | passwd --stdin root
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN sed -ri '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd
RUN ssh-keygen -t rsa -A	
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd" , "-D"]

[root@docker ssh]#docker build -t sshd:centos . 
#生成镜像文件
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos:7
.......

docker build
#这是Docker的命令,用于根据Dockerfile中的指令构建一个新的镜像。

-t sshd:centos
#这个参数指定了新镜像的仓库名和标签。httpd是镜像仓库名,centos是标签名

.
#最后的点(.)代表当前目录,它告诉Docker在当前目录下查找Dockerfile。
#Docker会根据Dockerfile中的指令一层一层地构建镜像。

FROM centos:7
#该镜像是基于官方的CentOS 7基础镜像创建的。

MAINTAINER this is ssh image <sshd>
#提供镜像作者信息

RUN yum -y install openssh* net-tools lsof telnet passwd
#使用yum安装环境

RUN echo 'abc1234' | passwd --stdin root
#设置root用户的密码为'abc1234'。注意在生产环境中不建议如此明文设置密码,此处仅作演示用途。

RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#修改sshd配置文件,禁用PAM身份验证模块,使得SSH服务可以直接使用/etc/passwd文件来进行认证。

RUN sed -ri '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd:
#注释掉sshd服务的PAM配置中关于loginuid的行,避免因为PAM配置问题导致sshd无法启动。

RUN ssh-keygen -t rsa -A
#生成RSA类型的SSH主机密钥对,-A 参数表示同时生成所有密钥类型的公钥和私钥。

RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh:
#创建/root/.ssh目录,并将其所有者设为root用户和root组,并赋予该目录权限700

EXPOSE 22
#声明该容器在运行时会监听22端口,这是SSH服务的标准端口。

CMD ["/usr/sbin/sshd", "-D"]
#设置容器启动时运行的默认命令,即启动sshd服务并进入守护进程模式(-D)

2.基于sshd镜像创建容器

使用客户端登录

三、构建tomcat镜像

1.创建镜像

[root@docker ~]#mkdir -p  /data/tomcat
#创建项目目录
[root@docker ~]#cd  /data/tomcat/
[root@docker tomcat]#vim Dockerfile
#构建Dockerfile文件
[root@docker tomcat]#cat Dockerfile
FROM centos:7
MAINTAINER this is tomcat <tomcat>
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_291 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
EXPOSE 8080
EXPOSE 8009
EXPOSE 8005
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]
[root@docker tomcat]#ls
apache-tomcat-9.0.16.tar.gz  Dockerfile  jdk-8u291-linux-x64.tar.gz
#准备好数据包
[root@docker tomcat]#docker build -t tomcat:centos .
#生成镜像文件
[+] Building 10.0s (5/11)                                                                 docker:defaultdefaultault[internal] load build definition from Dockerfile                                                0.0s   0.0s
 => [internal] load build definition from Dockerfile                                                0.0s   0.0s

FROM centos:7
#表示新镜像是基于CentOS 7的基础镜像构建。

MAINTAINER this is tomcat <tomcat>
#指定镜像的作者和联系方式

ADD jdk-8u291-linux-x64.tar.gz /usr/local/:
#将本地名为jdk-8u291-linux-x64.tar.gz的Java开发工具包压缩包解压到容器内的/usr/local/目录下。

WORKDIR /usr/local/
#设置工作目录为/usr/local/。

RUN mv jdk1.8.0_291 /usr/local/java:
#将解压后的Java目录重命名为/usr/local/java,作为Java安装路径。

环境变量设置:
ENV JAVA_HOME /usr/local/java
#设置Java主目录环境变量。
ENV JRE_HOME ${JAVA_HOME}/jre
#设置Java运行时环境(JRE)目录环境变量。
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
#设置类路径环境变量,包含当前目录和其他Java库目录。
ENV PATH $JAVA_HOME/bin:$PATH
#把Java的bin目录添加到系统的PATH环境变量中,以便全局执行Java命令。

ADD apache-tomcat-9.0.16.tar.gz /usr/local/
#将Apache Tomcat 9.0.16的tar.gz压缩包解压至/usr/local/目录。

WORKDIR /usr/local/
#再次确认工作目录为/usr/local/。

RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
#将解压后的Tomcat文件夹重命名为/usr/local/tomcat,作为Tomcat的安装路径。

EXPOSE 8080、EXPOSE 8009 和 EXPOSE 8005:
#分别声明容器运行时需要对外开放的端口:
#8080(HTTP服务)、8009(AJP协议,通常用于反向代理)和8005(Tomcat的shutdown端口)。

ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
#运行Tomcat的catalina.sh脚本并指定run命令,这将以非守护进程模式启动Tomcat。

CMD ["/usr/local/tomcat/bin/startup.sh","start"]
#在Docker容器启动时,执行位于/usr/local/tomcat/bin目录下的startup.sh脚本,
#并且传入一个参数start

然而,由于这个Dockerfile中同时存在ENTRYPOINT指令,两者之间有一定的优先级关系:
如果ENTRYPOINT未定义或者以exec格式定义,CMD会被ENTRYPOINT执行,这里的CMD内容作为参数传递给ENTRYPOINT。
若ENTRYPOINT以数组格式定义(如本例),并且CMD也存在,则CMD的参数会追加到ENTRYPOINT之后一同执行。
结合本Dockerfile的上下文,如果ENTRYPOINT设置为["/usr/local/tomcat/bin/catalina.sh","run"],则CMD中的命令不会被执行,因为ENTRYPOINT已经定义了容器启动时执行的命令。若想使Tomcat以守护进程模式启动,通常应修改ENTRYPOINT而不是CMD。如果确实需要在容器启动时执行startup.sh,则需调整或合并ENTRYPOINT和CMD的配置。

2.基于tomcat镜像创建容器

使用浏览器访问端口查看

四、构建MySQL镜像

1.创建镜像

[root@docker ~]#mkdir -p /data/mysql
[root@docker ~]#cd  /data/mysql/
[root@docker mysql]#vim Dockerfile 
[root@docker mysql]#vim my.cnf
[root@docker mysql]#ls
Dockerfile  my.cnf  mysql-boost-5.7.20.tar.gz
[root@docker mysql]#docker build -t mysql:centos .
[+] Building 32.7s (14/14) FINISHED                                                              docker:default
 => [internal] load build definition from Dockerfile                                                       0.0s
......

Docker文件

FROM centos:7
#基于CentOS 7镜像创建新的Docker镜像。

MAINTAINER this is mysql image <mysqld>
#声明镜像的维护者信息

RUN yum -y install ...
#使用yum包管理器安装编译和运行MySQL所需的各种依赖包,并创建一个名为mysql的无家目录用户

ADD mysql-boost-5.7.20.tar.gz /usr/local/
#将名为mysql-boost-5.7.20.tar.gz的MySQL源码包解压到容器内的/usr/local/目录下。

WORKDIR /usr/local/mysql-5.7.20/
#设置工作目录为解压后的MySQL源码目录。

RUN cmake ... make install
#使用cmake配置MySQL编译选项,进行编译和安装。

ADD my.cnf /etc/my.cnf
#将当前目录下的my.cnf配置文件添加到容器的/etc目录下,用作MySQL服务器的配置文件。

EXPOSE 3306
#声明容器运行时将暴露3306端口,这是MySQL服务的标准端口。

RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf
#更改MySQL安装目录及其配置文件的所有权,使其属于mysql用户和mysql组。

WORKDIR /usr/local/mysql/bin/
#切换到MySQL二进制文件目录。

RUN ./mysqld ... systemctl enable mysqld
#初始化MySQL数据库目录和数据文件,并设置MySQL服务开机启动。

ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
#设置环境变量PATH,将其更新为包含MySQL的bin和lib目录。

VOLUME [ "/usr/local/mysql" ]
#定义一个数据卷挂载点,这里的 /usr/local/mysql是MySQL的数据目录。
#在容器运行时,可以将宿主机的某个目录映射到此容器内的该目录,使得数据持久化并可在不同容器间共享

CMD ["/usr/sbin/init"]
#设置了容器启动时默认执行的命令,这里是/usr/sbin/init
#也可以设置为/usr/local/msyql/bin/mysqld

my.cnf配置文件

2.基于mysqld镜像创建容器

进入容器进行用户授权

使用具有mysql服务的客户端进行登录测试

在容器内查看

五、构建nginx镜像

1.创建镜像

[root@docker ~]#mkdir /data/nginx
#创建项目目录
[root@docker ~]#cd  /data/nginx/
[root@docker nginx]#vim Dockerfile
[root@docker nginx]#cat Dockerfile 
FROM centos:7
MAINTAINER this is nginx image <nginx>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.18.0.tar.gz /usr/local
WORKDIR /usr/local/nginx-1.18.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module; make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@docker nginx]#ls
Dockerfile  nginx-1.18.0.tar.gz
[root@docker nginx]#docker build -t nginx:centos .
[+] Building 33.2s (6/10)                                                                        docker:default
......                

FROM centos:7
#指定基础镜像为CentOS 7。

MAINTAINER this is nginx image <nginx>
#声明镜像作者及联系信息

RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#通过yum包管理器安装编译Nginx所需的依赖包

RUN useradd -M -s /sbin/nologin nginx
#创建一个名为nginx的系统用户,并禁止其登录shell

ADD nginx-1.18.0.tar.gz /usr/local
#将名为nginx-1.18.0.tar.gz的Nginx源代码压缩包解压到容器内的/usr/local目录下。

WORKDIR /usr/local/nginx-1.18.0
#设置工作目录为解压后的Nginx源代码目录。

RUN ./configure ... ;make -j4 && make install
#在Nginx源代码目录下执行配置、编译和安装操作。编译使用了4个线程(-j 4)以提高速度。

ENV PATH /usr/local/nginx/sbin:$PATH
#设置环境变量PATH,将Nginx的sbin目录加入到PATH中,使得在容器内可以直接执行Nginx的命令。

EXPOSE 80 和 EXPOSE 443
#分别声明容器运行时将公开80端口(HTTP)和443端口(HTTPS),表示Nginx将在这些端口上提供服务。

CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
#设置容器启动时默认执行的命令,即启动Nginx服务器,并指定运行在前台模式(防止容器启动后立即退出)
#通过-g "daemon off;"参数禁用了Nginx的守护进程模式
#这意味着当启动容器时,Nginx将以非守护进程形式运行,并且容器的生命周期与Nginx服务绑定在一起。

2.基于nginx镜像创建容器

使用浏览器访问宿主机的1411端口

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Stream流方式合并两个list集合(部分对象属性重合)

一、合并出共有部分 package com.xu.demo.test;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class ListMergeTest1 {public static void main(String[] args) {List<User> list1 Arrays.asList(new User(1, "Alic…

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢&#xff1f; 理解TIME_WAIT状态 流量控制&#xff08;可靠性效率&#xff09; 滑动窗口 拥塞…

Java8中的Stream流相关用法学习

目录 一、Stream是什么 二、创建Stream 三、中间操作 3.1 filter() 3.2 map() 3.3 flatMap() 3.4 distinct() 3.5 limit() 四、终端操作 4.1 findAny(), 和 orElse() 4.2 sorted() 4.3 forEach() 4.4 count() 4.5 collect() 4.6 groupingBy() 4.7 average() 4…

RAG-Driver: 多模态大语言模型中具有检索增强上下文学习的通用驱动解释

RAG-Driver: 多模态大语言模型中具有检索增强上下文学习的通用驱动解释 摘要Introduction RAG-Driver: Generalisable Driving Explanations with Retrieval-Augmented In-Context Learning in Multi-Modal Large Language Model. 摘要 由“黑箱”模型驱动的机器人需要提供人类…

Java对接高德api搜索POI 2.0 关键字搜索

目录 一、注册账号 二、搜索小demo 1.首先要引入依赖 2. 然后查看打印结果即可 三、搜索接口代码 1.引入依赖 2.yml配置 2.Controller 3.静态工具类 四、运行测试 一、注册账号 高德开放平台 | 高德地图API 注册高德开发者&#xff1b;去控制台创建应用&#xff…

【Python网络爬虫】python爬虫用正则表达式进行数据清洗与处理

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

机器学习:深入解析SVM的核心概念(问题与解答篇)【三、核函数】

核函数 **问题一&#xff1a;为什么说是有限维就一定存在高维空间可分呢&#xff1f;**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二&#xff1a;最终怎么得到函数**从对偶问题到决策函数的步骤&#xff1a;结论 **问题三&#xff1a;为什么说特征…

c#数据库: 6.查询成绩合格的学生/7.输出全部学生信息

SQL Server Management Studio Management Studio 中的学生信息表: 查询上图成绩合格的学生信息&#xff0c;并将信息从控制台输出 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text…

【弱监督语义分割】AllSpark:从transformer中的未标记特征重生标记特征,用于半监督语义分割

AllSpark: Reborn Labeled Features from Unlabeled in Transformer for Semi-Supervised Semantic Segmentation 摘要&#xff1a; 目前最先进的方法是用真实标签训练标注数据&#xff0c;用伪标签训练未标注数据。然而&#xff0c;这两个训练流程是分开的&#xff0c;这就使…

《Fundamentals of Power Electronics》——正激变换器

正激变换器电路如图6.24所示&#xff1a; 该变压器隔离型转换器基于Buck电路&#xff0c;需要一个晶体管&#xff0c;因此常被使用在比全桥和半桥功率等级低的应用中。其非脉动输出电流与其他降压衍生变换器相同&#xff0c;使正激变换器非常适合涉及高输出电流的应用。晶体管最…

Slave SQL线程与PXB FTWRL死锁问题分析

1. 问题背景 2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSH TABLES WITH READ LOCK未释放导致备库复制延时拉大&#xff0c;慢日志内看持锁接近25分钟未释放。 版本&#xff1a; MySQL 5.7.21PXB 2.4.18 慢查询日志&#xff1a; 备份脚本中的备份命令&#xff1a;…

QT 开发COM(ActiveX)组件基础介绍和方案验证

一、COM简介 1.1 COM是什么&#xff1f; COM&#xff0c;Component Object Model&#xff0c;即组件对象模型&#xff0c;是一种以组件为发布单元的对象模型&#xff0c;这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范&#xff0c;也…

LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)

LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09; 目录 LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.LSTM-KDE的长短期…

微服务入门学习笔记(黑马商城)

课程转跳&#xff1a;SpringCloud微服务Day1-01.微服务课程介绍_哔哩哔哩_bilibili 一、服务拆分 新建一个maven项目将商品服务拆分出去 更改包扫描 新建一个数据库用于商品服务&#xff0c;同样将表拆分出去 更改配置文件的服务名和数据库名 启动多个实例&#xff1a; 复制配…

解决Pycharm全局搜索与输入法简繁切换快捷键冲突问题

Pycharm中全局搜索快捷键Ctrl Shift F 如图所示&#xff1a; 微软输入法简繁切换快捷键设置&#xff1a; 解决办法&#xff1a; 关掉输入法的切换功能即可&#xff0c;或者更改简繁切换快捷键&#xff0c;毕竟简繁切换使用频率极低。

特别的时钟:上次那个时钟布局和计算有问题,重新修改一下,用JS创建180多个li标签,自动生成数字

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>特别的时钟</title> </head> <st…

Github Action Bot 开发教程

Github Action Bot 开发教程 在使用 Github 时&#xff0c;你可能在一些著名的开源项目&#xff0c;例如 Kubernetes&#xff0c;Istio 中看到如下的一些评论&#xff1a; /lgtm /retest /area bug /assign xxxx ...等等&#xff0c;诸如此类的一些功能性评论。在这些评论出现…

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中&#xff0c;rtc在网上还是挺少人应用的&#xff0c;找了很久没什么资料&#xff0c;现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳&#xff1a;RTC可以记录事件发生的精确时间&…

踏上R语言之旅:解锁数据世界的神秘密码(四)

文章目录 前言一、多元线性回归1.多元线性回归模型的建立2.多元线性回归模型的检验 二、多元线性相关分析1.矩阵相关分析2.复相关分析 三、回归变量的选择方法1.变量选择准则2.变量选择的常用准则3.逐步回归分析 总结 前言 回归分析研究的主要对象是客观事物变量间的统计关系。…

Macs Fan Control Pro for mac激活版:macOS 平台的风扇控制软件

Macs Fan Control Pro是一款用于 macOS 平台的风扇控制软件&#xff0c;它允许用户监控和调整 Mac 电脑的风扇转速。以下是该软件的一些特点和功能&#xff1a; Macs Fan Control Pro for mac激活版下载 风扇监控&#xff1a;Macs Fan Control Pro 提供实时的风扇转速监控&…
最新文章