• 对于注定会优秀的人来说,他所需要的,只是时间----博主
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!
  • 本站开启了防爆破关小黑屋机制,如果您是正常登录但被关进小黑屋,请联系站长解除!

<十一>docker学习笔记–制作lnmp镜像

docker eryajf 4个月前 (08-05) 463°C 已收录 0个评论
本文预计阅读时间 14 分钟

有时候有一些PHP项目,可能稳定性并不是最高的指标,简单,便捷,好用才是,那么使用一个镜像来跑,似乎也是非常合适的,今天就来做一下lnmp的镜像,以便于后边使用。

1,说明

此镜像基于lnmp一键安装包制作,制作过程如下。

2,基础镜像。

首先启动一个centos-7.4的基础镜像,然后在镜像内把lnmp环境安装好。

$ docker run -itd --name eryajf registry.cn-hangzhou.aliyuncs.com/eryajf/centos:7.4

然后进入到镜像中,下载lnmp包,进行安装。

$ docker exec -it eryajf sh
$ wget http://175.6.32.4:88/soft/lnmp/lnmp1.4-full.tar.gz
$ tar xf lnmp1.4-full.tar.gz
$ cd lnmp1.4-full
$ ./install.sh

经过简单初始选项,就进入了安装阶段。

  • 特别注意1:这个地方MySQL的密码为root,而且开启了远程登录,以便于后边映射出去之后方便远程登录。
  • 特别注意2:我把这里的NGINX启动方式,改成了前台启动,以便于后边最终镜像的制作。

等待一会儿,一个完整的lnmp环境就安装好了,然后精简一下当前镜像当中的内容,把不要的东东都删掉,然后把这个镜像保存成一个基础镜像。

$ docker commit eryajf lnmp:0.1

3,最终镜像。

上边保存了一个 lnmp:0.1的镜像,此时还不能作为一个常规镜像来使用,因为刚刚commit保存的镜像并不会保存应用的状态,因此我们需要在此基础之上,利用Dockerfile进行简单的改造。

$ mkdir lnmp
$ cd lnmp

Dockerfile:

$ cat Dockerfile
FROM       lnmp:0.1

MAINTAINER eryajf <Linuxlql@163.com>

ADD   run.sh  /

EXPOSE 80
EXPOSE 3306

ENTRYPOINT [ "sh", "-c", "/run.sh" ]

run.sh:

$ cat run.sh
#!/bin/bash
#start php
/usr/local/php/sbin/php-fpm
#start mysql
/etc/init.d/mysql start
#start nginx
/usr/local/nginx/sbin/nginx

然后就可以构建最终的镜像了。

$ docker bilid -t lnmp:1.0 .

这样,就制作好了最终的镜像了。

4,启动验证。

因为我们在Dockerfile当中定义了两个端口,那么直接使用如下方式启动,系统会自动给我们映射两个随机的端口。

$ docker run -itd --name lnmp -P lnmp:1.0

然后可以看一眼映射的随机端口。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
5ba0968e8b6b        lnmp:1.0               "sh -c /run.sh"     22 minutes ago      Up 22 minutes       0.0.0.0:32771->80/tcp, 0.0.0.0:32770->3306/tcp   lnmp

这个时候访问一下localhost:32771应该就能看到NGINX的欢迎页面了。

5,实际应用。

1,准备工作。

准备好程序所需要的各种包以及配置。

$ ls
Dockerfile nginx.conf run.sh     typecho

Dockerfile

$ cat Dockerfile
FROM    registry.cn-hangzhou.aliyuncs.com/eryajf/lnmp:1.4

MAINTAINER eryajf <Linuxlql@163.com>

COPY typecho/ /home/wwwroot/typecho
COPY nginx.conf /usr/local/nginx/conf

ADD   run.sh  /

EXPOSE 80
EXPOSE 3306

ENTRYPOINT [ "sh", "-c", "/run.sh" ]

nginx.conf

user  www www;
worker_processes auto;
error_log  /home/wwwlogs/nginx_error.log  crit;
pid        /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
daemon off;
events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }
http
    {
        include       mime.types;
        default_type  application/octet-stream;
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;
        sendfile   on;
        tcp_nopush on;
        keepalive_timeout 60;
        tcp_nodelay on;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";
        #limit_conn_zone $binary_remote_addr zone=perip:10m;
        ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
        server_tokens off;
        access_log off;
server
    {
        listen 80 default_server;
        #listen [::]:80 default_server ipv6only=on;
        server_name _;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/typecho;
    location ~ .*\.php(\/.*)*$ {
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        include pathinfo.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires      30d;
    }
    location ~ .*\.(js|css)?$ {
        expires      12h;
    }
    }
}

run.sh

$ cat run.sh
#!/bin/bash
chmod -R 777 /home/wwwroot/typecho
#start php
/usr/local/php/sbin/php-fpm
#start mysql
/etc/init.d/mysql start
#start nginx
/usr/local/nginx/sbin/nginx

2,构建应用。

$ docker build -t daohang:1.0 .

构建完成之后,就可以启动了。

$ docker run -itd --name daohang -p 80:80 -p 3306:3306 daohang:1.0

启动之后,访问 localhost/install.php执行安装的步骤,当然,安装的时候,还需要连接上数据库创建一下数据库,然后就能使用了。关于后续的数据库持久化等问题,可自行思考解决。

3,持久化启动。

为了保证服务重启数据不丢失,需要进行一定的持久化操作,目前最重要的内容有两部分,其一是数据库,其二是应用包。

那么在刚刚已经启动的基础上,可以先把数据拷贝出来一份,然后挂载到宿主机,就实现了数据的持久化了。

$ docker cp daohang:/usr/local/mysql/var /data/daohang/data
$ docker cp daohang:/home/wwwroot/typecho /data/daohang/typecho

然后重新以挂载方式启动服务:

$ docker run -itd --name daohang -p 80:80 -p 3306:3306 -v /data/daohang/data:/usr/local/mysql/var -v /data/daohang/typecho:/home/wwwroot/typecho --privileged daohang:1.0

--privileged表示容器内使用root来运行,如果不加这条选项,那么挂载后的MySQL启动将会报错,所以加上这条配置。

如此启动,就能够实现数据的持久化了。

6,镜像下载。

如上过程中涉及到的两个镜像,我都已经打包好上传到了公网,有需要的,可以下载使用。

阿里云地址:

$ docker pull registry.cn-hangzhou.aliyuncs.com/eryajf/lnmp:1.4
$ docker pull registry.cn-hangzhou.aliyuncs.com/eryajf/typecho:1.0

dockerhub地址:

 $ docker pull eryajf/lnmp:1.4
 $ docker pull eryajf/typecho:1.0

weinxin
扫码订阅本站,第一时间获得更新
微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<十一>docker学习笔记–制作lnmp镜像
喜欢 (1)
[如果想支持本站,可支付宝赞助]
分享 (0)
eryajf
关于作者:
学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!

您必须 登录 才能发表评论!