docker镜像基础&通过Dockerfile制作镜像

docker三大基础组件

**容器镜像仓库**

  • 仓库是管理镜像的地方,可以拉取仓库中的镜像,也可以将制作好的镜像推送到仓库中;
  • 像则是根据我们需要的用途按照docker规则制作的docker应用;
  • 容器则是利用docker镜像启动的一个程序,一个镜像可以创建多个不同名字的容器。

docker镜像命令

  • docker history imagename 查看镜像的一共分了多少层
    查看centos镜像的分层
root@test:/home/test# docker history daocloud.io/library/centos
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
300e315adb2f        6 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           6 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           6 months ago        /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

  • docker images 显示本地所有镜像
  • docker images -a显示本地所有镜像,包含中间映象层
  • docker images mysql查找本地mysql镜像文件
  • docker rmi mysql删除本地的mysql镜像文件
  • docker images -q只返回镜像ID
  • docker images --help 可查看docker images的更多用法
  • 镜像文件存储在/var/lib/docker/iamge路径下,image id 是镜像的唯一标识

使用Dockerfile构建Tomcat镜像文件

Dockerfile 中的每条指令都会在镜像中创建一个层,当更改 Dockerfile 并重建映像时,只会重建那些已更改的层

  1. 准备centos7镜像文件(不用下载到本地,dockerfile文件中写了路径会自动去下载)
    centos镜像文件通过docker pull daocloud.io/library/centos:latest命令从国内的镜像仓库daocloud.io获取,比docker的官方仓库地址快
  2. 准备 tomcat和jdk安装包
root@test:/home/test# ll
总用量 153100
-rw-r--r-- 1 zhujunhan docker  11834793 7月   1 16:20 apache-tomcat-10.0.7.tar.gz
-rw-r--r-- 1 zhujunhan docker 144935989 7月   1 16:45 jdk-8u291-linux-x64.tar.gz
  1. 编写Dockerfile文件,如图
FROM daocloud.io/library/centos
MAINTAINER ZD

ADD jdk-8u291-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_291

ADD apache-tomcat-10.0.7.tar.gz /usr/local

RUN rm -f /usr/local/*.tar.gz

WORKDIR /usr/local/apache-tomcat-10.0.7
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh","run"]
  1. docker build命令编译Dockerfile文件
  • docker build -t tomcat:v10.0.7 .( 最后一个点表示文件路径)执行命令后生成镜像文件成功
root@test:/home/test# docker build -t tomcat:v10.0.7 .
Sending build context to Docker daemon  533.6MB
Step 1/9 : FROM daocloud.io/library/centos
 ---> 300e315adb2f
Step 2/9 : MAINTAINER ZD
 ---> Using cache
 ---> 0bc23876502e
Step 3/9 : ADD jdk-8u291-linux-x64.tar.gz /usr/local
 ---> Using cache
 ---> d51c7dffbc1d
Step 4/9 : ENV JAVA_HOME /usr/local/jdk1.8.0_291
 ---> Using cache
 ---> c99e3768c946
Step 5/9 : ADD apache-tomcat-10.0.7.tar.gz /usr/local
 ---> Using cache
 ---> 3a7f473170ca
Step 6/9 : RUN rm -f /usr/local/*.tar.gz
 ---> Using cache
 ---> 90c3259eee5a
Step 7/9 : WORKDIR /usr/local/apache-tomcat-10.0.7
 ---> Using cache
 ---> 9f498429795c
Step 8/9 : EXPOSE 8080
 ---> Using cache
 ---> 8c5c22e0e5ec
Step 9/9 : ENTRYPOINT ["./bin/catalina.sh","run"]
 ---> Using cache
 ---> 60243da1ed7e
Successfully built 60243da1ed7e
Successfully tagged tomcat:v10.0.7

  • docker build -t tomcat:v10.0.7 -f Dockerfile /home/test :文件路径在/home/test下和dockerfile(在/home目录下)不在同一个路径下时,单独指明dockerfile文件路径
    docker build相关命令更多查看docker build --help
  1. 查看编译好的镜像文件
    在这里插入图片描述
  2. 制作好的镜像文件启动docker应用
  • 如下执行命令后,启动容器成功(-d参数表示后台运行,,-p指定映射的端口,详见更多容器相关命令
  • 通过docker ps可以看到运行的容器
  • 通过netstat -ntlp|grep 8080可以看到服务器的8080端口已被docker应用占用
root@test:/home# docker run -d -p 8080:8080 tomcat:v10.0.7
2216733dba525101caa36ae5d48afe5cc2e829361b5822c092c5fe48fa666c64
root@test:/home# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
2216733dba52        tomcat:v10.0.7      "./bin/catalina.sh r…"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp   goofy_minsky
root@test:/home# netstat -ntlp|grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      14094/docker-proxy
  1. 验证制作的镜像是否可用
    通过ip地址+端口访问tomcat,可以访问则表示成功
    在这里插入图片描述

Dockerfile文件中配置项说明

  • FORM 构建的基础镜像
  • MAINTAINER镜像创建者
  • ENV设置环境变量
  • COPY将编译机本地文件考本到镜像文件系统中
  • EXPOSE指定docker容器中监听的端口
  • ADD 拷贝文件或目录到镜像,URL地址或者压缩包会自动下载或解压(和copy相同类似,但是copy命令对于压缩包不会进行解压,只会拷贝压缩包的名字)
  • RUN 镜像创建的时候执行的命令
  • WORKDIR 设置进入容器时的路径
  • ENTRYPOINT使用此镜像文件创建容器时才会执行的命令
  • CMD一般情况下和entrypoint作用等同,但cmd里写的参数时可变的(docker run运行容器如果带了参数会覆盖cmd中的参数),而entrypoint的则不会,所以针对可变参数一般写在cmd里,不可变的写在entrypoint里
    注意:如果写了多个cmd,只有最后一个才会起作用

entrypoint和cmd两者使用格式:

CMD command param
CMD ["<executeable>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...]该写法是为 ENTRYPOINT 指令指定的程序提供默认参数;
ENTRYPOINT <command>
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值