1. dockerfile格式

dockerfile就是一个文本,文本里面写了dockerfile特定的指令或者一些格式,通过这个文件可以构建出想要的镜像来,安装顺序执行

指令 描述 使用
FROM 构建新镜像是基于哪个镜像 FROM centos:latest
MAINTAINER 镜像维护者姓名或邮箱地址 MAINTAINER chenjinhang
RUN 构建镜像时运行的Shell命令 RUN yum install gcc -y
COPY 拷贝文件或目录到镜像中 COPY run.sh /usr/bin
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口 EXPOSE 80
HEALTHCHECK 容器中服务健康检查,检查容器运行的服务的状态
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
ENTRYPOINT 运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
CMD 运行容器时执行,如果有多个CMD指令,最后一个生效 CMD [“run.sh”]

2. docker build

docker build常用选择
-t, —tag list # 镜像名称
-f, —file string # 指定Dockerfile文件位置
. # 指定dockerfile中的上下文 dockerfile中会涉及一些文件,上下文指的就是这些文件从哪里读 .当前目录 dockerfile同级的目录下

示例
# docker build .
# docker build -t shykes/myapp .
# docker build -t shykes/myapp -f /path/Dockerfile /path
# docker build -t shykes/myapp http://www.example.com/Dockerfile

3. 几种镜像说明

通常在企业中使用中,镜像可能会分为:
基础镜像:基础镜像是运行一个项目基础的环境例如像、jdk环境、tomcat环境、nginx环境单纯的环境就一个基本的服务
项目镜像:项目镜像才是真正的放到线上去运行的,基于这个基础镜像之上在构建自己的项目镜像例如将项目打包的这个基础镜像中这就是一个项目镜像,打包后的镜像可以拿到docker环境上去运行

4. 编写dockerfile技巧

编写dockerfile技巧:先在独立干净的容器中,将dockerfile中即将想写入的内容执行一遍,在容器跑通后复制出来,复制到文本中,在整理到dockerfile中

dockerfile实践:1、尽少的使用dockerfile的指令run,2、清理当前环境留下的垃圾yum的缓存删除下载的源码包

5. dockerfile构建nginx镜像

1、yum或者源码编译安装
2、启动哪些模块
3、nginx初始化
4、启动 cmd entripoint

5.1. nginx的dockerfile

编写nginx dockerfile

  1. [root@centos7 dockerfile]# cat Dockerfile-nginx
  2. FROM centos:7
  3. MAINTAINER chen_jinhang@qq.com
  4. RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
  5. yum install -y gcc gcc-c++ make \
  6. openssl-devel pcre-devel gd-devel \
  7. iproute net-tools telnet wget curl && \
  8. yum clean all && \
  9. rm -rf /var/cache/yum/*
  10. RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \
  11. tar zxf nginx-1.15.5.tar.gz && \
  12. cd nginx-1.15.5 && \
  13. ./configure --prefix=/usr/local/nginx \
  14. --with-http_ssl_module \
  15. --with-http_stub_status_module && \
  16. make -j 4 && make install && \
  17. rm -rf /usr/local/nginx/html/* && \
  18. echo "ok" >> /usr/local/nginx/html/status.html && \
  19. cd / && rm -rf nginx-1.12.2* && \
  20. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  21. ENV PATH $PATH:/usr/local/nginx/sbin
  22. #COPY nginx.conf /usr/local/nginx/conf/nginx.conf
  23. WORKDIR /usr/local/nginx
  24. EXPOSE 80
  25. # 前台运行
  26. CMD ["nginx", "-g", "daemon off;"]

运行dockerfile

[root@centos7 dockerfile]# docker build -t nginx:v1 -f Dockerfile-nginx .

启动dockerfile编写的nginx镜像

[root@centos7 dockerfile]# docker run -d --name nginx_v1_01 -p 88:80 nginx:v1
9b2ad5d6de27cea4406fc27976cab2f69f88571d5eaf2171d063eb55377e36ad

浏览器访问检查
image.png

5.2. nginx项目的dockefile

编写index.html

[root@centos7 dockerfile]# cat index.html 
chenjinhang  project

编写nginx项目的dockerfile

[root@centos7 dockerfile]# cat Dockerfile-nginx_v2 
FROM nginx:v1
MAINTAINER chen_jinhang@qq.com
COPY index.html /usr/local/nginx/html

运行dockerfile

[root@centos7 dockerfile]# docker build -t nginx:v2 -f Dockerfile-nginx_v2 .

启动镜像

[root@centos7 dockerfile]# docker run -d --name nginx_v2_01 -p 89:80 nginx:v2
97046947894c2c54d9ce8231e14325e5c74b1c6275258f30df42d02382c202c4

浏览器访问检查
image.png
image.png

6. dockerfile构建php镜像

编写nginx dockerfile

[root@centos7 dockerfile]# cat Dockerfile-php
FROM centos:7
MAINTAINER chen_jinhang@qq.com
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum install epel-release -y && \
    yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
    libcurl-devel libjpeg-devel libpng-devel openssl-devel \
    libmcrypt-devel libxslt-devel libtidy-devel autoconf \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*

#RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
COPY php/php-5.6.39.tar.gz /root/
RUN cd /root/ && \
    tar zxf php-5.6.39.tar.gz && \
    cd php-5.6.39 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --enable-fpm --enable-opcache \
    --with-mysql --with-mysqli --with-pdo-mysql \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-freetype-dir \
    --enable-mbstring --with-mcrypt --enable-hash && \
    make -j 4 && make install && \
    cp php.ini-production /usr/local/php/etc/php.ini && \
    cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \
    sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \
    mkdir /usr/local/php/log && \
    cd /root/ && rm -rf php-5.6.39.tar.gz && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/php/sbin:/usr/local/php/bin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]

下载php安装包

mkdir php
cd php/
wget http://mirrors.sohu.com/php/php-5.6.39.tar.gz

运行dockerfile
docker build -t php:v1 -f Dockerfile-php .
启动镜像
docker run -d —name php01 php:v1
检查

[root@centos7 dockerfile]# docker exec -it php01 bash
[root@61a3b3737c23 php]# php -v
PHP 5.6.39 (cli) (built: Oct 19 2019 06:04:06) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

7. dockerfile构建tomcat镜像

编写tomcat dockerfile

[root@centos7 dockerfile]# cat Dockerfile-tomcat 
FROM centos:7
MAINTAINER chen_jinhang@qq.com

ENV VERSION=8.5.47

RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
    yum clean all && \
    rm -rf /var/cache/yum/*

#RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
COPY tomcat/apache-tomcat-${VERSION}.tar.gz /root/
RUN cd /root/ && \
    tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/test && \
    echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
    # tomcat 启动慢解决
    sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080
# 前台运行
CMD ["catalina.sh", "run"]

下载tomcat安装包

mkdir tomcat
cd tomcat/
wget https://mirrors.aliyun.com/apache/tomcat/tomcat-8/v8.5.47/bin/apache-tomcat-8.5.47.tar.gz

运行dockerfile
docker build -t tomcat:v1 -f Dockerfile-tomcat .
启动镜像
docker run -d —name tomcat01 -p 8089:8080 tomcat:v1
检查
image.png

8. 基于构建的tomcat镜像构建jenkins镜像

jenkins的war包下载地址清华源:https://mirror.tuna.tsinghua.edu.cn/jenkins/war/
编写jenkins dockerfile 基于之前tomcat镜像

[root@centos7 dockerfile]# cat Dockerfile-jenkins 
FROM tomcat:v1
MAINTAINER chen_jinhang@qq.com
COPY jenkins/jenkins.war /usr/local/tomcat/webapps/ROOT.war

下载jenkins包

mkdir jenkins
cd jenkins/
wget https://mirror.tuna.tsinghua.edu.cn/jenkins/war/2.190/jenkins.war

运行dockerfile
docker build -t jenkins:v1 -f Dockerfile-jenkins .
启动镜像
docker run -d -p 8088:8080 —name jenkins01 jenkins:v1
检查
image.png
image.png

9. 构建LNMP

1、自定义网络
docker network create lnmp

2、创建Mysql容器
docker run -d \
—name lnmp_mysql \
—net lnmp \
—mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 —character-set-server=utf8

3、创建PHP容器
docker run -d —name lnmp_php —net lnmp —mount src=wwwroot,dst=/wwwroot php:v1

4、创建Nginx容器
docker run -d —name lnmp_nginx —net lnmp -p 88:80 \
—mount type=bind,src=/root/dockerfile/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf —mount src=wwwroot,dst=/wwwroot nginx:v1
#—mount type=bind,src=$(pwd)/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf —mount src=wwwroot,dst=/wwwroot nginx:v1

5、以wordpress博客为例
https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz

确保3个服务全部启动

[root@centos7 dockerfile]# docker ps|grep lnmp
a0a3f71fd358        nginx:v1            "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:88->80/tcp       lnmp_nginx
1c1f93e3473f        php:v1              "php-fpm"                30 minutes ago      Up 30 minutes       9000/tcp                 lnmp_php
ab9e6242dc0f        mysql:5.7           "docker-entrypoint.s…"   39 minutes ago      Up 39 minutes       3306/tcp, 33060/tcp      lnmp_mysql

写php测试页面
cd /var/lib/docker/volumes/wwwroot/_data/
echo ‘<?php phpinfo();?>’ >>test.php
访问检查php解析是否成功
10.0.0.201:88/test.php
部署wordpress博客

注意:mysql地址填写
image.png

10. dockerhub中的数据库启动参数说明

docker run -d \
—name lnmp_mysql \
—net lnmp \
—mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 —character-set-server=utf8

dockerhub上mysql镜像封装时做的变量处理创建root密码创建数据库
-e MYSQL_ROOT_PASSWORD=123456
-e MYSQL_DATABASE=wordpress

dockerhub上mysql镜像封装时做的变量处理数据库使用的字符集放在最后
—character-set-server=utf8