学习了dockerfile构建lnmp和多容器构建lnmp。不停的删除,重新构建,测试。记录一下
同一个容器利用dockerfile构建lnmp
docker search images 但是我一般使用 https://hub.docker.com/r/libr... 里面找镜像。
新建一个dockerfile文件,写入
FROM ubuntu:16.04
MAINTAINER cp
RUN apt-get update && \
apt-get install nginx
EXPOSE 80
在dockerfile1所在的目录下,运行docker build -t lnp:v1 .
我当时使用dockerfile1结果跑错了,必须使用dockerfile这个名字,否则需要通过-f 指定文件
docker中ubuntu更新软件的速度太慢了 多加一行命令,将ubuntu中源换成国内的
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
切换成中国区的源。
之后又出现了这个Do you want to continue? [Y/n] Abort.
是因为有些软件安装会出现交互。
运行之后发现问题,每一次运行完成之后,就立即退出。
docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出。
所以之前使用nginx restart命令也会导致nginx容器停止。Docker容器后台运行,就必须有一个前台进程。
搭建php支持
每一次重新build都要下载依赖有点慢。所以重新根据ubuntu 16.04 构建了一个ubuntu:v1。
FROM ubuntu:v1
MAINTAINER cp
RUN apt-get install -y nginx && \
apt-get install -y php7.0-fpm
COPY ./default /etc/nginx/sites-available/default
CMD service php7.0-fpm start && nginx -g 'daemon off;'
EXPOSE 80
使用COPY命令将nginx配置文件和php的配置文件添加到进去。
安装mysql
安装过程中测试了apt-get install -y mysql-server-5.7,出现了提示要求输入密码,但是就卡住了
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server-5.7
文件是docker构建的原因的chown -R mysql:mysql /var/lib/mysql,让mysql可以读写。
mysql默认是MYSQL_ONETIME_PASSWORD,所以使用mysql 直接进入,然后马上修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
正常的安装apt-get php-mysql 即可访问。
注意
docker 容器日志输出问题
只有主进程 (pid 为1)的相关进程日志会输出到 stdout
完整的构建
FROM ubuntu:v1
MAINTAINER cp
RUN apt-get install -y nginx && \
apt-get install -y php7.0-fpm
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server-5.7
COPY ./default /etc/nginx/sites-available/default
CMD chown -R mysql:mysql /var/lib/mysql && service mysql start && service php7.0-fpm start && nginx -g 'daemon off;'
EXPOSE 80
多容器利用--link构建lnmp
--link 是通过/etc/hosts来进行绑定的。
直接使用现成的镜像
docker pull php:7.0-fpm
docker pull mysql:5.6
docker pull nginx
首先运行mysql
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root --name test_mysql mysql:5.6
再运行php
docker run -d -p 9001:9000 -v /Users/chenpei/PHP:/usr/share/nginx/html --name test_php --link test_mysql php:7.0-fpm
fast-cgi协议是传递脚本名给fpm,所以也要去挂载目录。
php容器运行还需要相应的php-mysql扩展,但是要安装docker-php-ext-install mysqli pdo pdo_mysql
最后运行nginx
docker run -d -p 8088:80 -v /Users/chenpei/PHP:/usr/share/nginx/html --name test_nginx --link test_php nginx:latest
修改一下配置文件,重启
fastcgi_pass test_php:9000
常用命令
docker search image 搜索可用的镜像
docker build image . 通过dockerfile构建镜像
docker build -t image:tag . 通过dockerfile构建镜像
FROM 基础镜像
MAINTAINER 维护者,或者创建者
COPY 复制到容器中
ADD 功能和COPY差不多
EXPOSE 申明暴露端口
RUN 用来执行命令
CMD 容器启动后默认执行的命令及其参数,dockerfile中只能有一个
ENV 设置环境变量
ARG 构建参数,容器运行时,是不会保存环境变量
VOLUME 为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
WORKDIR 相当于cd命令,主要是因为docker分层概念
USER 指定当前用户
ONBUILD 下面的指令RUN等等,只有构建下一级镜像的时候才会被执行
HEALHCHECK 健康检查