dockerfile创建lnmp镜像
目录一、创建lnmp的相关镜像1.1、dockerfile创建php7.2.16镜像1. 2、dockerfile创建nginx-1.15.7镜像1.3、mysql镜像是直接在docker仓库上pull二、通过dockerpose-compose运行lnmp环境2.1、安装docker-compose2.2、用docker-compose运行lnmp环境并挂载...
目录
1. 2、dockerfile创建nginx-1.15.7镜像
二、通过dockerpose-compose运行lnmp环境
2.2、用docker-compose运行lnmp环境并挂载docker容器数据目录到本地目录
2.3、用docker-compose运行并管理lnmp环境
现在说虚拟化技术的话,docker是最火的技术之一了,在生产环境中,越来越多业务需求用到docker去部署环境了!这篇文章讲的就是怎样用dockerfile去创建lnmp的各部件的镜像,docker-compose运行lnmp的环境!
注意:搞docker的环境时,切记把selinux关了,否则docker很多服务会起不来,比较挂载docker内部的目录到宿主主机时,由于selinux是开启了,就会导致docker的状态是Restarting。所以一般都是把selinux给关了,用以下命令
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
或sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
一、创建lnmp的相关镜像
-
1.1、dockerfile创建php7.2.16镜像
FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="php-7.2.16"
# wget https://www.php.net/distributions/php-7.2.16.tar.gz
ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel bison \
&& mkdir -p /usr/php/etc \
&& cd /tmp/$WJ \
&& ./configure --prefix=/usr/php \
--with-config-file-path=/usr/php/etc \
--with-gd --with-mysqli \
--with-openssl --with-zlib --with-curl \
--with-jpeg-dir --with-png-dir --with-iconv \
--enable-fpm --enable-zip --enable-mbstring \
&& make -j 4 \
&& make install \
&& cp /usr/php/etc/php-fpm.conf.default /usr/php/etc/php-fpm.conf \
&& cp /usr/php/etc/php-fpm.d/www.conf.default /usr/php/etc/php-fpm.d/www.conf \
&& sed -i '/;daemonize/a\daemonize = no' /usr/php/etc/php-fpm.conf \
&& sed -i 's/127.0.0.1/0.0.0.0/g' /usr/php/etc/php-fpm.d/www.conf \
&& echo "${TIME_ZOME}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
&& rm -rf /tmp/php* \
&& yum clean all \
&& yum -y remove gcc gcc-c++ make
WORKDIR /usr/php/
EXPOSE 9000
CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]
文件结构:
[root@dingzhi ~]# tree php7.2.16/
php7.2.16/
├── dockerfile
└── php-7.2.16.tar.gz
创建php镜像php7.2.16:latest
[root@dingzhi ~]# cd php7.2.16/
[root@dingzhi php7.2.16]# docker build -t php7.2.16:latest ./
(注意: docker build创建镜像时,注意文件路径的上下文,一般是在dockerfile的 ./ 当前目录里创建)
说明:
# cp /tmp/php-7.2.16/php.ini-production /usr/php/etc/php.ini \ 普通源码安装时的php.ini是要复制php.ini-production改名的,这里只安装好php的模块,只修改php-fpm配置文件,启动php-fpm服务。
# make -j 4 是指定4个并行运行的任务数,即4个编译的任务程序同时运行,提高速度(注意cpu瓶颈,如果提供了多个-j,最后一个才是有效的)。
# echo "${TIME_ZOME}" > /etc/timezone 和 ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime是修改时区为shanghai。
# daemonize = no 是php-fpm服务在前台启动,因为要后台启动容器的话,必须起的容器服务是前台运行,否则启动容器后就会莫名其妙自动退出。
-
1. 2、dockerfile创建nginx-1.15.7镜像
FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="nginx-1.15.7"
#wget http://nginx.org/download/nginx-1.15.7.tar.gz
#COPY nginx.conf /usr/local/nginx/
ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel zlib-devel \
&& mkdir -p /usr/local/nginx \
&& cd /tmp/$WJ \
&& ./configure --prefix=/usr/local/nginx --with-stream --with-http_ssl_module \
&& make -j 4 \
&& make install \
&& echo "${TIME_ZOME}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
&& rm -rf /tmp/nginx* \
&& yum clean all \
&& yum -y remove gcc gcc-c++ make \
&& ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
WORKDIR /usr/local/nginx/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
文件结构:
[root@dingzhi ~]# tree nginx1.15.7/
nginx1.15.7/
├── dockerfile
└── nginx-1.15.7.tar.gz
创建nginx镜像nginx1.15,7:latest
[root@dingzhi ~]# cd nginx1.15.7/
[root@dingzhi nginx1.15.7]# docker build -t nginx1.15.7:latest ./
说明:
# daemon off表示nginx服务前台启动
# COPY nginx.conf /usr/local/nginx/这行在nginx的dockerfile里我是注释掉的,用默认的。如果想要用自己修改的nginx.conf,只要把修改好的nginx.conf与dockerfile同一目录路径,COPY那行去注释。
# 注意: nginx.conf的location ~ \.php$配置的这一块要修改下。
location ~ \.php$ {
root html;
fastcgi_pass php:9000; #php容器名称和端口号
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #使用root指定的路径
include fastcgi_params;
注意!注意!注意!
重要的事情要说三遍:这里的nginx连接php-fpm时,在php容器里运行php-fpm的用户为nobody。可能有某些生产环境要求权限较高时,有可能存在nginx容器连接php容器的php-fpm服务实现不了功能的情况,不过简单显示连接mysql数据库是没问题的。
扩展:
nobody就是一个普通账户,因为默认登录shell是 '/sbin/nologin',所以这个用户是无法直接登录系统的,也就是黑客很难通过漏洞连接到你的服务器来做破坏。此外这个用户的权限也给配置的很低。因此有比较高的安全性。一切都只给最低权限。这就是nobody存在的意义。
-
1.3、mysql镜像是直接在docker仓库上pull
命令为:
docker pull mysql:5.7
[root@dingzhi ~]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ...
5.7: Pulling from docker.io/library/mysql
27833a3ba0a5: Pull complete
864c283b3c4b: Pull complete
cea281b2278b: Pull complete
8f856c14f5af: Pull complete
9c4f38c23b6f: Pull complete
1b810e1751b3: Pull complete
5479aaef3d30: Pull complete
1d924ec3d520: Pull complete
1ab7ae63ac60: Pull complete
08aa5f3680e9: Pull complete
a832d0a0972a: Pull complete
Digest: sha256:dba5fed182e64064b688ccd22b2f9cad4ee88608c82f8cff21e17bab8da72b81
Status: Downloaded newer image for docker.io/mysql:5.7
建议直接使用docker官方mysql镜像,通过dockerfile源码编译安装mysql镜像,最后生成的镜像大小超1G,docker官方mysql5.7镜像才400M不到。
二、通过dockerpose-compose运行lnmp环境
-
2.1、安装docker-compose
先到Docker-compose官网下载
下载最新版本docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@dingzhi ~]# chmod +x /usr/local/bin/docker-compose
[root@dingzhi ~]# docker-compose -v
docker-compose version 1.24.0, build 0aa59064
说明:
# 添加x执行权限后,docker-compose执行失败,一般是环境变量路径,请执行以下命令ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 如果想删除docker-compose的话,直接在rm -rf /usr/local/bin/docker-compose
# Docker-compose -v #查看docker-compose版本
# Docker-compose操作容器的命令是基于存放docker-compose.yml文件的目录里输出的,否则,就会以下错误!!!
-
2.2、用docker-compose运行lnmp环境并挂载docker容器数据目录到本地目录
查看php、nginx和mysql容器id
[root@dingzhi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1.15.7 latest 4b05c87dcbec 3 hours ago 302 MB
php7.2.16 latest 3428fd528787 4 hours ago 627 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
docker.io/centos latest 9f38484d220f 4 weeks ago 202 MB
编辑docker-compose.yml
version: '2'
services:
nginx:
image: 4b05c87dcbec
container_name: 'nginx'
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- "/data/nginx/html:/usr/local/nginx/html"
- "/data/nginx/logs/:/usr/local/nginx/logs/"
- "/data/nginx/conf/:/usr/local/nginx/conf/"
networks:
dangjian:
ipv4_address: 172.19.0.2
php:
image: 3428fd528787
container_name: 'php'
restart: 'always'
ports:
- "9000:9000"
volumes:
- "/data/nginx/html:/usr/local/nginx/html"
networks:
dangjian:
ipv4_address: 172.19.0.3
mysql:
image: 98455b9624a9
container_name: 'mysql'
restart: 'always'
ports:
- "3306:3306"
volumes:
- "/data/mysql/data/:/var/lib/mysql/"
- "/data/mysql/conf/:/etc/mysql/conf.d/"
environment:
MYSQL_ROOT_PASSWORD: 123456
networks:
dangjian:
ipv4_address: 172.19.0.4
networks:
dangjian:
ipam: #切记这里的“ipam:”改动就报错
config:
- subnet: 172.19.0.0/16
gateway: 172.19.0.1
创建本地挂载的目录
nginx目录
mkdir -p /data/nginx/{conf,html,logs}
mysql目录
mkdir -p /data/mysql/{conf,data}
由于mysql容器的/etc/mysql/my.cnf里的配置内容为:(注意感叹号)
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
#注意!includedir /etc/mysql/conf.d/包含/etc/mysql/conf.d/目录下的*.cnf配置内容
#实现验证为# cat /data/mysql/conf/my.cnf
[mysqld]
skip-grant-tables
启动mysql容器可以实现在mysql容器内直接用mysql命令登录数据库
#注意 !includedir /etc/mysql/conf.d/包含/etc/mysql/conf.d/目录下的*.cnf配置内容
#注意 本地的/data/nginx/conf/里要有nginx.conf文件,要不启动nginx容器会报错
-
2.3、用docker-compose运行并管理lnmp环境
docker-compose命令必须在存在docker-compose.yml目录下输入
启动lnmp
~]# docker-compose up -d
常用的docker-compose命令
docker-compose up -d #后台docker-compose.yml所有容器
docker-compose down #关闭docker-compose.yml所有容器
docker-compose ps #查看所有容器的状态
docker-compose restart 容器名 #重启启动某个容器
更多的docker-compose命令的话,请查看docker-compose -h
验证
[root@dingzhi ~]# vi /data/nginx/html/test.php
<?php
echo "Hello lituxiu<br/>";
echo "Hello PHP<br/>";
$conn = mysqli_connect("mysql","test","123456");
if(!$conn){
echo "连接数据库失败";
}else{
echo "连接数据库成功";
}
phpinfo();
?>
浏览器访问:http://192.168.21.140/test.php
dockerfile的lnmp环境大功告成!
更多推荐
所有评论(0)