Dockerfile二进制分离部署LNMP(Centos7)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile二进制分离部署LNMP(Centos7)相关的知识,希望对你有一定的参考价值。
Dockerfile常用指令:
1、FROM:构建镜像基于哪个镜像
例如:FROM centos
2、MAINTAINER:镜像维护者姓名或邮箱地址
例如:MAINTAINER Sun qiu ming
3、RUN:构建镜像时运行的shell命令
例如:
RUN [ "yum","install","httpd"]
RUN yum -y install httpd
4、CMD:运行容器时执行的shell命令
例如:
CMD ["/bin/bash"]
5、EXPOSE声明容器的服务端口
例如:EXPOSE 80 443
EXPOSE 声明端口
格式为 EXPOSE <端口1> [<端口2>...]。
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
6、ENV : 设置容器环境变量
例如:ENV mysql_ROOT_PASSWORD 123.com
7、ADD:拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压
ADD <源文件> ...<目的目录>
ADD ["源文件"..."目的目录"]
例如:
ADD https://xxx.com/html.tar.gz /var/www/html
ADD html.tar.gz /var/www/html
8、COPY :拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
例如:COPY ./start.sh /start.sh
9、ENTRYPOINT:运行容器是执行的shell命令
例如:
ENTRYPOINT ["/bin/bash","-c","/start.sh"]
ENTRYPOINT /bin/bash -c ‘/start.sh‘
10、VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器
例如:
VOLUME ["/var/lib/mysql"]
11、USER :为RUN、CMD、和ENTRYPOINT执行命令指定运行用户
USER <user>[:<group>] OR USER <UID>[:<GID>]
例如:
USER sunpengjun
12、WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
例如:
WORKDIR /data
13、HEALTHCHECK:健康检查
14、ARG:构建时指定一些参数
例如:
FROM centos
ARG user
USER $user
注意
1、RUN在building时运行,可以写多条
2、CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效。
3、CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定--entrypoint覆盖。
Docker缓存特性:
如果在相同层中,需要用到之前缓存过的镜像,就无需重新下载。但如果此镜像层上层发生变化,即使是在相同层,也用不了缓存。如果非要不使用缓存可以加上--no-cache参数。
Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。
也就是说,如果我们改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。
Dockerfile的优势:
通过dockerfile制作镜像,能够很明显的看到镜像每一层的操作,安全性高,并且可移植操作性强。
Dockerfile分离部署LNMP(二进制安装):
提示:需要事先将nginx,php,mysql所需的安装包下载到本地(结构目录如下)。
准备部署工作:
1,解决容器固定ip地址问题:
保证容器重启后,ip地址不会改变,且方便管理和操作。
1)自定义网络:
[root@sqm-docker01 nginx]# docker network create -d bridge --subnet 172.16.10.0/24 --gateway 172.16.10.1 mynet1
2,创建挂载目录:
网页根目录:/wwwroot
配置文件目录:/docker_conf
[root@sqm-docker01 nginx]# mkdir /wwwroot
[root@sqm-docker01 nginx]# mkdir /docker_conf
部署nginx:
[root@sqm-docker01 ~]# vim Dockerfile
代码如下:
FROM centos:7
ADD nginx-1.8.0.tar.gz /
ADD nginx-sticky-module.zip /
ADD ngx_cache_purge-2.3.tar.gz /
RUN yum -y install gcc* pcre-devel openssl-devel zlib-devel unzip make vim net-tools elinks tree && groupadd nginx && useradd nginx -g nginx -s /sbin/nologin
WORKDIR nginx-1.8.0/
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre
--add-module=../ngx_cache_purge-2.3
--with-http_flv_module
&& make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && mkdir -p /var/tmp/nginx/client/ && chown -R nginx /var/tmp/nginx/client/ && sed -i -e ‘s/nobody/nginx/‘ -e ‘2s/^#//‘ /usr/local/nginx/conf/nginx.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
//构建nginx镜像:[root@sqm-docker01 nginx]# docker build -t nginx .
注意:名称不能有大写及特殊字符,最后的.表示在当前目录下的dockerfile文件,且一个目录下只能存在一个dockerfile。
//运行nginx容器:
[root@sqm-docker01 mysql]# docker run -itd --name nginx1.8.0 --network mynet1 --ip 172.16.10.10 --restart=always -p 80:80 nginx
部署php-fpm:
[root@sqm-docker01 php]# vim Dockerfile
代码如下:
FROM centos:7
ADD libmcrypt-2.5.7.tar.gz /
ADD php-5.6.27.tar.gz /
RUN yum -y install gcc* pcre-devel zlib-devel tree unzip make vim net-tools elinks libxml2-devel libcurl-devel openssl-devel bzip2-devel
WORKDIR /libmcrypt-2.5.7/
RUN ./configure --prefix=/usr/local/libmcrypt && make && make install && cd /php-5.6.27 && ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts && make && make install && cp php.ini-production /etc/php.ini && cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && chmod +x /etc/init.d/php-fpm && chkconfig --add php-fpm && chkconfig php-fpm on && cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf && sed -i -e ‘s/;daemonize = yes/daemonize = no/g‘ -e ‘s/127.0.0.1/0.0.0.0/g‘ /usr/local/php5.6/etc/php-fpm.conf
EXPOSE 9000
CMD ["/usr/local/php5.6/sbin/php-fpm","-c","/usr/local/php5.6/etc/php-fpm.conf"]
//构建php-fpm镜像:[root@sqm-docker01 php]# docker build -t php-fpm .
//运行php容器:
[root@sqm-docker01 mysql]# docker run -itd --name php-fpm --network mynet1 --ip 172.16.10.20 --restart=always -p 9000:9000 php-fpm
部署mysql5.7.28:
[root@sqm-docker01 mysql]# vim Dockerfile
代码如下:
FROM centos:7
RUN yum -y install gcc* zlib-devel make vim net-tools cmake bison ncurses-devel gcc gcc-c++ pcre pcre-devel openssl openssl-devel libaio initscripts
ADD boost_1_59_0.tar.gz /opt
ADD mysql-5.7.28.tar.gz /opt
WORKDIR /opt/mysql-5.7.28
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 -DWITH_BOOST=/opt/boost_1_59_0 -DMYSQL_UNIX_ADDR=/data/mysql/tmp/mysql.sock -DMYSQL_DATADIR=/data/mysql -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_INNODB_MEMCACHED=1 -DWITH_DEBUG=OFF -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DENABLED_PROFILING=ON -DMYSQL_MAINTAINER_MODE=OFF -DMYSQL_TCP_PORT=3306 && make && make install
RUN ln -s /usr/local/mysql-5.7.28 /usr/local/mysql && echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile && echo "export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH" >> /etc/profile && source /etc/profile && mkdir -p /data/mysql/{data,tmp,logs,pids,share} && touch /data/mysql/logs/mysqld.log && touch /data/mysql/pids/mysqld.pid && useradd -s /sbin/nologin -M mysql && chown -R mysql:mysql /data/mysql
COPY my.cnf /etc/my.cnf
RUN cd /usr/local/mysql && cp support-files/mysql.server /etc/init.d/mysqld && chmod a+x /etc/init.d/mysqld && chkconfig --add mysqld && chkconfig mysqld on && ln -s /usr/local/mysql/bin/* /usr/local/bin && mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
COPY mysql-start.sh /opt
COPY user.sh /opt
RUN chmod a+x /opt/mysql-start.sh && chmod a+x /opt/user.sh
EXPOSE 3306
CMD ["/opt/mysql-start.sh"]
##dockerfile中的脚本代码如下:
[root@sqm-docker01 mysql]# cat my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
datadir=/data/mysql/data
socket=/data/mysql/tmp/mysql.sock
[mysqld_safe]
log-error=/data/mysql/logs/mysqld.log
pid-file=/data/mysql/pids/mysqld.pid
[client]
default-character-set=utf8mb4
[root@sqm-docker01 mysql]# cat mysql-start.sh
#!/bin/bash
chown -R mysql:mysql /data/mysql
/sbin/service mysqld start
/bin/bash #保留一个终端,防止容器自动退出
//修改数据库密码并授权用户:
[root@sqm-docker01 mysql]# cat user.sh
#!/bin/bash
mysqlpwd=` grep password /data/mysql/logs/mysqld.log | awk -F ‘root@localhost: ‘ ‘{print $2}‘`
mysql -uroot -p${mysqlpwd} -e ‘alter user root@localhost identified by"pwd@123"‘ --connect-expired-password
mysql -u root -ppwd@123 <<EOF
create database mysqldb;
grant all on mysqldb.* to user1@‘%‘ identified by ‘123.com‘;
EOF
###构建mysql镜像:[root@sqm-docker01 mysql]# docker build -t mysql .
//运行mysql容器:[root@sqm-docker01 mysql]# docker run -itd --name mysql5.7.28 --network mynet1 --ip 172.16.10.30 --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd@123 mysql
//执行容器中的脚本(修改数据库密码)[root@sqm-docker01 mysql]# docker exec mysql5.7.28 sh /opt/user.sh
//测试登陆mysql数据库:
用user1用户进行测试,因为root用户我只设置了允许mysql服务器本机登陆,其他主机没有权限。(需要在dockerhost上下载mysql客户端)
[root@sqm-docker01 mysql]# yum -y install mysql
[root@sqm-docker01 mysql]# mysql -u user1 -p123.com -h 127.0.0.1 -P 3306
配置nginx-php-mysql相互解析:
1)修改nginx配置文件:
将nginx存放配置文件的目录copy到dockerhost:
[root@sqm-docker01 ~]# docker cp nginx1.8.0:/usr/local/nginx/conf /docker_conf/
[root@sqm-docker01 conf]# vim nginx.conf
修改内容如下:
2)创建测试解析php的网页:
同样将nginx的网页目录拷贝到主机:
[root@sqm-docker01 ~]# docker cp nginx1.8.0:/usr/local/nginx/html /wwwroot/
[root@sqm-docker01 ~]# cd /wwwroot/html/
[root@sqm-docker01 html]# cat > test.php <<EOF
> <?php
> phpinfo();
> ?>
> EOF
3)将dockerhost上的目录挂载到容器内:
//我们需要将nginx和php容器删除掉,重新运行并且挂载,其实在上边构建完服务,不用先运行服务,可以现在运行,我是为了测试是否安装成功。当然你也可以从一开始就可以编写好网页文件,直接挂载。
[root@sqm-docker01 html]# docker rm -f nginx1.8.0
[root@sqm-docker01 html]# docker run -itd --name nginx1.8.0 --network mynet1 > --ip 172.16.10.10 --restart=always -p 80:80 > -v /docker_conf/conf/:/usr/local/nginx/conf/ -v /wwwroot/html/:/usr/local/nginx/html nginx
[root@sqm-docker01 ~]# docker rm -f php-fpm
[root@sqm-docker01 ~]# docker run -itd --name php-fpm --network mynet1 > --ip 172.16.10.20 --restart=always -p 9000:9000 > -v /wwwroot/html/:/usr/local/nginx/html/ php-fpm
测试访问nginx和php解析页面:
搭建wordpress测试lnmp环境:
1)下载wordpress安装包到网页根目录下:
[root@sqm-docker01 ~]# cd /wwwroot/html/
[root@sqm-docker01 html]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
//下载完,将安装包进行解压:
[root@sqm-docker01 html]# tar zxf wordpress-4.7.4-zh_CN.tar.gz
2)浏览器测试访问:
登陆成功,lnmp搭建完毕。。。。。。。。
———————— 本文至此结束,感谢阅读 ————————
以上是关于Dockerfile二进制分离部署LNMP(Centos7)的主要内容,如果未能解决你的问题,请参考以下文章
Dockerfile构建LNMP分离环境部署wordpress
DockerFile部署lnmp+memcached+redis+mongodb开发环境for Memcached