dockerfile->LAMP
Aug 12, 2018 09:54 · 354 words · 2 minute read
简述
dockerfiel可以说是一个用来生成指定image的脚本,可以很方便的迁移,生成新的image.
这里记录一下使用时踩的坑点.
常用指令
- FROM
指定生成的image的基础镜像
示例
FORM ubuntu:16.04
基础镜像可以在Docker store里找.
- RUN 用来执行命令行命令
语法
//shell格式
RUN <命令>
//exec格式
RUN ["可执行文件", "参数1", "参数2"]
具体示例
RUN apt-get update && \
apt-get install -y apache2 software-properties-common && \
LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \
需要注意的是 最好不要将要执行的命令一条条RUN
.推荐写法是使用&&
连接命令.
- COPY
拷贝文件到镜像中
语法
COPY <源路径> <目标路径>
or
COPY ["<源路径1>","<目标路径>"]
示例
将 www目录下的文件copy到容器的/var/www/html目录下(此时dockerfile文件和www目录在同一目录下)
COPY ./web1 /var/www/html
- CMD
和RUN命令相似,
语法
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"]。
示例
CMD ["sh","1.sh"]
详细语法指令在这里,
静默安装mysql
起因
网上有很多的搭建apache+mysql
的dockerfile文章,但是没找到apache+mysql+php
的.所以自己写一个.
编写
apache+php
的很好写,但是在编写mysql
的时候出现了问题.网上的很多都是编译安装的mysql,而我用的apt安装.
在apt安装的过程中需要我们自己设置mysql的用户密码.然而build dockerfile的时候,我们并不能与之交互.
所以要想办法在不用我们设置密码的情况下安装mysql.
方法如下
echo 'mysql-server-5.7 mysql-server/root_password password your_password' | sudo debconf-set-selections
echo 'mysql-server-5.7 mysql-server/root_password_again password your_password' | sudo debconf-set-selections
apt-get install -y mysql-server
apt-get install -y mysql-client
CMD使用问题
在写完dockerfile之后,在最后用了CMD来执行写的shell脚本.shell脚本如下
1.sh
#!/bin/bash
service apache2 start
service mysql start
mysql -uroot -proot -e 'source /web1.sql'
rm -rf /var/www/html/index.html
构造镜像
docker build -t web123 .
然后启动image
docker run -dit web123
然后查看容器,发现并没有启动起来,状态是Exited
.然后又试了很多次,发现只要dockerfile里有CMD
指令,容器就run不起来.
一番折腾后找到原因.
Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,用 upstart/systemd 去启动后台服务,容器内没有后台服务的概念。所以在执行玩cmd命令后就直接退出了.
解决办法
在1.sh后添加如下内容
while true
do
sleep 1
done
添加一个死循环后,命令就不会被退出.
最终的的 1.sh
如下
#!/bin/bash
service apache2 start
service mysql start
mysql -uroot -proot -e 'source /web1.sql'
rm -rf /var/www/html/index.html
while true
do
sleep 1
done
搭建LAMP的dockerfile
dockerfile
#===========================
# 标准镜像,只支持ubuntu和centos
#===========================
FROM ubuntu:16.04
MAINTAINER Yang
#============
# 安装apache2 php软件等
#============
RUN apt-get update && \
apt-get install -y apache2 software-properties-common && \
LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \
apt-get update && \
apt-get install -y \
libapache2-mod-php5.6 \
php5.6 \
php5.6-cli \
php5.6-curl \
php5.6-dev \
php5.6-gd \
php5.6-imap \
php5.6-mbstring \
php5.6-mcrypt \
php5.6-mysql \
php5.6-pgsql \
php5.6-pspell \
php5.6-xml \
php5.6-xmlrpc \
php-apcu \
php-memcached \
php-pear \
php-redis \
&& apt-get clean \
&& rm -fr /var/lib/apt/lists/*
#============
# 安装mysql
#============
RUN apt-get update && \
echo 'mysql-server-5.7 mysql-server/root_password password root' | debconf-set-selections && \
echo 'mysql-server-5.7 mysql-server/root_password_again password root' | debconf-set-selections && \
apt-get -y install mysql-server && \
apt-get -y install mysql-client && \
apt-get clean && \
rm -fr /var/lib/apt/lists/*
#============
# 拷贝文件
#============
COPY ./web1 /var/www/html
COPY ./web1.sql /web1.sql
COPY ./1.sh /1.sh
RUN chmod 755 -R /1.sh
CMD ["sh","1.sh"]
1.sh
#!/bin/bash
service apache2 start
service mysql start
mysql -uroot -proot -e 'source /web1.sql'
rm -rf /var/www/html/index.html
while true
do
sleep 1
done
参考链接