006、云原生学习笔记-2-dockerfile
0:删除技巧
docker rmi $(docker ls -q) #删除所有镜像
docker rm $(docker ps -aq) #删除所有容器
1、ARG
[root@Master dockerfile]# docker build --no-cache --build-arg version=3.13 -t demo:v1 -f d2 .
#根据文件创建一个镜像,--no-cache:不使用系统现有缓存创建,--build-arg 将参数传入到对应的变量
[root@Master dockerfile]# more d2
ARG version=3.17
#可以定义在任意位置,在定义之后都可以使用
FROM alpine:$version
#指定使用alpine做为基础镜像
LABEL maintainer="jianghuaping"
#指定作者的信息,一般也可以是维护者的信息可以使用\做为续行符
ARG param="hell world"
#定义后在后面的环节可以使用该变量,ARG定义的变量,不能在cmd中使用,只有env定义的变量可以在cmd中使用
#ARG一排只能写一个变量,
RUN echo 111; echo ${param}
#构建时期运行的指令,而非容器启动时运行的指令
CMD echo 1111
#运行容器时运行的指令,每次启动容器时都会运行
2、ENV
[root@Master dockerfile]# docker build --no-cache -t demo:v1 -f d3 .
[root@Master dockerfile]# docker run -it --name demo1 demo:v1
[root@Master dockerfile]# docker run -it --name demo1 -e APP='this is build test' demo:v1
#运行时通过-e传递参数
[root@Master dockerfile]# more d3
ARG version=3
#可以定义在任意位置,在定义之后都可以使用
FROM alpine:${version}
#指定使用alpine做为基础镜像
LABEL maintainer="jianghuaping"
#指定作者的信息,一般也可以是维护者的信息可以使用\做为续行符
ENV APP=1.o
#构建期与运行期都可以使用该变量,运行器表示每次启动容器;构建期无法修改app的值
ARG param="hell world"
#定义后在后面的环节可以使用该变量,ARG定义的变量,不能在cmd中使用,只有env定义的变量可以在cmd中使用
#ARG一排只能写一个变量,
RUN echo ${param};
RUN echo ${APP}
#构建时期运行的指令,而非容器启动时运行的指令
CMD echo ${APP}
#运行容器时运行的指令,每次启动容器时都会运行
3、ADD
[root@Master ~]# docker build --no-cache -t demo:v1 -f /root/dockerfile/d5 /root/dockerfile/
[root@Master dockerfile]# more d5
ARG version=3
#可以定义在任意位置,在定义之后都可以使用
FROM alpine:${version}
#指定使用alpine做为基础镜像
ADD http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.22.1-1.el7.ngx.x86_64.rpm /nginx/
#把上下文Context指定的内容添加到镜像中,如果是压缩包自动解压;如果是远程文件,自动下载
#自动将ngx包下载到/nginx/目录中
ADD redis-7.0.5.tar.gz /redis
#将宿主机指定文件添加到镜像中
RUN cd /nginx && ls -l
RUN cd /redis && ls -l
#构建过程
[root@Master dockerfile]# docker build --no-cache -t demo:v1 -f d5 .
Sending build context to Docker daemon 3.009MB
Step 1/6 : ARG version=3
Step 2/6 : FROM alpine:${version}
---> c059bfaa849c
Step 3/6 : ADD http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.22.1-1.el7.ngx.x86_64.rpm /nginx/
Downloading [==================================================>] 816.3kB/816.3kB
---> 1fa10c1e2040
Step 4/6 : ADD redis-7.0.5.tar.gz /redis
---> dd4c5aa9dbe3
Step 5/6 : RUN cd /nginx && ls -l
---> Running in d942d363819b
total 800
-rw------- 1 root root 816272 Oct 19 10:58 nginx-1.22.1-1.el7.ngx.x86_64.rpm
Removing intermediate container d942d363819b
---> 783883aa7567
Step 6/6 : RUN cd /redis && ls -l
---> Running in a9b5aa94a59a
total 4
drwxrwxr-x 8 root root 4096 Sep 21 19:42 redis-7.0.5
Removing intermediate container a9b5aa94a59a
---> 033351ac9a45
Successfully built 033351ac9a45
Successfully tagged demo:v1
4、COPY
COPY命令与ADD命令用法一至,区别在于文件不会自动下载,与不会自动解压
USER 1000:1000
#在容器内创建一个用户
COPY --chown=1000:1000 redis-7.0.5.tar.gz /redis1
#复制进容器后修改文件的用户及用户组只能是id号不能是名称
5、WORKDIR修改操作目录
[root@Master dockerfile]# docker build --no-cache -t demo:v2 -f d7 .
[root@Master dockerfile]# more d7
FROM alpine:3
#指定使用alpine做为基础镜像
RUN pwd && ls -l
WORKDIR /app
#修改工作目录
WORKDIR abc
#此目录会以/app为基准目录,将在/app下创建abc目录
RUN pwd && ls -l
WORKDIR /TEST/ABC
#以绝对路径定义,会修改至此目录下
#进入容器后会自动进入WORKDIR所定义的目录下,以最后一个WORKDIR指定的目录为准
RUN pwd && ls -l
6、VOLUME
VOLUME ["/hello","/app"]
#指定将容器内的目录创建挂载卷,自动挂载到宿主机;将容器内的/hello 及/app挂载到宿主机
CMD ping baidu.com
#如果VOLUME已经挂载后无法在容器内进行修改,如果需要修改/hello目录下的文件,需要在VOLUME之前操作
7、EXPOSE声明暴露端口
EXPOSE 80
#申请暴露80端口,并不是执行暴露,运行时-P时,会暴露此端口
EXPOSE [80,443]
EXPOSE 80/tcp
8、CMD与ENTRYPOING
entypoint:给定后不可通过启动时修改,cmd可以启动时修改。可以理解为,cmd作为entrypoint的参数
[root@Master file]# docker build --no-cache -t test:v2 -f d3 .
[root@Master file]# docker run --name test4 -it --rm test:v2
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: seq=0 ttl=52 time=44.706 ms
[root@Master file]# docker run --name test4 -it --rm test:v2 atguigu.com
#可以通过传值的形式修改cmd的值
PING atguigu.com (42.121.6.2): 56 data bytes
64 bytes from 42.121.6.2: seq=0 ttl=50 time=93.089 ms
CMD ["baidu.com"]
#官方推荐写法,后期需要变化的写cmd
ENTRYPOINT ["ping"]
#exec的写法,后期不会变化的写entrypoint
9、查看现有镜像的dockerfile
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 alpine:latest
10、dockerfile构建镜像
root@11-u:~# mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine}} -pv #创建一个规范的dockerfile的目录
root@11-u:/opt/dockerfile/web/nginx/all-in-one# vim Dockfile
#base image for centos nginx,2022-11-29
FROM centos:latest
MAINTAINER "JHP j_huaping@163.com"
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.re
po
RUN yum clean all
RUN yum makecache
RUN yum install -y epel-release && yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
root@11-u:/opt/dockerfile/web/nginx/all-in-one# docker build --no-cache -t mynginx:v1 -f Dockerfile . #构建容器
root@11-u:/opt/dockerfile/web/nginx/all-in-one# docker run -it --name mynginx --rm mynginx:v1 #启动容器验证
mv Dockerfile Dockerfile.v1
vim Dockerfile
FROM mynginx:v1
MAINTAINER "JHP j_huaping@163.com"
RUN yum install -y nginx && echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改容器的时间
EXPOSE 80
ENTRYPOINT nginx
docker build -t mynginx:v2 -f Dockerfile .
docker run -d -P --name nginx mynginx:v2 #测试验证可以正常访问nginx

浙公网安备 33010602011771号