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