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 指定启动命令
相关推荐
丶21368 分钟前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker
codelife32121 分钟前
在Docker容器中执行命令
容器
神即道 道法自然 如来23 分钟前
Jenkins怎么设置每日自动执行构建任务?
运维·jenkins
petaexpress29 分钟前
常用的k8s容器网络模式有哪些?
网络·容器·kubernetes
hanniuniu1338 分钟前
详细解读,F5服务器负载均衡的技术优势
运维·服务器·负载均衡
鱼饼6号1 小时前
Prometheus 上手指南
linux·运维·centos·prometheus
m0_609000423 小时前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
m0_741768857 小时前
使用docker的小例子
运维·docker·容器
学习3人组7 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos