GVKun编程网logo

Docker 利用 Dockerfile 构建 tomcat7-jdk8 环境(dockerfile部署tomcat)

4

本文将分享Docker利用Dockerfile构建tomcat7-jdk8环境的详细内容,并且还将对dockerfile部署tomcat进行详尽解释,此外,我们还将为大家带来关于4、Docker学习,

本文将分享Docker 利用 Dockerfile 构建 tomcat7-jdk8 环境的详细内容,并且还将对dockerfile部署tomcat进行详尽解释,此外,我们还将为大家带来关于4、Docker 学习,DockerFile 自定义 Tomcat、CentOS 环境中使用 Dockerfile 创建 Tomcat+JDK 镜像、centos7系统下构建docker镜像文件(jdk7+tomcat7)、Docke--Dockerfile 构建LNMP环境的相关知识,希望对你有所帮助。

本文目录一览:

Docker 利用 Dockerfile 构建 tomcat7-jdk8 环境(dockerfile部署tomcat)

Docker 利用 Dockerfile 构建 tomcat7-jdk8 环境(dockerfile部署tomcat)

Dockerfile 构建 tomcat7-jdk8 环境

Dockerfile 常用命令

(1) FROM: 制作image时依据的基本image
(2) RUN:制作image时执行的命令,一般在Dockerfile中多次出现
(3) CMD:启动docker时执行的命令,在Dockerfile中只出现一次
(4) ENV:设置环境变量
(5) COPY:制作image时,将文件系统中的文件复制到Docker镜像中
(6) WORKDIR:设置工作目录
(7) EXPOSE:设置向外暴露的端口
(8) VOLUME:设置容器与外界映射的目录
[1].创建dockerfile存放目录
mkdir -p /app/Docker/Tomcat
cd /app/Docker/Tomcat/

[2].编写Dockerfile文件
cat>/app/Docker/Tomcat/Dockerfile<<EOF
FROM centos
#指定基础镜像来自于哪里
MAINTAINER Tomcat7 images
#进行说明
ADD jdk1.8.0_144/ /opt/jdk
#添加jdk
ADD apache-tomcat-7.0.75 /opt/tomcat
#添加tomcat
#COPY xxx.war /opt/tomcat/webapps/
#war包可进行挂在或者直接拷贝
EXPOSE 8080
#开发端口
RUN /usr/bin/sed -i ''107a JAVA_HOME=/opt/jdk'' /opt/tomcat/bin/catalina.sh
#配置环境变量
CMD ["/bin/bash","-c","/opt/tomcat/bin/catalina.sh run"]
#开启Tomcat
EOF


[3].构建镜像
docker build -t tomcat7:01 /app/Docker/Tomcat

[4].启动容器
docker run -d --name "math_tomcat01" -p8080:8080 tomcat7:01
docker ps


[5].测试,并查看日志
测试:curl 127.0.0.1:8080 -I
查看日志:docker logs -f math_tomcat01


[6].查看负载
docker stats tomcat01

[7]. 利用数据方式启动

mkdir -p /app/tomcat
cd /app/tomcat
docker run -d --name "tomcat01" tomcat:01
#拷贝出需要后续配置的文件(保持与镜像内文件格式相同)
docker cp -a tomcat01:/opt/tomcat/webapps ./
docker cp -a tomcat01:/opt/tomcat/logs ./
docker cp -a tomcat01:/opt/tomcat/bin ./
docker cp -a tomcat01:/opt/tomcat/conf ./
docker rm -f tomcat01
echo "欢迎使用tomcat7-jdk8">>/app/data/tomcat/webapps/ROOT/index.html
创建数据卷:
docker run --name "web_data" -v /app/data/tomcat/webapps:/opt/tomcat/webapps  -v /app/data/tomcat/bin:/opt/tomcat/bin -v /app/data/tomcat/conf:/opt/tomcat/conf -v /app/data/tomcat/logs:/opt/tomcat/logs centos
创建tomcat容器启动:
docker run -d -p8080:8080 --name "tomcat" --volumes-from web_data tomcat:01

 

 

 

 

4、Docker 学习,DockerFile 自定义 Tomcat

4、Docker 学习,DockerFile 自定义 Tomcat

Docker 学习

一、DockerFile 自定义 Tomcat9

测试下面的两个保留字指令

3.7》、ADD  将宿主机目录下的文件拷贝进镜像且ADD命令自动处理URL和解压tar压缩包 
           ADD  centos-7-docker.tar.xz    
           (COPY直接拷贝,ADD拷贝+解压缩)
3.8》、COPY  类似ADD,拷贝文件和目录到镜像中             
           COPY src  descCOPY["src","desc"]

案例:

1、创建tomcat9目录   mkdir tomcat9
2、创建文件  touch c.txt
3、将JDK和tomcat安装包的压缩包拷贝进上一步目录
	apache-tomcat-9.0.8.tar.gz
	jdk-8u171-linux-x64,tar.gz
4、在tomcat9下新建Dockerfile文件,目录内容:
	FROM centos
	MAINTAINER mytomcat_lee<james_taylor@126.com>
    #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
    COPY c.txt /usr/local/cincontainer.txt
    #把java与tomcat添加到容器中
    ADD jdk-8u171-linux-x64,tar.gz
    ADD apache-tomcat-9.0.8.tar.gz
    #安装vim编辑器
   	RUN yum -y install vim
    #设置工作访问时候的workdir路径,登录落脚点
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    #配置java与tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk1.8.0_171
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
    ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
	#容器运行时监听的接口        
    EXPOSE 8080
    #启动运行tomcat
    #ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
    #CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
    CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
        
5、构建build镜像
        docker build Dockerfile -t mytomcat9 .
        (-f 目录file )
6、测试docker images
7、运行 
    docker run -d -p 9080:8080 --name myt9 
    -v /opt/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test 
    -v /opt/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs 
    --privileged=true 
    mytomcat9
        (--privileged=true是防止-v挂载容器卷的时候写权限不够而添加的)
8、docker ps
9、http://localhost:9080
10、在/opt/tomcat9/test下扔一个项目 测试下myt9是否可以跑
11、docker restart myt9 重启容器

CentOS 环境中使用 Dockerfile 创建 Tomcat+JDK 镜像

CentOS 环境中使用 Dockerfile 创建 Tomcat+JDK 镜像

环境准备:

  1. VMware 下安装 CentOS,安装 Docker 并从公共镜像仓库中下载 CentOS 的镜像到本地仓库

  2. 从 tomcat 和 oracle 官网下载 jdk-8u171-linux-x64.rpm 和 apache-tomcat-7.0.77.tar.gz

  3. 上传到 CentOS 虚拟机的工作目录:如 /root/software/

  4. 上传工程到工作目录,示例中创建的是一个 hello.html

创建 Dockerfile

 创建文件 /root/software/Dockerfile, 内容如下:

FROM centos:7.2.1511
MAINTAINER sjg
WORKDIR /home
#上传安装包
ADD jdk-8u171-linux-x64.rpm /home/
#安装JDK
RUN rpm -ivh /home/jdk-8u171-linux-x64.rpm && rm -rf /home/jdk-8u171-linux-x64.rpm
#设置环境变量
ENV JAVA_HOME /usr/java/jdk1.8.0_171-amd64
ENV PATH $PATH:$JAVA_HOME/bin
#安装tomcat
RUN mkdir Tomcat
ADD apache-tomcat-7.0.77.tar.gz /home/
RUN tar zxf /home/apache-tomcat-7.0.77.tar.gz -C /home/Tomcat && rm -rf /home/apache-tomcat-7.0.77.tar.gz
#部署项目
ADD hello.html /home/Tomcat/apache-tomcat-7.0.77/webapps/ROOT/
EXPOSE 8080
#启动容器
ENTRYPOINT /home/Tomcat/apache-tomcat-7.0.77/bin/startup.sh && tail -f /home/Tomcat/apache-tomcat-7.0.77/logs/catalina.out

build Tomcat 镜像

执行:cd /root/software

执行:docker build -t tomcat-sjg:1.0

运行 Tomcat 容器

docker run -d -p 58080:8080 --name mytomcat tomcat-sjg:1.0

查看 hello world 页面

在浏览器中输入:http://[虚拟机地址]:58080/hello.html

 

其他常用命令:

启动 docker 服务:systemctl start docker.service
查看镜像:docker images
查看容器:docker ps -a
进入容器:docker exec -it mytomcat bash
停止容器:docker stop mytomcat 
重启容器:docker start mytomcat 
删除容器:docker rm mytomcat  ---- 必须先 stop
删除镜像:docker rmi tomcat-sjg:1.0
查看容器执行日志:docker logs mytomcat 
 
 

 

Docker 的公共仓库中其实已经提供了 tomcat 镜像,但是 java 环境并不是 oracle JDK。

 

  

 

centos7系统下构建docker镜像文件(jdk7+tomcat7)

centos7系统下构建docker镜像文件(jdk7+tomcat7)

从零开始构建一个centos+jdk7+tomcat7的镜像文件

centos7系统下docker运行环境的搭建

准备centos基础镜像

docker pull centos
或者直接下载我准备好的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/repos_zyl/centos:0.0.1

准备jdk7和tomcat7安装包

  • 创建工作目录, mkdir -p /z/docker
  • 准备下载jdk7的tar.gz包http://download.oracle.com/otn/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz
  • 解压到目录/z/docker下, 并重命名为jdk
  • 准备下载tomcat7的tar.gz包http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.75/bin/apache-tomcat-7.0.75.tar.gz
  • 解压到目录/z/docker下, 并重命名为tomcat
  • 删掉jdk文件夹下多余文件, 降低build的镜像大小
rm -rf /z/docker/jdk/*src.zip \
    /z/docker/jdk/lib/missioncontrol \
    /z/docker/jdk/lib/visualvm \
    /z/docker/jdk/lib/*javafx* \
    /z/docker/jdk/jre/lib/plugin.jar \
    /z/docker/jdk/jre/lib/ext/jfxrt.jar \
    /z/docker/jdk/jre/bin/javaws \
    /z/docker/jdk/jre/lib/javaws.jar \
    /z/docker/jdk/jre/lib/desktop \
    /z/docker/jdk/jre/plugin \
    /z/docker/jdk/jre/lib/deploy* \
    /z/docker/jdk/jre/lib/*javafx* \
    /z/docker/jdk/jre/lib/*jfx* \
    /z/docker/jdk/jre/lib/amd64/libdecora_sse.so \
    /z/docker/jdk/jre/lib/amd64/libprism_*.so \
    /z/docker/jdk/jre/lib/amd64/libfxplugins.so \
    /z/docker/jdk/jre/lib/amd64/libglass.so \
    /z/docker/jdk/jre/lib/amd64/libgstreamer-lite.so \
    /z/docker/jdk/jre/lib/amd64/libjavafx*.so \
    /z/docker/jdk/jre/lib/amd64/libjfx*.so

进入/z/docker目录, 在当前目录下创建Dockerfile文件

cd /z/docker
vi Dockerfile

#插入以下内容
#使用的基础镜像
FROM registry.cn-hangzhou.aliyuncs.com/repos_zyl/centos:0.0.1
#作者信息
MAINTAINER yzzhouyalei "yzzhouyalei@foxmail.com"

#创建目录
RUN mkdir -p /z/java/jdk1.7.0_79
#把当前目录下的jdk文件夹添加到镜像
ADD jdk /z/java/jdk1.7.0_79

#创建tomcat目录
RUN mkdir -p /z/java/apache-tomcat-7.0.70
#把当前目录下的tomcat文件夹添加到镜像
ADD tomcat /z/java/apache-tomcat-7.0.70

#添加环境变量
ENV JAVA_HOME /z/java/jdk1.7.0_79
ENV CATALINA_HOME /z/java/apache-tomcat-7.0.70
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

#暴露8080端口
EXPOSE 8080

#启动时运行tomcat
CMD ["/z/java/apache-tomcat-7.0.70/bin/catalina.sh","run"]

开始构建docker镜像文件

docker build -t repos_local/centos-jdk7-tomcat7:0.0.1 .
-t 后面设置registry名称, 命名规则registry/image:tag
. 表示使用当前目录下的Dockerfile文件

等待构建完成, 不出意外的话, 执行docker images将会得到以下结果

[root@localhost docker]# docker images
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
repos_local/centos-jdk7-tomcat7                      0.0.1               2c5efe7056ce        4 minutes ago       511.7 MB

repos_local/centos-jdk7-tomcat7镜像已经构建好了, 从这个镜像启动容器, 并配置好端口, 就能直接在浏览器上看到tomcat默认界面了

启动centos-jdk7-tomcat7容器

docker run -d -p 8081:8080 --name test-tomcat repos_local/centos-jdk7-tomcat7:0.0.1
-d 后台运行
-p 宿主机port:容器port 端口映射
--name 给容器起名字

直接在浏览器访问centos7系统的8081端口, 已经能看到tomcat的默认界面了

查看container容器的运行状态

[root@localhost docker]# docker ps
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
1a49a277c235        repos_local/centos-jdk7-tomcat7:0.0.1   "/z/java/apache-tomca"   3 minutes ago       Up 3 minutes        0.0.0.0:8081->8080/tcp   test-tomcat

到这里, 在centos7系统下构建docker镜像文件已经成功

Docke--Dockerfile 构建LNMP环境

Docke--Dockerfile 构建LNMP环境

Dockerfile 构建nginx并结合php

1、构建基础镜像

先构建一个基础镜像,添加repo的环境和编译的环境,而centos镜像就是初始的官方镜像,后面构建php、nginx、mysql都使用该镜像为base image:

[root@server myCentos]# cat Dockerfile   #查看Dockerfile文件
# base image
FROM centos:centos7.3.1611

# MAINTAINER
MAINTAINER 381347268@qq.com

# add epel and 163 yum
RUN yum install wget epel-release -y \
    && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back \
    && wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo \
    && wget -P /etc/yum.repos.d/ http://mirrors.163.com/.help/CentOS7-Base-163.repo \
    && yum clean all && yum makecache

# Necessary packages
RUN yum install -y  wget gcc gcc-c++ glibc make autoconf openssl openssl-devel ntpdata crontabs

# change timzone to Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@server myCentos]# docker build -t centos:v1 .  #构建镜像取名为centos:v1
[root@server myCentos]# docker images  #构建完成后查看该镜像
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos              v1                  cca50f986518        About a minute ago   665MB

查看nginx和php的目录结构:

[root@server ~]# tree nginx
nginx
├── Dockerfile
├── fastcgi_params
├── nginx-1.8.1.tar.gz
├── nginx.conf
└── www.conf
[root@server ~]# tree php
php
├── Dockerfile
├── libmcrypt-2.5.8.tar.gz
├── php-5.6.35.tar.gz
├── php-fpm.conf.default
└── php.ini-production

这里详细描述下nginx和php的构建过程,已经构建过程中用到的所有工具包和配置文件

2、构建nginx镜像

首先构建nginx镜像,查看nginx的Dockerfile:

[root@server nginx]# cat Dockerfile 
# base image
FROM centos:v1

MAINTAINER 381347268@qq.com

RUN useradd -M -s /sbin/nologin www
ADD nginx-1.8.1.tar.gz /usr/local/src

# install Dependency package
RUN yum install libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel libxml2 libxml2-dev libxslt-devel

WORKDIR /usr/local/src/nginx-1.8.1

# make && make install
RUN ./configure --user=www --group=www --prefix=/usr/local/nginx --with-file-aio --with-ipv6 --with-http_ssl_module  --with-http_spdy_module --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install

# configure
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY fastcgi_params /usr/local/nginx/conf/fastcgi_params
RUN mkdir /usr/local/nginx/conf/conf.d
COPY www.conf /usr/local/nginx/conf/conf.d/www.conf

EXPOSE 80

CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

这里nginx采用了编译安装,创建了用户www和安装了nginx的一些依赖包,copy了一些配置文件到镜像中。详细配置文件参考:

通过Dockerfile构建nginx镜像:

[root@server nginx]# docker build -t nginx:v1 .  #构建nginx镜像,tag为v1
[root@server nginx]# docker images   #查看构建完成的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  c1c90aaefa1e        33 seconds ago      752MB
centos              v1                  cca50f986518        2 hours ago         665MB

特别说明下配置文件:

[root@server nginx]# cat www.conf 
server {
    listen   80;
    root /usr/local/nginx/html;
    index index.htm index.html index.php;
    location ~ \.php$ {
        root /usr/local/nginx/html;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

可以发现fastcgi_pass php:9000;

这是因为php也是一个容器,和nginx是隔离的,后面启动容器的时候nginx将会通过--link的方式与镜像进行互联访问

3、构建php镜像

查看php的Dockerfile:

[root@server php]# cat Dockerfile 
# base image
FROM centos:v1

MAINTAINER 381347268@qq.com

ADD libmcrypt-2.5.8.tar.gz /usr/local/src

WORKDIR /usr/local/src/libmcrypt-2.5.8
RUN ./configure && make && make install

ADD php-5.6.35.tar.gz /usr/local/src

RUN yum -y install libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel

WORKDIR /usr/local/src/php-5.6.35
RUN ./configure --prefix=/usr/local/php --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-mcrypt --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-config-file-path=/usr/local/php/etc --with-bz2 --with-gd && make && make install


COPY php.ini-production /usr/local/php/etc/php.ini
COPY php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

RUN useradd -M -s /sbin/nologin php
RUN sed -i -e ''s@;pid = run/php-fpm.pid@pid = run/php-fpm.pid@g'' -e ''s@nobody@php@g'' -e ''s@listen = 127.0.0.1:9000@listen = 0.0.0.0:9000@g'' /usr/local/php/etc/php-fpm.conf
RUN sed -i ''s@;daemonize = yes@daemonize = no@g'' /usr/local/php/etc/php-fpm.conf


EXPOSE 9000

CMD ["/usr/local/php/sbin/php-fpm"]

构建的服务必须运行在前台,而对于nginx来说:daemon off 表示将后台运行关闭了,于是运行在前台

而对于php:sed -i ''s@;daemonize = yes@daemonize = no@g'' /usr/local/php/etc/php-fpm.conf

这里也是将daemon模式关闭了,于是/usr/local/php/sbin/php-fpm 运行在前台

通过Dockerfile构建php镜像:

[root@server php]# docker build -t php:v1 .  #构建php镜像,tag为v1
[root@server php]# docker images  #查看构建完成的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 v1                  2019612cc0a4        35 seconds ago      1.19GB
nginx               v1                  c1c90aaefa1e        About an hour ago   752MB
centos              v1                  cca50f986518        2 hours ago         665M

4、启动nginx容器和php容器

利用构建的镜像启动php、nginx服务:

[root@server php]# docker run -d --name php -v /www:/usr/local/nginx/html php:v1  #启动一个php容器并通过-v进行映射
cf77c85e7c2f63a7ac2db2edaa37d22418503e8cfa35d87b9cfad541d03e004a
[root@server php]# docker run -d --name nginx -p 80:80 -v /www:/usr/local/nginx/html --link=php:php nginx:v1  #启动一个nginx容器并通过-v进行映射及--link进行关联php容器
3bbc12db8e9cc118a7824c5a314d13c4e37f3a6397f32bbfe939f9e424b306e0

上面启动php的容器时,使用了-v进行映射,如果这里不进行映射,那么php的程序会启动,但是遇到php结尾的文件将不会解析,出现file not found的错误

补充:生产环境一般将配置文件、日志文件、web站点目录存放在宿主机,这样方便管理,且如果nginx配置发生改变后,直接docker stop nginx容器名,然后再启动即可。如下启动nginx容器

# docker run -d --name nginx -p 80:80 -v /opt/docker/www:/usr/local/nginx/html -v /docker/NginxConf/:/usr/local/nginx/conf/conf.d -v /docker/log:/usr/local/nginx/logs --link=php:php nginx:v1

查看容器状态:

[root@server php]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
3bbc12db8e9c        nginx:v1            "/usr/local/nginx/sb…"   26 seconds ago      Up 25 seconds               0.0.0.0:80->80/tcp   nginx
cf77c85e7c2f        php:v1              "/usr/local/php/sbin…"   2 minutes ago       Up 2 minutes                9000/tcp             php

在宿主机上到网站目录创建测试文件:

[root@server www]# tree .  #查看网站目录的结构
.
├── index.php
└── test.html
[root@server www]# cat index.php   #查看index.php文件
<?php phpinfo() ?>
[root@server www]# cat test.html   #查看test.html文件
<h1>Hello Docker nginx-php</h1>

访问测试:

进入到php容器查看hosts文件:

[root@server ~]# docker exec -it php /bin/bash  #使用exec进入php容器
[root@cf77c85e7c2f php-5.6.35]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    cf77c85e7c2f

进入到nginx容器查看hosts文件:

[root@server ~]# docker exec -it nginx /bin/bash  #使用exec进入nginx容器
[root@3bbc12db8e9c nginx-1.8.1]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    php cf77c85e7c2f
172.17.0.3    3bbc12db8e9c

可以看到nginx的hosts文件中有一条php的解析,这就是为什么nginx能够和php进行通信的缘由(通过--link进行指定)

 

基于上面的步骤,nginx和php的连接就ok了,下面添加一个mysql 然后测试部署wordpress

5、构建mysql镜像

查看mysql的目录结构:

[root@server mysql]# tree .
.
├── business.sql
├── Dockerfile
├── MariaDB-10.0.33-centos7-x86_64-client.rpm
├── MariaDB-10.0.33-centos7-x86_64-common.rpm
├── MariaDB-10.0.33-centos7-x86_64-compat.rpm
├── MariaDB-10.0.33-centos7-x86_64-server.rpm
├── server.cnf
└── setup.sh

查看mysql的Dockerfile:

[root@server mysql]# cat Dockerfile 
FROM centos

MAINTAINER 381347268@qq.com

COPY MariaDB-10.0.33-centos7-x86_64-client.rpm /root/MariaDB-10.0.33-centos7-x86_64-client.rpm
COPY MariaDB-10.0.33-centos7-x86_64-common.rpm /root/MariaDB-10.0.33-centos7-x86_64-common.rpm 
COPY MariaDB-10.0.33-centos7-x86_64-compat.rpm  /root/MariaDB-10.0.33-centos7-x86_64-compat.rpm
COPY MariaDB-10.0.33-centos7-x86_64-server.rpm  /root/MariaDB-10.0.33-centos7-x86_64-server.rpm
WORKDIR /root
RUN yum remove mysql-libs -y
RUN yum -y install *.rpm
ADD business.sql /root/business.sql
ADD server.cnf /etc/my.cnf.d/server.cnf
ADD setup.sh /root/setup.sh

RUN yum clean all
RUN chmod +x /root/setup.sh
EXPOSE 3306

CMD ["/root/setup.sh"]

(1)这里所使用的基础镜像是centos(官方镜像,latest);(2)配置文件通过后面启动时挂载进去,(如果后面有更改,只需要在某个目录创建好配置文件,然后进行挂载即可);(3)business.sql是关于执行的sql(赋予root密码,创建数据库等等);(4)setup.sh是执行了重新初始化mysql(mariadb),最后重启了服务(使用了 --user=mysql,避免出现了使用root用户启动mariadb)

setup.sh脚本原理:Dockerfile用来安装数据库服务,安装完成后,通过setup.sh脚本重新将mysql进行初始化  初始化后,开启MySQL服务执行setup.sh中的sql,关闭mysql数据库 重新以前台的方式启动MySQL数据库服务

[root@server mysql]# cat setup.sh 
#!/bin/sh
chown -R mysql:mysql /var/lib/mysql

mysql_install_db --user=mysql > /dev/null

mysqld_safe --user=mysql &

sleep 5

mysql < /root/business.sql

sleep 5

ps -wef | grep mysql | grep -v grep | awk ''{print $2}'' | xargs kill -9

mysqld_safe --user=mysql
setup.sh
[root@server mysql]# cat business.sql 
create database wordpress DEFAULT CHARACTER SET utf8;

USE mysql;
GRANT ALL PRIVILEGES ON *.* TO ''root''@''%'' WITH GRANT OPTION;
FLUSH PRIVILEGES;

UPDATE user SET password=PASSWORD("root") WHERE user=''root'';
FLUSH PRIVILEGES;
business.sql
[root@server mysql]# cat server.cnf 
[mysqld]
bind-address=0.0.0.0
console=1
general_log=1
general_log_file=/dev/stdout
collation-server=utf8_unicode_ci
character-set-server=utf8
server.cnf

通过Dockerfile构建mysql镜像:

[root@server mysql]# docker build -t mysql:v1 .  #构建mysql镜像

查看构建完成的镜像:

[root@server mysql]# docker images  #查看三个镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               v1                  4a3e428817c1        2 hours ago         813MB
php                 v1                  2019612cc0a4        3 hours ago         1.19GB
nginx               v1                  c1c90aaefa1e        4 hours ago         752MB

6、部署lnmp环境及wordpress

基于上面的三个镜像 nginx、mysql、php构建lnmp环境,我们先将上面启动的容器给删除掉,因为没有什么用了

先启动三个容器:

[root@server mysql]# docker run -d --name mysql -v /root/mysql/server.cnf:/etc/my.cnf.d/server.cnf -v /data/mysql:/var/lib/mysql -p 3306:3306 mysql:v1  #启动一个mysql容器
df28bcb97289676654ea7b573b0e3e52f910a599ff03b2dbf2dfe6345726127d
[root@server mysql]# docker run -d --name php -v /www:/usr/local/nginx/html --link=mysql:mysql php:v1  #启动一个php容器
2f7fd098f0069deeaef4eb5b067e981c6be01a16d0769c3bc4203eab03a45c40
[root@server mysql]# docker run -d --name nginx -p 80:80 -v /www:/usr/local/nginx/html --link=php:php nginx:v1  #启动一个nginx容器
b68688cd6f2d324e58c469cfb49fa7a14257ef2bb0c301a40a36ef244201c159
[root@server mysql]# docker ps  #查看启动的三个容器的状态
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
b68688cd6f2d        nginx:v1            "/usr/local/nginx/sb…"   11 seconds ago       Up 10 seconds       0.0.0.0:80->80/tcp       nginx
2f7fd098f006        php:v1              "/usr/local/php/sbin…"   About a minute ago   Up About a minute   9000/tcp                 php
df28bcb97289        mysql:v1            "/root/setup.sh"         About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp   mysql

这里阐述下这里启动的这三个容器:(1)先启动一个mysql容器, 并且将上面的server.cnf配置文件和数据目录挂载到了容器内部,这样就防止了数据的丢失;(2)接着启动一个php容器,使用了-v进行映射,如果这里不进行映射,那么php的程序会启动,但是遇到php结尾的文件将不会解析,出现file not found的错误,并且使用了 --link 与mysql 关联,这样php容器就可以连接mysql数据库了;(3)最后启动一个nginx容器,同样使用了-v 进行映射,将网站目录映射到宿主机,通过 --link与php 关联

开始安装wordpress:

[root@server ~]# cd /www/
[root@server www]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
[root@server www]# tar xf wordpress-4.7.4-zh_CN.tar.gz
[root@server www]# ll
总用量 8324
-rw-r--r-- 1 root   root           19 1月  11 12:27 index.php
-rw-r--r-- 1 root   root           32 1月  11 12:04 test.html
drwxr-xr-x 5 nobody nfsnobody    4096 4月  23 2017 wordpress
-rw-r--r-- 1 root   root      8507412 4月  23 2017 wordpress-4.7.4-zh_CN.tar.gz

通过浏览器访问宿主机进行安装:http://IP/wordpress

...省略...

 

进入到mysql容器查看hosts:

[root@server ~]# docker exec -it mysql /bin/bash  #使用exec进入mysql容器
[root@df28bcb97289 ~]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    df28bcb97289

进入到php容器查看hosts:

[root@server ~]# docker exec -it php /bin/bash  #使用exec进入到php容器
[root@2f7fd098f006 php-5.6.35]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    mysql df28bcb97289
172.17.0.3    2f7fd098f006

进入到nginx容器查看hosts:

[root@server ~]# docker exec -it nginx /bin/bash  #使用exec进入到nginx容器
[root@b68688cd6f2d nginx-1.8.1]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.3    php 2f7fd098f006
172.17.0.4    b68688cd6f2d

通过观察可以看见在php容器的hosts中有一条mysql的记录,这也就是为什么安装wordpress时后,我们直接填写mysql容器的名字变可以连接了。同理,nginx中也有一条php的记录。

相关软件包及配置文件见GitHub :https://github.com/buji595/docker_project/tree/master/Dockerfile_Project/lnmp

 

今天的关于Docker 利用 Dockerfile 构建 tomcat7-jdk8 环境dockerfile部署tomcat的分享已经结束,谢谢您的关注,如果想了解更多关于4、Docker 学习,DockerFile 自定义 Tomcat、CentOS 环境中使用 Dockerfile 创建 Tomcat+JDK 镜像、centos7系统下构建docker镜像文件(jdk7+tomcat7)、Docke--Dockerfile 构建LNMP环境的相关知识,请在本站进行查询。

本文标签: