Dockerfile语法和简单镜像构建

        Dockerfile是一个用于定义Docker镜像的文本文件,包含了一系列的指令和参数,用于指示Docker在构建镜像时应该执行哪些操作,例如基于哪个基础镜像、复制哪些文件到镜像中、运行哪些命令等。

        Dockerfile文件的内容主要有几个部分组成,包括基础镜像,创建者信息,镜像操作指令,容器启动指令等

        创建Dockerfile文件并通过docker bulid来构建镜像,是除了从镜像仓库拉取、解压保存镜像之外的另一种自定义构建镜像的方式。构建指令:docker build -t="image-name" <文件目录> --load

        

Dockerfile文件指令

#FROM
FROM指定基础镜像,这个文件需要在本地有,如果没有则在docker build后增加--load参数去docker官网进行拉取
Dockerfile文件中定义的镜像就以FROM的镜像为基础,可指定tag

#MAINTAINER
是备注,用以指定创建者信息

#COPY
将同目录下的文件复制到镜像中
也可以使用—chown=参数指定权限
格式为 filename

#ADD
格式同COPY
区别是移动tar文件后会自动解压
docker官方推荐使用COPY

#RUN
说明镜像构建过程中需要运行的命令,每次执行都会增加一层
有shell模式和exec模式
shell模式: 直接使用linux命令即可
exec模式:通过方括号指定参数来实现,如
RUN ["/bin/bash","-c"," yum -y install xxx"]
/bin/bash表示解释器位置 -c代表指定后面是要执行的命令

#EXPOSE
声明端口,说明这个端口是容器映射出去的端口 可以指定多个
声明后,docker run -P会随机将宿主机端口映射到声明后的端口

#CMD
CMD在docker run命令执行时执行
有shell模式和exec模式
但会被docker run后自带的命令所覆盖
如果使用了ENTRYPOINT指令,作为其默认参数

#ENTERYPOINT
作用于CMD相同
有shell模式和exec模式
ENTERYPOINT 不会被docker run后自带的命令覆盖,如果使用了参数--entrypoint则可以覆盖

ENTERYPOINT与CMD混用:

ENTERYPOINT ["nginx","-c"]
CMD ["/nginx.conf"]

nginx是nginx的命令行工具
-c代表用xx文件执行该命令
/nginx.conf基于根目录下的nginx.conf运行,即该文件是默认文件
如果docker run指定了命令,就会覆盖掉CMD指定的文件,转而使用docker run指定的文件

#VOLUME
指定容器内的默认挂载点,使用后会默认把宿主机/var/lib/docker/volumes中挂载到容器中的挂载点,在docker run时可以通过-v手动指定宿主机挂载点
1.持久化存储,避免因为重启导致数据丢失
2.可以通过-v来更好管理存储,容器端固定而宿主机端不固定

#WORKDIR
指定命令的工作目录,需要提前创建好

#ENV
指定环境变量
格式为ENV key=value
例如ENV VERSION= 1.0,就可以使用$VERSION来引用

#USER
用以指定执行命令的用户和用户组

#ONBUILD
延迟执行创建的命令,在某次构建镜像时不会执行,但下次如果有新的dockerfile使用了本镜像进行镜像构建时,就会执行这条命令。

nginx镜像构建

mkdir wsdockerfile
#centos8已经停更了,下载软件需要另外的源,这个文件清华镜像站和centos官网都能找到
cp Centos-vault-8.5.2111.repo wsdockerfile/
cd wsdockerfile/
#删除并替换/etc/yum.repos.d/的源文件
#下载nginx并开放80端口
#用ENTRYPOINT使docker启动时自动启动nginx
cat > dockerfile << EOF
FROM centos 
MAINTAINER ws
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EOF

echo 123 > index.html

docker build -t="ws/nginx:v1" . #开始构建
#[+] Building 130.1s (10/10) FINISHED                                       docker:default
# => [internal] load build definition from dockerfile                                 0.0s
# => => transferring dockerfile: 270B                                                 0.0s
# => [internal] load .dockerignore                                                    0.0s
# => => transferring context: 2B                                                      0.0s
# => [internal] load metadata for docker.io/library/centos:latest                     0.0s
# => [1/5] FROM docker.io/library/centos                                              0.0s
# => [internal] load build context                                                    0.0s
# => => transferring context: 77B                                                     0.0s
# => CACHED [2/5] RUN rm -rf /etc/yum.repos.d/*                                       0.0s
# => CACHED [3/5] COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/                   0.0s
# => [4/5] RUN yum install -y nginx                                                 129.6s
# => [5/5] COPY index.html /usr/share/nginx/html/                                     0.0s
# => exporting to image                                                               0.4s
# => => exporting layers                                                              0.4s
# => => writing image sha256:075aaa08f6799ed252578b0c82645e41c61a818584e6e183053a6ce  0.0s
# => => naming to docker.io/ws/nginx:v1                                               0.0s
docker images | grep ws/nginx
#ws/nginx                  v1        075aaa08f679   51 seconds ago   342MB
docker run -d -p 80 --name wshttp ws/nginx:v1
#1f57b4d4b5a8d73fa5488b792099c08fe15cb1bbfdc71d166c1430f5be9e15d4
docker ps
#CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                                     NAMES
#1f57b4d4b5a8   ws/nginx:v1   "/usr/sbin/nginx -g …"   19 seconds ago   Up 18 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   wshttp

Dockerfile语法和简单镜像构建_第1张图片

tomcat8镜像构建

tomcat版本tomcat-8.5.97 官网能下载到 jdk版本jdk-8u45

mkdir wsdockerfile2
cp jdk-8u45-linux-x64.rpm apache-tomcat-8.5.97.tar.gz Centos-vault-8.5.2111.repo wsdockerfile2
cd wsdockerfile2
#ADD传送jdk包和tomcat包并解压
#rpm包安装jdk-8u45
#ENTRYPOINT安装tomcat,开始后查看日志
echo "
FROM centos
MAINTAINER ws
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
ADD jdk-8u45-linux-x64.rpm /usr/local/ #\\
ADD apache-tomcat-8.5.97.tar.gz /usr/local/
RUN cd /usr/local && rpm -ivh jdk-8u45-linux-x64.rpm
RUN mv /usr/local/apache-tomcat-8.5.97 /usr/local/tomcat8
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out
EXPOSE 8080
" > dockerfile

docker build -t="tomcat8" . --load
#

Dockerfile语法和简单镜像构建_第2张图片

你可能感兴趣的:(云原生,liunx运维,docker,容器,云原生)