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

发布于:2024-04-30 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

引言

一、安装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端口