Dockerfile定制容器镜像

Dockerfile常用指令

指令 描述
FROM 构建新镜像是基于哪个镜像
LABEL 标签
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ADD 解压压缩包并拷贝
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效
ENTRYPOINT 如果与CMD一起用,CMD将作为ENTRYPOINT的默认参数,如果如果有多个
ENTRYPOINT指令,最后一个生效

镜像分类

001 基础镜像,centos、Ubuntu、alpine
002 环境镜像,java、php、go
003 项目镜像,将项目与环境镜像一起打包

验证COPY、ADD、ENV

[root@es3 test2]# vi Dockerfile

FROM centos:latest
LABEL maintalner lizhenliang
RUN yum install wget curl  -y
COPY a.txt /opt
ADD b.tar.gz /opt
ENV ABC=123
EXPOSE 80
WORKDIR /usr/local
CMD ["sleep","360000"]

[root@es3 test]# ls
a.txt  b.tar.gz  Dockerfile

[root@es3 test2]# docker build -t test .  

[root@es3 test]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         latest    b1509b20753d   30 seconds ago   277MB

[root@es3 test]# docker run -d --name=test test
[root@es3 test]# docker exec -it test bash
[root@352b603d469c local]# pwd
/usr/local
[root@352b603d469c local]# echo $ABC
123
[root@352b603d469c local]# ls /opt
a.txt  b.txt

#环境变量可以先默认,然后通过传参改变,不传参就是默认
[root@es3 test]# docker run -d --name=test2 -e ABC=666 test
[root@es3 test]# docker exec -it test2 bash
[root@b2f4f322307d local]# echo $ABC
666

验证脚本

[root@es3 test2]# vi run.sh
#!/bin/bash

echo hello $1

sleep 60000

[root@es3 test2]# chmod 777 run.sh 

[root@es3 test2]# vi Dockerfile
FROM centos:latest
LABEL maintalner lizhenliang
COPY run.sh /usr/bin
ENV NAME=aliang
EXPOSE 80
CMD ["sh","-c","/usr/bin/run.sh $NAME"]

[root@es3 test2]# docker build -t test2 . 
[root@es3 test2]# docker run -d --name test21 test2

[root@es3 test2]# docker logs -f test21
hello aliang

CMD与ENTRYPOINT联合使用

[root@es3 test3]# vi Dockerfile
FROM centos:latest
LABEL maintalner lizhenliang
ENTRYPOINT ["echo"]
CMD ["hello","aliang"]

[root@es3 test3]# docker build -t test3 .
[root@es3 test3]#  docker run -d --name test31 test3
[root@es3 test3]# docker logs -f test31                  
hello aliang

[root@es3 test3]#  docker run -d --name test32 test3 hello mv1 mv2 mv3
[root@es3 test3]# docker logs -f test32
hello mv1 mv2 mv3

CMD与ENTRYPOINT区别

001 CMD和ENTRYPOINT指令都可以用来定义运行容器时所使用的默认命令
002 Dockerfile至少指定一个CMD或ENTRYPOINT
003 CMD可以用作ENTRYPOINT默认参数,或者用作容器的默认命令
004 docker run指定<command>时,将会覆盖CMD
005 如果是可执行文件,希望运行时传参,应该使用ENTRYPOINT

前端项目镜像构建与部署Nginx

[root@es3 nginx]# vi Dockerfile
FROM centos:7
LABEL maintainer www.ctnrs.com
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/*

ADD nginx-1.15.5.tar.gz /
RUN cd nginx-1.15.5 && \
    ./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module && \
    make -j 4 && make install && \
    mkdir /usr/local/nginx/conf/vhost && \
    cd / && rm -rf nginx* && \
    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
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]


[root@es3 nginx]# ls
Dockerfile  nginx-1.15.5.tar.gz  nginx.conf  php.conf

[root@es3 nginx]# docker build -t nginx:v1 .
[root@es3 nginx]# docker run -d -p 8011:80 --name=test1 nginx:v1

http://192.168.153.27:8011/

---------------------------------------------------------------------------
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.
------------------------------------------------------------------------------

[root@es3 nginx]# docker run -d -v /opt/wwwroot:/usr/local/nginx/html  -p 8012:80 --name=test2 nginx:v1 

[root@es3 nginx]# vi /opt/wwwroot/index.html
hello nginx

http://192.168.153.27:8012/
hello nginx

[root@es3 nginx]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v1        3209dc7241b5   9 minutes ago    379MB

PHP项目镜像构建:PHP

[root@es3 php]# vi Dockerfile
FROM centos:7
MAINTAINER www.ctnrs.com
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/*

ADD php-5.6.36.tar.gz /
RUN 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
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]

[root@es3 php]# docker build -t php:v1 .
[root@es3 php]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
php          v1        c89e43978b56   About a minute ago   634MB
nginx        v1        3209dc7241b5   22 minutes ago       379MB

容器化搭建个人博客系统

1638698233867.png

自定义网络

[root@es3 php]# docker network create lnmp

创建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

创建PHP容器

docker run -d --name lnmp_php --net lnmp \
--mount src=wwwroot,dst=/wwwroot php:v1

创建Nginx容器

[root@es3 dockerfile]# cd nginx/
[root@es3 nginx]# ls
Dockerfile  nginx-1.15.5.tar.gz  nginx.conf  php.conf

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

wordpress博客

相关环境

[root@es3 nginx]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                               NAMES
8895c1ec5d0c   nginx:v1    "nginx -g 'daemon of…"   4 seconds ago        Up 2 seconds        0.0.0.0:88->80/tcp, :::88->80/tcp   lnmp_nginx
bb25cc01227a   php:v1      "php-fpm"                About a minute ago   Up About a minute   9000/tcp                            lnmp_php
b2aa872b8c38   mysql:5.7   "docker-entrypoint.s…"   4 minutes ago        Up 4 minutes        3306/tcp, 33060/tcp                 lnmp_mysql

test.php

[root@es3 nginx]#  docker volume inspect wwwroot
[
    {
        "CreatedAt": "2021-12-05T18:00:48+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/wwwroot/_data",
        "Name": "wwwroot",
        "Options": null,
        "Scope": "local"
    }
]

[root@es3 nginx]# vi /var/lib/docker/volumes/wwwroot/_data/test.php
<?php phpinfo();?>

http://192.168.153.27:88/test.php
1638698963460.png

wordpress

[root@es3 dockerfile]# cp -r wordpress-4.9.4-zh_CN.tar.gz /var/lib/docker/volumes/wwwroot/_data

[root@es3 _data]# tar -xzvf wordpress-4.9.4-zh_CN.tar.gz 

[root@es3 _data]# ls
test.php  wordpress  wordpress-4.9.4-zh_CN.tar.gz

[root@es3 _data]# mv wordpress/* ./

http://192.168.153.27:88/
1638699308070.png

1638699418629.png

1638699451194.png
[root@es3 _data]# vi wp-config.php
......
#手工创建wp-config.php文件,并将以下文字粘贴于其中
1638699629054.png

1638699657427.png

1638699703688.png

JAVA项目镜像构建:Tomcat

tomcat:v1

[root@es3 tomcat]# ls
apache-tomcat-8.5.43.tar.gz  Dockerfile  ROOT.war

[root@es3 tomcat]# vi Dockerfile 
FROM centos:7
MAINTAINER www.ctnrs.com

ENV VERSION=8.5.43

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
    yum clean all && \
    rm -rf /var/cache/yum/*

ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/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"]

[root@es3 tomcat]# docker build -t tomcat:v1 .

[root@es3 tomcat]# docker run -d -p 802:8080 --name=tomcat1 tomcat:v1

http://192.168.153.27:802/
1638700524625.png

tomcat:v2

[root@es3 tomcat]# vi Dockerfile2
FROM tomcat:v1
RUN rm -rf /usr/local/tomcat/webapps/*
COPY ROOT.war /usr/local/tomcat/webapps

[root@es3 tomcat]# docker build -t tomcat:v2 -f Dockerfile2 .
[root@es3 tomcat]# docker run -d -p 803:8080 --name=tomcat2 tomcat:v2

http://192.168.153.27:803/

JAVA微服务镜像构建:Jar

[root@es3 java]# vi Dockerfile 
FROM java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
ENV JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add -U tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY hello.jar /
EXPOSE 8888
CMD ["/bin/sh", "-c", "java -jar $JAVA_OPTS /hello.jar"]

[root@es3 java]# docker build -t hello:v1 .
[root@es3 java]# docker run -d --name=hello1 -p 806:8888 hello:v1

[root@es3 java]# docker logs -f hello1
Hello world!
sleep 1 day...

编写Dockerfile最佳实践

• 减少镜像层:一次RUN指令形成新的一层,尽量Shell命令都写在一行,减少镜像层。
• 优化镜像大小:一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,
  都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。
• 减少网络传输时间:例如软件包、mvn仓库等
• 多阶段构建:代码编译、部署在一个Dockerfile完成,只会保留部署阶段产生数据。
• 选择最小的基础镜像:例如alpine
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容