Docker笔记之制作lnmp镜像
有时候有一些 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
2
3
4
5
经过简单初始选项,就进入了安装阶段。
特别注意1:
这个地方 MySQL 的密码为root
,而且开启了远程登录,以便于后边映射出去之后方便远程登录。特别注意2:
我把这里的 NGINX 启动方式,改成了前台启动,以便于后边最终镜像的制作。
等待一会儿,一个完整的 lnmp 环境就安装好了,然后精简一下当前镜像当中的内容,把不要的东东都删掉,然后把这个镜像保存成一个基础镜像。
$ docker commit eryajf lnmp:0.1
# 3,最终镜像。
上边保存了一个 lnmp:0.1
的镜像,此时还不能作为一个常规镜像来使用,因为刚刚 commit 保存的镜像并不会保存应用的状态,因此我们需要在此基础之上,利用 Dockerfile 进行简单的改造。
$ mkdir lnmp
$ cd lnmp
2
Dockerfile:
$ cat Dockerfile
FROM lnmp:0.1
MAINTAINER eryajf <Linuxlql@163.com>
ADD run.sh /
EXPOSE 80
EXPOSE 3306
ENTRYPOINT [ "sh", "-c", "/run.sh" ]
2
3
4
5
6
7
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
2
3
4
5
6
7
8
然后就可以构建最终的镜像了。
$ 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
2
3
这个时候访问一下localhost:32771
应该就能看到 NGINX 的欢迎页面了。
# 5,实际应用。
# 1,准备工作。
准备好程序所需要的各种包以及配置。
$ ls
Dockerfile nginx.conf run.sh typecho
2
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" ]
2
3
4
5
6
7
8
9
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;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
3
4
5
6
7
8
9
# 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
2
然后重新以挂载方式启动服务:
$ 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
2
dockerhub 地址:
$ docker pull eryajf/lnmp:1.4
$ docker pull eryajf/typecho:1.0
2