美文网首页
06、Dockerfile

06、Dockerfile

作者: 六弦极品 | 来源:发表于2019-05-13 20:05 被阅读0次

1. Dockerfile格式:

#从上往下逐步执行
FROM centos:latest
MAINTAINER liuzhousheng
RUN yum install gcc -y
COPY run.sh /usr/bin
EXPOSE 80
CMD ["run.sh"]

2. Dockerfile指令

指令 描述
FROM 构建新镜像是基于哪个镜像
MAINTAINER 镜像维护者姓名或邮箱地址
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口
HEALTHCHECK 容器中服务健康检查
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
ENTRYPOINT 运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
CMD 运行容器时执行,如果有多个CMD指令,最后一个生效

3. Build镜像

# docker build --help
Usage: docker build [OPTIONS] PATH | URL | - [flags] Options:
-t, --tag list # 镜像名称
-f, --file string # 指定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

4. 构建Nginx,PHP,Tomcat基础镜像

编写Dockerfile 注意以下两点:
① 使用 && 符号将shell命令拼接起来,尽少使用dockerfile指令,减少分层,一个指令就是一层
② 清理当前环境留下的垃圾文件及缓存,减少空间大小,以便镜像上传下载等

• 构建Nginx基础镜像

FROM centos:7
MAINTAINER liuzhousheng
RUN yum install -y gcc gcc-c++ make \
    openssl-devel pcre-devel gd-devel \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \
    tar zxf nginx-1.15.5.tar.gz && \
    cd nginx-1.15.5 &&\
    ./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module && \
    make -j 4 && make install && \
    rm -rf /usr/local/nginx/html/* && \
    echo "ok" >> /usr/local/nginx/html/status.html && \
    cd / && rm -rf nginx-1.12.2* && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
#COPY nginx.conf /usr/local/nginx/conf/nginx.conf  ## 先注释这行,不然构建需要依赖本地配置文件,启动启动容器会依赖php
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

运行命令:

# docker build -t nginx:v1 -f dockerfile-nginx .
     ...
Removing intermediate container 7b806be15eaf
 ---> ee4b38a88652
Successfully built ee4b38a88652
Successfully tagged nginx:v1

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  db3cfa07d4a5        45 seconds ago      395MB

# docker run -d --name nginx01 -p 88:80 nginx:v1
01cac841c29a11d61d7c2f49a45d8c36bbff7167694c2cab4df3e49e082dd138
# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
01cac841c29a        nginx:v1            "nginx -g 'daemon of…"   6 seconds ago       Up 4 seconds        0.0.0.0:88->80/tcp   nginx01
# curl 10.40.6.165:88/status.html
ok

用刚刚创建的nginx:v1 镜像在创建一个v2镜像

# cat index.html   ## 将这文件作为nginx root目录
hello docker!!!

# cat  dockerfile-nginxv2   ##  新的dockerfile
FROM nginx:v1
COPY index.html /usr/local/nginx/html/

# docker build -t nginx:v2 -f dockerfile-nginxv2 .   ## 创建nginx:v2镜像
Sending build context to Docker daemon  410.1kB
Step 1/2 : FROM nginx:v1
 ---> db3cfa07d4a5
Step 2/2 : COPY index.html /usr/local/nginx/html
 ---> 64f743ec5b18
Successfully built 64f743ec5b18
Successfully tagged nginx:v2

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  64f743ec5b18        27 seconds ago      395MB
nginx               v1                  db3cfa07d4a5        11 minutes ago      395MB

# docker run -d --name nginx02 -p 89:80 nginx:v2
c446b345b73ac6417d7090b5d46c7be574b87be152ad7c9f42886e86e43f4d06
# curl 10.40.6.165:89
hello docker!!!

• 构建PHP基础镜像

FROM centos:7
MAINTAINER liuzhousheng
RUN 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 && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./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 / && rm -rf php* && \
    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"]

运行命令构建:

# docker build -t php:v1 -f dockerfile-php .
   ...
 ---> 1c2bb6668116
Successfully built 1c2bb6668116
Successfully tagged php:v1

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
php                 v1                  1c2bb6668116        About a minute ago   521MB

# docker run -d --name php01 php:v1
b41eab89377ddc8a0d9a600baeee33dd1c1b34b156d52c3d3d07abdb10f60e40
# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b41eab89377d        php:v1              "php-fpm"           5 seconds ago       Up 3 seconds        9000/tcp            php01

# docker exec -it php01 bash
[root@b41eab89377d php]# ls
bin  etc  include  lib  log  php  sbin  var

[root@b41eab89377d php]# pwd
/usr/local/php

[root@b41eab89377d php]#php -v
PHP 5.6.36 (cli) (built: May 15 2019 07:40:53) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

[root@b41eab89377d php]# ps aux |grep php
root         1  0.4  0.1 114644  8332 ?        Ss   15:44   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody       6  0.0  0.0 114644  4356 ?        S    15:44   0:00 php-fpm: pool www
nobody       7  0.0  0.0 114644  4356 ?        S    15:44   0:00 php-fpm: pool www
nobody       8  0.0  0.0 114644  4356 ?        S    15:44   0:00 php-fpm: pool www

[root@b41eab89377d php]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      1/php-fpm: master p 

• 构建Tomcat基础镜像

FROM centos:7
MAINTAINER liuzhousheng

ENV VERSION=8.5.5

RUN 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 && \
RUN wget http://10.40.6.64/src/apache-tomcat-${VERSION}.tar.gz && \
    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 && \
    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"]

构建镜像运行一下命令:

# docker build -t tomcat:v1 -f dockerfile-tomcat .
    ...
 ---> e35360e86854
Successfully built e35360e86854
Successfully tagged tomcat:v1

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
tomcat              v1                  e35360e86854        About a minute ago   426MB

# docker run -d --name tomcat01 -p 8089:8080 tomcat:v1
fa5e1eafc72a5344b4d6c715bc98c5636d0b55519aea32754727ae542a0b0b1a
# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
fa5e1eafc72a        tomcat:v1           "catalina.sh run"   4 seconds ago       Up 3 seconds        0.0.0.0:8089->8080/tcp   tomcat01

# curl 10.40.6.165:8089/test/status.html
ok

在tomcat:v1 镜像的基础创建一个tomcat:v2的镜像

# cat dockerfile-tomcatv2
FROM tomcat:v1
COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war

# docker build -t tomcat:v2 -f dockerfile-tomcatv2 .
Sending build context to Docker daemon  74.99MB
Step 1/2 : FROM tomcat:v1
 ---> e35360e86854
Step 2/2 : COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war
 ---> 59592f04baa9
Successfully built 59592f04baa9
Successfully tagged tomcat:v2

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              v2                  59592f04baa9        10 seconds ago      501MB

# docker run -d --name tomcat02 -p 8088:8080 tomcat:v2
ad435374e7aea15e8f80b3bdb00c45ede4791a4801af2e774f5becb79cf1040d
# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
ad435374e7ae        tomcat:v2           "catalina.sh run"   10 seconds ago      Up 9 seconds        0.0.0.0:8088->8080/tcp   tomcat02

## 然后用浏览器访问http://10.40.6.165:8088 就可以放到jenkins安装页面

• 快速部署LNMP网站平台

image.png

5. 快速搭建LNMP网站平台

lnmp 架构要用到三个容器,所以要准备相应的三个镜像:
php: php:v1(上边我们自己制作的镜像)
nginx: nginx:v1(上边我们自己制作的镜像)
mysql: mysql:5.7(使用官方镜像)
# docker pull mysql:5.7

(1)、自定义网络
# docker network create net-lnmp
(2)、创建Mysql容器

# docker run -d \
--name lnmp_mysql \
--net 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 net-lnmp --mount src=wwwroot,dst=/wwwroot php:v1
(4)、创建Nginx容器
nginx.conf配置文件:

user                 nobody;
worker_processes     4;
worker_rlimit_nofile 65535;

error_log  logs/error.log  notice;

pid        /var/run/nginx.pid;

events {
    use epoll;
    worker_connections  4096;
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log off;
    keepalive_timeout  65;

    client_max_body_size         64m;
    server {
        listen 80;
        server_name www.lnmp_test.com;
        index index.php index.html;

        access_log logs/www.lnmp_test.com_access.log;
        error_log logs/www.lnmp_test.com_error.log;

        # location ~ .*\.(js|css|html|png|gif|jpg|jpeg)$ {
        location / {
            root /wwwroot;
        }

        location ~* \.php$ {
            root /wwwroot;
            fastcgi_pass lnmp_php:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

启动容器:

# docker run -d --name lnmp_nginx --net net-lnmp -p 88:80 \
--mount type=bind,src=$(pwd)/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf --mount src=wwwroot,dst=/wwwroot nginx:v1 

查看三个容器:

# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
f8c38e7b7a95        nginx:v1            "nginx -g 'daemon of…"   3 seconds ago       Up 1 second         0.0.0.0:88->80/tcp    lnmp_nginx
fe4117b21f2e        php:v1              "php-fpm"                7 minutes ago       Up 7 minutes        9000/tcp              lnmp_php
7494e5977ba5        mysql:5.7           "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        3306/tcp, 33060/tcp   lnmp_mysql

创建php测试页:

# cat /var/lib/docker/volumes/wwwroot/_data/test.php 
<?php
    phpinfo()
?>

## 浏览器请求URL:http://10.40.6.165:88/test.php

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

# cd /var/lib/docker/volumes/wwwroot/_data/
# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
# tar xvf wordpress-4.9.4-zh_CN.tar.gz

使用浏览器访问 http://10.40.6.165:88/wordpress

安装页.png

进入容器 lnmp_nginx查看nginx访问日志:

# docker exec -it lnmp_nginx bash
[root@f8c38e7b7a95 nginx]# tail -f logs/www.lnmp_test.com_access.log
10.19.1.28 - - [15/May/2019:17:13:42 +0800] "POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1" 200 58 "http://10.40.6.165:88/wordpress/wp-admin/edit.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
10.19.1.28 - - [15/May/2019:17:13:43 +0800] "GET /wordpress/wp-includes/js/wp-emoji-release.min.js?ver=4.9.10 HTTP/1.1" 304 0 "http://10.40.6.165:88/wordpress/wp-admin/edit.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
10.19.1.28 - - [15/May/2019:17:13:43 +0800] "GET /wordpress/wp-admin/edit.php HTTP/1.1" 200 48058 "http://10.40.6.165:88/wordpress/wp-admin/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
10.19.1.28 - - [15/May/2019:17:13:43 +0800] "POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1" 200 58 "http://10.40.6.165:88/wordpress/wp-admin/edit.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"

相关文章

网友评论

      本文标题:06、Dockerfile

      本文链接:https://www.haomeiwen.com/subject/uhtdaqtx.html