Dockerfile常用指令
| 指令 | 描述 |
|---|---|
| FROM | 構建新鏡像是基于哪個鏡像 |
| LABEL | 標簽 |
| RUN | 構建鏡像時運行的Shell命令 |
| COPY | 拷貝文件或目錄到鏡像中 |
| ADD | 解壓壓縮包并拷貝 |
| ENV | 設置環(huán)境變量 |
| USER | 為RUN、CMD和ENTRYPOINT執(zhí)行命令指定運行用戶 |
| EXPOSE | 聲明容器運行的服務端口 |
| WORKDIR | 為RUN、CMD、ENTRYPOINT、COPY和ADD設置工作目錄 |
| CMD | 運行容器時默認執(zhí)行,如果有多個CMD指令,最后一個生效 |
| ENTRYPOINT | 如果與CMD一起用,CMD將作為ENTRYPOINT的默認參數(shù),如果如果有多個 ENTRYPOINT指令,最后一個生效 |
鏡像分類
001 基礎鏡像,centos、Ubuntu、alpine
002 環(huán)境鏡像,java、php、go
003 項目鏡像,將項目與環(huán)境鏡像一起打包
驗證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
#環(huán)境變量可以先默認,然后通過傳參改變,不傳參就是默認
[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聯(lián)合使用
[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區(qū)別
001 CMD和ENTRYPOINT指令都可以用來定義運行容器時所使用的默認命令
002 Dockerfile至少指定一個CMD或ENTRYPOINT
003 CMD可以用作ENTRYPOINT默認參數(shù),或者用作容器的默認命令
004 docker run指定<command>時,將會覆蓋CMD
005 如果是可執(zhí)行文件,希望運行時傳參,應該使用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
容器化搭建個人博客系統(tǒng)

1638698233867.png
自定義網絡
[root@es3 php]# docker network create lnmp
創(chuàng)建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
創(chuàng)建PHP容器
docker run -d --name lnmp_php --net lnmp \
--mount src=wwwroot,dst=/wwwroot php:v1
創(chuàng)建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博客
相關環(huán)境
[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
......
#手工創(chuàng)建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命令都寫在一行,減少鏡像層。
? 優(yōu)化鏡像大?。阂淮蜶UN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,
都會帶到下一層,所以要在每一層清理對應的殘留數(shù)據,減小鏡像大小。
? 減少網絡傳輸時間:例如軟件包、mvn倉庫等
? 多階段構建:代碼編譯、部署在一個Dockerfile完成,只會保留部署階段產生數(shù)據。
? 選擇最小的基礎鏡像:例如alpine