dockerfile->LAMP

Aug 12, 2018 09:54 · 354 words · 2 minute read Linux

简述

dockerfiel可以说是一个用来生成指定image的脚本,可以很方便的迁移,生成新的image.

这里记录一下使用时踩的坑点.

常用指令

  1. FROM

指定生成的image的基础镜像

示例

FORM ubuntu:16.04

基础镜像可以在Docker store里找.

  1. 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.推荐写法是使用&&连接命令.

  1. COPY

拷贝文件到镜像中

语法

COPY  <源路径> <目标路径>

or

COPY ["<源路径1>","<目标路径>"]

示例

将 www目录下的文件copy到容器的/var/www/html目录下(此时dockerfile文件和www目录在同一目录下)

COPY ./web1 /var/www/html

  1. 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


参考链接

https://blog.csdn.net/fickyou/article/details/50960444

http://xiaorui.cc/2015/01/09/%E9%80%9A%E8%BF%87%E4%BF%A1%E5%8F%B7%E8%A7%A3%E5%86%B3docker%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8%E5%90%8Eexited%E9%80%80%E5%87%BA%E7%9A%84%E9%97%AE%E9%A2%98/

https://codeday.me/bug/20170928/78022.html

tweet Share