Docker的镜像制作

2019/05/2713:48:33Docker的镜像制作已关闭评论

Dockerfile常用指令介绍

指令 描述
FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
RUN 构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"]或者RUN yum install httpd
CMD 运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"]或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE 声明容器运行的服务端口。例如:EXPOSE 80 443
ENV 设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD 拷贝文件或目录到镜像(可以自动解压缩或者下载)例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html或者:ADD html.tar.gz /var/www/html
COPY 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
ENTRYPOINT 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]或者ENTRYPOINT /bin/bash -c "/start.sh"
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器,例如:VOLUME ["/var/lib/mysql"]
USER 为RUN,CMD和ENTRYPOINT执行命令指定运行用户,例如:USER Mr_chen
WORKDIR 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。例如:WORKDIR /data
HEALTHCHECK 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3
CMD curl -f http://localhost/ || exit 1
ARG 在构建镜像时指定一些参数。例如:ARG user

利用Dockerfile编写简单的nginxWeb镜像

#首先开启ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
sysctl -p
net.ipv4.ip_forward = 1

#创建nginx的镜像目录
mkdir -p dockerfile/lib/centos/nginx
cd dockerfile/lib/centos/nginx

#准备Dockerfile文件
vim Dockerfile
FROM centos:7       #构建的新镜像是基于哪个镜像(构建的nginx是基于centos7构建的,依赖centos7的系统支持,如果没有镜像自动下载)
MAINTAINER wk       #镜像制作人     
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel      #构建镜像时运行shell命令,yum安装nginx的依赖包
ADD nginx-1.12.1.tar.gz /tmp          #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩
RUN cd /tmp/nginx-1.12.1 && \         #运行shell命令编译安装nginx,make -j 给与2个线程编译 
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install
RUN rm -rf /tmp/nginx-1.12.1* && yum clean all      #删除nginx源码包和清空yum缓存,使容器最轻量化
COPY nginx.conf /usr/local/nginx/conf                   #拷贝文件或目录到镜像 
WORKDIR /usr/local/nginx                   #为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
EXPOSE 80                            #声明容器的端口号
CMD ["./sbin/nginx", "-g", "daemon off;"]         #运行容器时执行的shell命令 -g daemon off 不以守护进程的方式开启nginx,即不以后台运行的方式开启nginx

#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
ls
Dockerfile  nginx-1.12.1.tar.gz  nginx.conf

#build基于nginx的docker镜像
docker build -t nginx:1 .

#nginx主配置文件
cat conf/nginx.conf
user  root; 
worker_processes  auto; 

error_log  logs/error.log  info;

pid        logs/nginx.pid; 


events {
    use epoll; 
}

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 logs/access.log main;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name localhost;
        root html;
        index index.html index.php;

        location ~ \.php$ {
            root html;
            fastcgi_pass lnmp_php:9000;       #lnmp_ph为php容器主机名,对应的就是php的IP地址 
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
            include fastcgi_params;
        }
    }
}

构建PHP网站平台镜像

#创建php的镜像目录
mkdir -p /root/dockerfile/lib/centos/php
cd /root/dockerfile/lib/centos/php

#准备Dockerfile文件
vim Dockerfile 
FROM centos:7                 #新镜像基于centos7镜像
MAINTAINER wk               #新镜像制作人
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel      #运行shell安装依赖
ADD php-5.6.31.tar.gz /tmp/        #将安装包考到 /tmp下并自动解压缩

RUN cd /tmp/php-5.6.31 && \        #编译安装php,复制php启动文件.并修改启动文件的配置
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc        #将php主配置文件拷贝进去

RUN rm -rf /tmp/php-5.6.31* && yum clean all    #删除不用的文件,清空yum缓存使容器最轻量化

WORKDIR /usr/local/php        #进入容器的位置,也是php程序的位置
EXPOSE 9000               #开启端口9000
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]    #开启php -c 指定主配置文件

#将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下
ls
Dockerfile  php-5.6.31.tar.gz  php.ini

#build基于php的docker镜像
docker build -t php:1 .

创建nginx-php网络环境,并启动容器

#创建一个叫做lnmp的网络
docker network create lnmp
dad428646d8f8278f36b80b3b960493aee8be1960bb1f505bfeebc97022b6385

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0604a9338e1b        bridge              bridge              local
b68e9da0b1e6        host                host                local
dad428646d8f        lnmp                bridge              local
cf4b2d0b4394        none                null                local

#创建nginx-php网页挂载目录
mkdir -p /www

#启动php容器
docker run -dit --name lnmp-php --net lnmp --mount type=bind,src=/www,dst=/usr/local/nginx/html php:1
5b49fc160f9e42364238a937149bbb475036b8a28feddf0fe05c1e70b414a151

#启动nginx容器
docker run -dit --name lnmp-nginx --net lnmp -p 8888:80 --mount type=bind,src=/www,dst=/usr/local/nginx/html nginx:1
7ce4d14cf756859e814186090a12b770916f150ed2a5fab2f0dc6ba8c347aab8

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
7ce4d14cf756        nginx:1             "./sbin/nginx -g 'da…"   16 seconds ago      Up 15 seconds       0.0.0.0:8888->80/tcp   lnmp-nginx
5b49fc160f9e        php:1               "./sbin/php-fpm -c /…"   6 minutes ago       Up 6 minutes        9000/tcp               lnmp-php

#创建测试页面php.info
echo "< ?php phpinfo();?>" > /www/index.php

转载:
https://www.cnblogs.com/ywrj/p/9594869.html

  • 微信扫码赞助
  • weinxin
  • 支付宝赞助
  • weinxin