DockerFile详解
dockerfile
-
网址:https://docs.docker.com/engine/reference/builder/
ADD #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包 COPY #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,不会解压任何压缩包 ENV #设置容器环境变量 EXPOSE #声明要把容器的某些端口映射到宿主机 FROM #在整个dockfile文件中,除了注释之外的第一行,要是from,用于指定父镜像 MAINTAINER#设置(镜像的作者信息) LABEL #设置镜像的属性标签 格式: LABEL <key>=<value> <key>=<value> <key>=<value> ....... LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines." STOPSIGNAL#指定退出信号 USER #指定运行操作的用户 VOLUME #创建一个挂载点,用于挂载外部存储,从而将容器中的数据保存至外部存储,避免数据丢失,可以一次创建多个 格式: VOLUME /apps /app2 WORKDIR #用于定义工作目录 RUN #执行shell命令,但是一定要以非交互式的方式执行 CMD #镜像启动为一个容器时候的默认命令或脚本
1)USER(指定用户)和WORKDIR(指定路径)的使用
`构建一个dockerfile文件`
[root@docker dockerflie]# cat dockerFile
FROM stangj/nginx:curl
USER nginx
WORKDIR /usr/share/nginx/html
`用这个文件build镜像 `
[root@docker dockerflie]# docker build -f dockerFile . -t stangj/nginx:with_user_work
`查看镜像`
[root@docker dockerflie]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
stangj/nginx with_user_work 6375b89850a6 3 minutes ago 194MB
stangj/nginx curl cda06e54bb40 14 hours ago 194MB
`查看USER和WORKDIR达到的效果`
[root@docker dockerflie]# docker run -it --rm 6375b89850a6 /bin/bash
nginx@0301485db0d4:/usr/share/nginx/html$ who
who whoami
nginx@0301485db0d4:/usr/share/nginx/html$ whoami
nginx
nginx@0301485db0d4:/usr/share/nginx/html$ pwd
/usr/share/nginx/html
2)ADD(映射本地文件)和EXPOSE(开放端口和-P使用)的使用
`将index.html文件移动到dockerflie目录`
[root@docker dockerflie]# mv /root/html/index.html .
`构建一个dockerfile文件`
[root@docker dockerflie]# vim dockerFile
FROM stangj/nginx:curl
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
`用这个文件build镜像 `
[root@docker dockerflie]# docker build -f dockerFile . -t stangj/nginx:with_ADD_EXPOSE
`查看镜像`
[root@docker dockerflie]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
stangj/nginx with_ADD_EXPOSE 9c036e4387e8 2 minutes ago 194MB
stangj/nginx with_user_work 6375b89850a6 20 minutes ago 194MB
stangj/nginx curl cda06e54bb40 15 hours ago 194MB
`查看USER和WORKDIR达到的效果`
[root@docker ]# docker run --rm -it -P stangj/nginx:with_ADD_EXPOSE /bin/bash
'-P:本机随机生成一个端口号和dockerFile的EXPOSE映射'
`启动容器里的nginx,如果不启动nginx外界是访问不到的`
root@641de77cbd47:/# nginx -g "daemon off;"
`重开连接查看`
[root@docker dockerflie]# curl 192.168.139.146:32769
`或者使用-d就不用在容器里面开启nginx`
[root@docker dockerflie]# docker run -d --rm --name nginx_ADD -P stangj/nginx:with_ADD_EXPOSE
[root@docker dockerflie]# curl 192.168.139.146:32772
3)ENV(环境变量)和RUN(在容器运行前执行某一操作)的使用
`构建一个dockerfile文件`
[root@docker dockerflie]# vim dockerFile
FROM centos:7
ENV VER=9.11.4
RUN yum -y install bind-$VER
`用这个文件build镜像 `
[root@docker dockerflie]# docker build -f dockerFile . -t stangj/centos_bind-9.11.4_env_run
`查看镜像`
[root@docker dockerflie]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
stangj/centos_bind-9.11.4_env_run latest 9ce1346d9e04 10 seconds ago 443MB
`查看USER和WORKDIR达到的效果`
[root@docker dockerflie]# docker run -it --rm stangj/centos_bind-9.11.4_env_run:latest /bin/bash
[root@87b0d1053cee /]# rpm -qa bind
bind-9.11.4-26.P2.el7_9.13.x86_64
[root@87b0d1053cee /]# env|grep VER
VER=9.11.4
4)CMD和ENTRYPOINT的使用
4.1)CMD(在容器运行后执行某一操作)[可以被挤掉]
`构建一个dockerfile文件`
[root@docker dockerflie]# vim dockerFile
FROM centos:7
RUN yum -y install httpd
CMD ["httpd","-D","FOREGROUND"]
`用这个文件build镜像 `
[root@docker dockerflie]# docker build -f dockerFile . -t stangj/centos_cmd
`查看CMD达到的效果`
[root@docker dockerflie]# docker run -d --rm -p84:80 stangj/centos_cmd
e4fa256ac92cf70ae452fc48719eb8100401dfc78dea40b954bb1a73b64fb12b
[root@docker dockerflie]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4fa256ac92c stangj/centos_cmd "httpd -D FOREGROUND" 22 seconds ago Up 19 seconds 0.0.0.0:84->80/tcp, :::84->80/tcp condescending_haibt
4.2)ENTRYPRINT(在容器运行后执行某一操作)[一直运行]
编写脚本
[root@docker dockerflie]# vim entrypoint.sh
/sbin/nginx -g "daemon off;"
[root@docker dockerflie]# chmod +x entrypoint.sh
`构建一个dockerfile文件`
[root@docker dockerflie]# vim dockerFile
FROM centos:7
ADD entrypoint.sh /entrypoint.sh
RUN yum -y install epel-release -q && yum -y install nginx
ENTRYPOINT /entrypoint.sh
[root@docker dockerflie]# docker images
`查看ENTRYPOINT达到的效果`
[root@docker dockerflie]# docker run --rm -p85:80 stangj/centos:7_entrypoint
