道者编程

centos7安装docker,以及php、nginx、mysql环境(二)

先熟悉第一篇,第一篇是基础:centos7安装docker,以及php、nginx、mysql环境(一)

第一篇讲了一些docker的基本认知,以及通过pull安装应用,这章记录一下通过dockerfile方式,区别:  拿nginx来说:pull nginx,相当于 yum install nginx ,而dockerfile nginx 相当于configure nginx,自定义编译。

一:NGINX

1:创建dockerfile文件

为了便于统一管理,我们在这里创建一个docker目录:用于存放dockerfile文件,/usr/local/docker/

/usr/local/docker/nginx

/usr/local/docker/php 

/usr/local/docker/mysql

$ cd /usr/local/docker/nginx
$ touch Dockerfile #创建文件

2:dockerfile文件内容

#基础镜像,仓库名:alpine,版本:3.9
FROM alpine:3.9

#nginx版本和链接
ENV NGINX_VERSION nginx-1.15.10
ENV NGINX_SOURCE http://nginx.org/download/nginx-1.15.10.tar.gz

#作者信息
LABEL NGINX Docker Maintainers "2421102982@qq.com"

#修改源
RUN echo "https://mirrors.aliyun.com/alpine/v3.9/main/" > /etc/apk/repositories && \
	echo "https://mirrors.aliyun.com/alpine/v3.9/community/" > /etc/apk/repositories

# 更新
RUN apk update

#安装插件
RUN apk add --no-cache --virtual .build-deps \
		gcc \
		libc-dev \
		make \
		openssl-dev \
		pcre-dev \
		zlib-dev \
		linux-headers \
		curl \
		gnupg1 \
		libxslt-dev \
		gd-dev \
		geoip-dev \
	#下载nginx到本地
	&& curl -fSL $NGINX_SOURCE -o $NGINX_VERSION.tar.gz \
	#新建一个目录存放nginx
	&& mkdir -p /usr/src \
	#解压
	&& tar -zxC /usr/src -f $NGINX_VERSION.tar.gz \
	#删除压缩包
	&& rm $NGINX_VERSION.tar.gz \
	#进入解压后的nginx中
	&& cd /usr/src/$NGINX_VERSION \
	#编译安装
	&& ./configure \
		--prefix=/usr/local/nginx \
		--with-http_stub_status_module \
		--with-http_ssl_module \
	&& make \
	&& make install
#打开 80 443端口,并不创建docker和宿主主机的映射,可以看成是一个标签,映射需要 run -p 
EXPOSE 80 443
# 启动容器的时候执行nginx启动命令,CMD命令只能一条,如果有多条,只有最后一条起作用
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

alpine:为Linux其中的一个版本,这个镜像的特点是小巧,只有几M左右。

3:创建镜像

$ cd /usr/local/docker/nginx #进入到此Dockerfile
# 创建,注意后面有个 . -t: 镜像的名字及标签:name:tag,自己取名
$ docker build -t alpine:nginx . 

我这里执行过程中报了一个问题:

这个提示很明显,Dockerfile中的阿里源有问题,我这里干脆把阿里源去掉,慢就慢点吧,当然也可以试试其他能够用的国内源。 

3:查看镜像

root@cjs-PC:/usr/local/docker/nginx# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              nginx               c7db8a98dc04        About an hour ago   219MB
alpine              3.9                 5cb3aa00f899        3 weeks ago         5.53MB

这里有两个镜像,第一行镜像就是我们第二部:build -t alpine:nginx 取的名字,仓库名:alpine,版本tag:nginx。第二行:是我们Dockerfile文件中的第一行,FROM设置的。

4启动:

先创建一个网络,我们的php,nginx,mysql都在这个网络中。

$ docker network create lnmpnet

挂载目录,把配置文件目录复制到宿主系统:

$ docker cp nginx:/usr/local/nginx/conf /usr/local/docker/nginx
运行创建容器:

$ docker run --name nginx -p 80:80 \
--network lnmpnet \
-v /usr/local/www:/usr/local/nginx/html \
-v /usr/local/nginx/conf:/usr/local/docker/nginx/conf \
-d alpine:nginx

 编写Dockerfile的时候 EXPOSE 开启了端口,为什么这里run的时候还要 -p 端口?这张图说的很明白。


二:Mysql

安装NGINX的时候,安装包是从网上拉下来的,我这里选择二进制通用安装版,这个版本解压初始化就可以用。mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz

1:创建dockerfile文件

$ cd /usr/local/docker/mysql
$ touch Dockerfile #创建文件

2:在主机上创建一个my.cnf,通用二进制版本没这个文件,需要自己创建,然后dockerfile文件复制到容器中去。我们的mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz和my.cnf文件都在install目录下,install和Dockerfile同级目录



[mysqld]                                       #服务端设置
character-set-server=utf8                      #默认编码           
basedir=/usr/local/mysql                       #安装目录
datadir=/var/lib/mysql/data                    #MySQL数据目录
socket=/var/lib/mysql/mysql.sock               #客户端程序和服务器之间的本地通讯的套接字文件

[mysqld_safe]                                  #安全配置
log-error=/var/lib/mysql/log/error.log         #错误日志
pid-file=/var/lib/mysql/mysql.pid              #PID文件
   
[client]                                       #客户端设置
socket=/var/lib/mysql/mysql.sock               #本地连接的socket套接字

3:dockerfile文件内容

#基础镜像,仓库名:debian,版本:tretch-slim
FROM debian:stretch-slim

#作者信息
LABEL MYSQL Docker Maintainers "2421102982@qq.com"

#设置免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

RUN apt-get update

#安装插件
RUN apt-get -y install libaio1 numactl libncurses5

#创建 MySQL 用户和组 
RUN groupadd -r mysql && useradd -r -g mysql mysql

#把主机中的MySQL源文件移到容器中
COPY install/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz /tmp/

#my.cnf配置文件复制到容器中
COPY install/my.cnf /etc/
RUN chmod 644 /etc/my.cnf
#解压
RUN tar -zxvf /tmp/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ \
	#删除压缩包
	&& rm /tmp/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz \
	#修改目录名
	&& mv /usr/local/mysql-5.7.25-linux-glibc2.12-x86_64 /usr/local/mysql \
	#创建mysql数据存储目录,这里我放到 /var/lib/mysql 
	&& mkdir -p /var/lib/mysql/data \
	&& mkdir -p /var/lib/mysql/log \
	#创建一个空的错误日志文件
	&& touch /var/lib/mysql/log/error.log \
	#设置目录属性
	&& chown -R root:mysql /usr/local/mysql \
	&& chown -R mysql:mysql /var/lib/mysql \
	#创建启动脚本
	&& cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld \
	&& chmod +x /etc/init.d/mysqld \
	#初始化数据库,这里会生成密码,但我们设置免密登录,datadir为数据目录
	&& /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data --pid-file=/var/lib/mysql/mysql.pid --socket=/var/lib/mysql/mysql.sock

VOLUME /var/lib/mysql
EXPOSE 3306
CMD ["/usr/local/mysql/bin/mysqld_safe"]

4:构建:docker build -t debian:mysql . 

5:启动容器:

log,data,my.cnf都挂载到 /usr/local/docker/mysql

docker run --name mysql5.7 -p 3306:3306 \
--network lnmpnet \
-v /var/lib/mysql:/usr/local/docker/mysql \
-v /etc/my.cnf:/usr/local/docker/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=123 -d debian:mysql
 


最新评论:
我要评论:

看不清楚