Docker 构建容器Tomcat+Nginx+MySQL

一、构建Tomcat
Tomcat是一个免费开源的轻量级web服务器,在中小型企业和并发量不高的场合普遍使用,是开发和调试JSP程序的首选。下面使用Dockerfile文件的方式来创建带有Tomcat服务的docker镜像。
下载JDK源码包
(提取码:0e3q)并放置Linux宿主机的Tomcat工作目录。

[root@docker01 ~]# docker pull centos:7
[root@docker01 ~]# mkdir tomcat            # 创建Tomcat工作目录
[root@docker01 ~]# cd tomcat/
[root@docker01 tomcat]# ls               # 下载JDK源码包并上传到该工作目录
jdk-8u211-linux-x64.tar.gz
[root@docker01 tomcat]# vim Dockerfile   # 编辑dockerfile 文件

FROM centos:7            # 基础镜像centos:7
MAINTAINER The centos project            # 维护该镜像的用户信息,可不写
ADD jdk-8u211-linux-x64.tar.gz /usr/local/                # 将本地的JDK文件上传至容器
#以下是设置JDK环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_211
ENV JAVA_BIN /usr/local/jdk1.8.0_211/bin
ENV JRE_HOME /usr/local/jdk1.8.0_211/jre
ENV PATH $PATH:/usr/local/jdk1.8.0_211/bin:/usr/local/jdk1.8.0_211/jre/bin
ENV CLASSPATH /usr/local/jdk1.8.0_211/jre/bin:/usr/local/jdk1.8.0_211/lib:/usr/local/jdk1.8.0_211/jre/lib/charsets.jar
ADD apache-tomcat-8.5.35.tar.gz /usr/local           # 将本地文件上传到容器(也可以安装wget 工具  然后RUN wget 从网上直接下载)
WORKDIR /usr/local/              # 进入该目录
RUN mv apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080              # 开启8080端口
ADD run.sh /run.sh                 # 添加运行脚本
RUN chmod 755 /run.sh         # 赋予脚本权限
CMD ["/run.sh"]            # 运行脚本
[root@docker01 tomcat]# vim run.sh       # 编写脚本内容
#!/bin/bash
/usr/local/tomcat/bin/startup.sh
tailf /run
[root@docker01 tomcat]# ls         # 确定该工作目录有如下文件
apache-tomcat-8.5.35.tar.gz  Dockerfile    jdk-8u211-linux-x64.tar.gz  run.sh
[root@docker01 tomcat]# docker build -t tomcat:zyz .            # 生成镜像文件,注意!注意!注意!最后有个“.” 不要忽略,否则会报错
Successfully built 3b0d4e57c9cf      # 出现这行提示信息,则表示创建成功
Successfully tagged tomcat:zyz
[root@docker01 tomcat]# docker run -d --name tomcat -p 8080:8080 tomcat:zyz                   # 运行刚刚创建的Tomcat容器,并指定容器的名字为Tomcat,映射到宿主机的8080端口。
7fc935e10028b32cc420a8a5b8d5647e9dfa92332ee27d22a4078a1187086d77
[root@docker01 tomcat]# docker ps -a | grep tomcat       # 可以看到运行正常
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
9e7bb83f6cd0        tomcat:zyz          "/run.sh"           5 minutes ago       Up 5 minutes        0.0.0.0:8080->8080/tcp   tomcat

客户端访问Linux宿主机的8080端口,测试是否能够访问到Tomcat容器提供的web服务,如下:
Docker 构建容器Tomcat+Nginx+MySQL
看到以上页面,则表示Tomcat容器构建成功。
简单说一下Tomcat和apache的区别:它们都是Aache开源组织开发的用于处理HTTP服务的项目。两者都免费,也都可以作为独立的web服务器运行。Apache是C语言实现的,主要解析静态文本,并发性高,侧重于HTTP服务,Tomcat是java开发的一个符合JavaEES的JSP服务器,属于Apache的扩展,主要用于解析JSP/Servlet,侧重于Servlet引擎。

二、构建Nginx容器
Nginx是一款轻量级的web服务器,也是一个优秀的反向代理服务器。Nginx服务占用内存少,并发能力强,下面是构建Nginx容器的具体操作:

[root@docker02 ~]# mkdir nginx
[root@docker02 ~]# cd nginx/
[root@docker02 nginx]# vim Dockerfile
FROM centos:7            基础镜像
MAINTAINER the centos project         # 开发者信息
RUN yum -y install wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel               # 安装依赖包
RUN wget http://nginx.org/download/nginx-1.18.0.tar.gz
RUN tar zxf nginx-1.18.0.tar.gz
WORKDIR nginx-1.18.0           # 进入目录
RUN ./configure --prefix=/usr/local/nginx && make && make install              # 编译并安装
EXPOSE 80            # 开启容器的端口
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf             # 修改配置文件,以非daemon方式启动
ADD run.sh /run.sh           # 上传运行脚本
RUN chmod 775 /run.sh          # 赋予权限
CMD ["/run.sh"]         # 执行
[root@docker02 nginx]# vim run.sh 
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@docker02 nginx]# ls          # 确定文件已准备好
Dockerfile  run.sh
[root@docker02 nginx]# docker build -t nginx:zyz .           # 还是切记最后有个“.”
Successfully built 398c33862c6d
Successfully tagged nginx:zyz 
[root@docker02 nginx]# docker run -d --name nginx -P nginx:zyz            # -d表示持久化运行,-P表示将容器端口映射到宿主机 
509ce884117e46eb24110ed5e144ff721ca0a68ac0787b11d17871ad376fcfdc
[root@docker02 nginx]# docker ps -a           # 查看容器,其中32769、32768就是容器映射到宿主机的端口
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                           NAMES
509ce884117e        nginx:zyz           "/run.sh"           4 seconds ago       Up 3 seconds        0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   nginx

访问容器进行测试,Nginx是否运行成功!如下(访问宿主机的32769端口,就相当于访问了容器的80端口)
Docker 构建容器Tomcat+Nginx+MySQL
当然也可以进入容器进行修改网页文件来自定义内容
三、构建MySQL容器
MySQL是当下最流行的关系型数据库,所使用的SQL语言是用于访问数据库的最常用标准化语言,MySQL具有体积小、速度快、成本低的优势,是中小型企业首选的数据库。
开始构建MySQL容器:

[root@docker02 mysql]# docker pull centos:6       #下载centos 6作为基础镜像 
[root@docker02 ~]# mkdir mysql      # 创建工作目录
[root@docker02 ~]# cd mysql/
[root@docker02 mysql]# vim Dockerfile 

FROM centos:6         # 6为基础镜像
MAINTAINER the centos project-mysql
RUN yum -y install mysql mysql-server
RUN /etc/init.d/mysqld start && \
mysql -e "grant all privileges on *.* to 'root'@'%' identified by '123456';"&&\
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"
EXPOSE 3306
CMD ["mysqld_safe"]
[root@docker02 mysql]# docker build -t mysql:zyz .          # 生成镜像
Successfully built 2dc81fb9f463
Successfully tagged mysql:zyz
[root@docker02 mysql]# docker run -d --name mysql -P mysql:zyz 
9ac6f150fc6ed52e7847e52ecc3f66653a3d383f5dbe99a7afc9db3df8c8b543
[root@docker02 mysql]# docker ps -a            # 确认容器处于运行状态
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                           NAMES
9ac6f150fc6e        mysql:zyz           "mysqld_safe"       4 seconds ago       Up 4 seconds        0.0.0.0:32770->3306/tcp                         mysql
#对容器中的数据库进行访问测试,若无法使用mysql命令,请自行执行“yum -y install mysql”进行安装
[root@docker02 ~]# mysql -uroot -p123456 -h192.168.171.150 -P 32770
MySQL [(none)]> show databases;               #命令提示符发生变化,登录到了容器中的数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

四、构建MySQL容器(源码编译)
二进制就不用写了,直接ADD复制到镜像,然后运行下安装脚本即可

[root@docker02 ~]# mkdir mysql      # 创建工作目录
[root@docker02 ~]# cd mysql/
[root@docker02 mysql]# vim Dockerfile 
FROM centos:7
MAINTAINER the centos project-mysql
RUN yum -y install wget ncurses ncurses-devel bison cmake make gcc gcc-c++ openssl openssl-devel
RUN useradd -s /sbin/nologin mysql
RUN wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.31.tar.gz
RUN tar zxf mysql-boost-5.7.31.tar.gz
WORKDIR  mysql-5.7.31/
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DSYSCONFDIR=/etc -DSYSTEMD_PID_DIR=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_BOOST=boost -DWITH_SYSTEMD=1 && make && make install
RUN chown -R mysql:mysql /usr/local/mysql/
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc/
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
RUN /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
RUN echo -e "#!/bin/sh \nsystemctl enable mysqld" > /run.sh
RUN chmod 755 /run.sh
RUN sh /run.sh
CMD ["init"]
#my.cnf 文件内容如下
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

[root@docker02 mysql]# docker build -t mysql:zyz .
[root@docker02 mysql]# docker run --name mysql -d -P --privileged mysql:zyz
10e18326b3e3e1df3f21087b9e4659dabe92364a2dee77fcb7ac2f14bdb0b7ee
[root@docker02 mysql]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                           NAMES
10e18326b3e3        mysql:zyz           "init"                   5 seconds ago       Up 4 seconds                0.0.0.0:32771->3306/tcp                         mysql
[root@docker02 mysql]# docker exec -it mysql /bin/bash
[root@10e18326b3e3 mysql-5.7.31]# mysql  
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456';
mysql> flush privileges;

在生产环境中一般不会将MySQL服务放在容器中运行,而是会单独使用服务器部署提供服务,搭建高可用集群

猜你喜欢

转载自blog.51cto.com/14227204/2516239