Docker基于Dockerfile多级构建LNMP,实现缩小镜像体积

目录

实验准备:

1.创建nginx镜像

2.创建mysql镜像

3.创建php镜像

4.完成对接

创建网络

创建nginx容器

创建mysql容器

创建WordPress库

创建php容器

5.登录验证

6.镜像体积是不是越小越好?为什么要缩减镜像体积?

7.缩小镜像体积的方法有哪些?


实验准备:

bash 复制代码
虚拟机:    192.168.88.22
nginx:     172.18.0.2:80
php:       172.18.0.3:9000
mysql:     172.18.0.4:3306

1.创建nginx镜像

bash 复制代码
mkdir /opt/nginx
cd /opt/nginx

vim Dockerfile
FROM centos:7 as build
#基于centos7镜像
MAINTAINER nginx on centos7 by yy-20240130
#注释信息
ADD nginx-1.24.0.tar.gz /opt/
#将nginx安装包传输到镜像中
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
    cd /opt/nginx-1.24.0 && \
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
    make && make install
#下载编译安装nginx的依赖环境,以及创建nginx用户,进入nginx目录中,完成配置--编译--安装
ENV PATH=$PATH:/usr/local/nginx/sbin/
#创建镜像的环境变量
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
#将配置文件传输的镜像中,覆盖原有的nginx.conf文件
RUN chmod 777 -R /usr/local/nginx/html/
#修改权限
 
FROM centos:7
#再次基于centos7
COPY --from=build /usr/local/nginx /usr/local/nginx
#把第一阶段的安装目录复制到第二阶段
RUN useradd -M -s /sbin/nologin nginx
#必须的有个nginx用户
EXPOSE 80
#暴露80端口
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
#设置启动命令

docker build -t nginx:yy .

2.创建mysql镜像

bash 复制代码
mkdir /opt/mysql
cd /opt/mysql
准备好mysql安装包
准备好mysql的配置文件my.cnf

vim my.cnf
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
 
[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
 
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
bash 复制代码
#编写构建mysql应用镜像的Dockerfile文件

vim Dockerfile

FROM centos:7
#基于centos7镜像
MAINTAINER this is mysql image <yy>
#注释信息
ADD mysql-boost-5.7.44.tar.gz /opt/
#将安装包和配置文件传输到镜像中
RUN yum -y install make gcc gcc-c++ ncurses ncurses-devel bison cmake openssl-devel && \
 yum clean all && \
 cd /opt/mysql-5.7.44/ && \
    cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j 2 && make install
#依次安装依赖环境,注意新版本必须要openssl环境,注意提示报错查看
#清理yum缓存
#进入mysql解压包中,完成cmake--编译--安装
FROM centos:7
COPY --from=0 /usr/local/mysql /usr/local/mysql
COPY my.cnf /etc/my.cnf
RUN useradd -M -s /sbin/nologin  mysql && \
    chown mysql:mysql /etc/my.cnf && \
    chown -R mysql:mysql /usr/local/mysql/ &&\
    /usr/local/mysql/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
#创建一个mysql用户
#修改配置文件的权限
#修改安装目录的权限
#直接用命令启动mysql
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
#配置环境变量
EXPOSE 3306
#暴露端口
CMD ["/usr/local/mysql/bin/mysqld"]
#设置默认启动命令

docker build -t mysql:lnmp .

3.创建php镜像

bash 复制代码
mkdir /opt/php
cd /opt/php
准备好php安装包

准备好php的三个配置文件

bash 复制代码
#编写构建php应用镜像的Dockerfile文件

vim Dockerfile

FROM centos:7
#基础镜像为centos7
MAINTAINER this is php image <yy:20240130>
#注释信息
ADD php-7.1.10.tar.bz2 /opt/
#将文件传输到镜像中
RUN yum -y install  gd libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel gcc gcc-c++ make pcre-develgcc gcc-c++ make pcre-devel && \
yum clean all && \
cd /opt/php-7.1.10 && \
 ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j 2&& make install && \
useradd -M -s /sbin/nologin nginx
#通过RUN依次下载php的依赖环境,清理yum缓存
#进入文件,配置--编译--安装
#创建nginx用户
COPY php.ini    /usr/local/php/lib/php.ini
COPY php-fpm.conf /usr/local/php/etc/php-fpm.conf
COPY www.conf /usr/local/php/etc/php-fpm.d/www.conf
#将三个配置文件传输到镜像中
 
FROM centos:7
RUN yum -y install  gd libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel gcc gcc-c++ make pcre-develgcc gcc-c++ make pcre-devel && \
yum clean all && \
useradd -M -s /sbin/nologin nginx
COPY --from=0 /usr/local/php /usr/local/php
EXPOSE 9000
#暴露9000端口
CMD [ "/usr/local/php/sbin/php-fpm", "-F" ]
#启动

docker build -t php:lnmp .

4.完成对接

创建网络

bash 复制代码
##创建一个自定义网络,网段为172.18.0.0/16,名称为mynetwork
docker network create --subnet 172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork

创建nginx容器

bash 复制代码
##创建nginx容器,-v 将宿主机准备的网页目录挂载到容器中,并做好端口映射到宿主机的80端口,设置网络模式为自定义的mynetwork,并指定ip为172.18.0.2
docker run -d --name nginx -v /docker/nginx/html/:/usr/local/nginx/html -p 80:80 --network mynetwork --ip 172.18.0.2 nginx:yy

创建mysql容器

bash 复制代码
##创建mysql容器,-v 创建数据卷,设置网络模式为自定义的mynetwork,并指定ip为172.18.0.4
docker run -d --name mysql --privileged -v /usr/local/mysql --network mynetwork --ip 172.18.0.4 mysql:lnmp

##登录进入mysql容器中,完成初始化
docker exec -it mysql bash
mysqladmin -uroot -p password "abc123"
mysql -uroot -pabc123

创建WordPress库

bash 复制代码
create database wordpress;

##做授权
mysql> grant all on *.* to 'wordpress'@'172.18.0.%' identified by 'wordpress';

mysql> flush privileges;

创建php容器

bash 复制代码
--volumes-from 将mysql和nginx的数据卷都挂载到php容器中,并做好端口映射到宿主机的9000端口,设置网络模式为自定义的mynetwork,并指定ip为172.18.0.3
docker run --name php -d -p 9000:9000 --volumes-from mysql --volumes-from nginx --net mynetwork --ip 172.18.0.3 php:lnmp

5.登录验证

6.镜像体积是不是越小越好?为什么要缩减镜像体积?

核心:降本增效以及安全

容器是镜像运行起来的实例,容器是宿主机的一个进程,那么肯定是镜像越小越好

  • 镜像越小说明占用宿主机的磁盘、内存资源越少,节约资源;
  • 镜像越小说明需要处理的文件越少,构建越快,提高效率;
  • 镜像越小,那么可以被攻击的面越小,就越安全。

**7.**缩小镜像体积的方法有哪些?

  1. 尽可能的使用较小体积的基础镜像(推荐使用 alpine 镜像)
  2. 尽可能的减少Dockerfile指令的数量,从而来减少镜像的层数
  3. 在RUN指令结尾添加安装软件后清空yum/apt缓存、软件包的命令
  4. 在 RUN 之后放置 COPY,这样可以充分利用镜像缓存
  5. 使用 .dockerignore 文件,将不复制到镜像的文件|目录定义在 .dockerignore 文件里
  6. 容器镜像里一般只运行单个应用
  7. 使用多阶段(多级)构建的方法
bash 复制代码
FROM 第一构建阶段的基础镜像 as 别名

....
FROM 第二构建阶段的基础镜像
COPY --from=别名|阶段ID(第一阶段为0)  第一阶段构建的文件|目录  当前阶段的路径
....
CMD|ENTRYPOINT 指定启动命令
相关推荐
淡水猫.几秒前
Fakelocation Server服务器/专业版 ubuntu
运维·服务器·ubuntu
wenyue11217 分钟前
Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析
运维·中间件·监控
时光の尘16 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
我们的五年20 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
灼烧的疯狂37 分钟前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
运维老司机43 分钟前
Jenkins修改LOGO
运维·自动化·jenkins
D-海漠1 小时前
基础自动化系统的特点
运维·自动化
我言秋日胜春朝★1 小时前
【Linux】进程地址空间
linux·运维·服务器
C-cat.1 小时前
Linux|环境变量
linux·运维·服务器
wenyue11211 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway