玩龙天子 发表于 2019-2-21 07:57:08

构建Docker镜像实战案例

Dockerfile介绍


[*]Dockerfile是由一组指令组成的文件,每条指令对应linux中一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。
[*]Dockerfile大致结构:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。每行支持一条指令,每条指令可以携带多个参数,支持以 # 开头的注释。
[*]Dockerfile操作指令:

  FROM 镜像 : 指定新的镜像所基于的镜像
MAINTAINER 名字 :说明新镜像的维护人
RUN 命令 : 在所基于的镜像上执行命令,并提交到新的镜像中
CMD ["要运行的程序","参数1","参数2"] : 指定启动容器时要运行的命令或脚本
EXPOSE端口号: 指定新镜像加载到Docker时要开启的端口
ENV环境变量 变量值: 设置一个环境变量的值,会背后面的RUN用到
ADD源文件/目录 目标文件/目录 :将源文件复制到目标文件 ,源文件和Dockerfile位于同一目录
COPY源文件/目录 目标文件/目录 :将本地主机的源文件复制到目标目录,源文件和Dockerfile位于同一目录
VOLUME["目录"]   : 在容器中创建一个挂载点
USER 用户名 /UID:指定运行容器时的用户
WORKDIR路径 : 为后续的RUN 、CMD、ENTRYPOINT 指定工作目录
ONBUILD命令: 指定所生成的镜像作为一个基础镜像时所要运行的命令。

   

实战 下面详解三个案例:构建Nginx、tomcat、mysql镜像
   


[*]
构建Nginx镜像
[*]  建立工作目录

# docker pull centos    //下载基础镜像
# mkdir nginx
# cd nginx/
[*]  创建Dockerfile文件

# vim Dockerfile    //编写Dockerfile
# 设置基础镜像
FROM centos
# 维护该镜像的用户
MAINTAINER this is nginx image
# 安装环境 下载软件包 并解压
RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel
RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz
RUN tar zxvf nginx-1.9.7.tar.gz
# 工作目录 编译安装
WORKDIR nginx-1.9.7
RUN ./configure --prefix=/usr/local/nginx && make && make install
# 开启 80 和443端口
EXPOSE 80
EXPOSE 443
# 修改配置文件,以非 deamon方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
# 复制服务脚本并设置权限
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 755 /run.sh
# 启动容器时执行脚本
CMD ["/run.sh"]
[*]  编写执行脚本

# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[*]  生成镜像

# docker build -t nginx:new .
# docker run -d -P nginx:new
# docker ps -a
http://i2.运维网.com/images/blog/201808/14/281baf0e80534e7a3f230bda155abc88.pnghttp://i2.运维网.com/images/blog/201808/14/697ebaa63f75cd8518b355a960b7e80c.png


[*]测试



[*]在浏览器输入:http://192.168.200.132:32769/

http://i2.运维网.com/images/blog/201808/14/8e52f2db156ab24736e582e9d0f67bfe.png
    
  


[*]
构建Tomcat 镜像
[*]  建立工作目录

# mkdir /root/tomcat
# cp jdk-8u91-linux-x64.tar.gz /root/tomcat/   //将安装包复制到该目录并解压
# cp apache-tomcat-8.5.16.tar.gz /root/tomcat/
# cd /root/tomcat/
# tar zxvf jdk-8u91-linux-x64.tar.gz
# tar zxvf apache-tomcat-8.5.16.tar.gz
[*]  创建Dockerfile文件

# vim Dockerfile   //编写Dockerfile
FROM centos
MAINTAINER this is tomcat image
# 安装JDK环境,设置其环境变量
ADD jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
ADD apache-tomcat-8.5.16 /usr/local/tomcat8
EXPOSE 8080
[*]  生成镜像

# docker build -t tomcat:centos .
http://i2.运维网.com/images/blog/201808/14/0f9e4d3ee617fc70607d6ca2193cfb2c.png
   


[*]  加载到容器并开启服务

# docker run --name tomcat01 -p 80:8080 -ittomcat:centos /bin/bash
//加载到容器 并 映射本地的80端口到 容器的8080端口
# cd /usr/local/tomcat8/bin
# ./startup.sh
[*]测试



[*]在浏览器输入:192.168.200.132   (宿主机IP)

http://i2.运维网.com/images/blog/201808/14/0cefd20876c1a9b20cacfaabc3861684.png
   



[*]
构建Mysql镜像
[*]  建立工作目录

# mkdir /mysql
# cd /mysql
[*]  创建Dockerfile文件

# vim Dockerfile      //编写Dockerfile
# 设置基础镜像为centos6
FROM guyton/centos6
MAINTAINER this is msyql images
RUN yum -y install mysql mysql-server
# 开启mysql服务并授权
RUN /etc/init.d/mysqld start &&\
mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'abc123';" &&\
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'abc123';"
EXPOSE 3306
# 运行初始化脚本mysql_safe
CMD ["mysqld_safe"]
[*]  生成镜像

# docker build -t centos6:mysql .    //后面有个点 .
# docker run --name=mysqlserver -d -P centos6:mysql
//加载到容器并映射本地随机端口到容器的3306端口
# docker ps -a
http://i2.运维网.com/images/blog/201808/14/c5a74ee1e3cb997215209e293ce38f20.png
   


[*]测试
[*]注意:两边防火墙都要关
[*]  使用其他mysql服务器远程登录容器mysql

# mysql -h 192.168.200.132 -u root -P 32770 -pabc123
http://i2.运维网.com/images/blog/201808/14/0842c0048d0e32daca2a6ff26685c5da.png
   

注意:如果执行Dockerfile文件报错会生成镜像none

删除none镜像

    # vim none.sh
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi
# chmon +x none.sh
# ./none.sh


页: [1]
查看完整版本: 构建Docker镜像实战案例