【Docker】构建镜像

一般来说我们不需要自己构建镜像,这些镜像在docker hub上面已经有现成的了,比如常用的数据库、应用软件等。

某些情况我们还是需要自己来构建:

  • 找不到现成的镜像,比如自己开发的应用程序

  • 需要在镜像中加入特定的功能/软件

Docker提供了两种构建镜像的方法:

  1. docker commit 命令

  2. Dockerfile 文件

1、Docker commit 构建新的镜像

docker commit [容器ID] [仓库名:版本号]

缺点:

  • 手工创建生成,容易出错,重复性低

  • 安全问题

  • 根据已有容器来构建新的镜像

例:根据已经有的tomcat容器,构建新的镜像 c1_tomcat:0.0.1

【Docker】构建镜像_第1张图片

2、Dockerfile 构建新的镜像

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随着各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

2.1 Dockerfile 语法

FROM

指定base镜像(尽量使用官方的镜像作为base镜像),在哪一个image的基础上创建

FROM centos:7.8.2003
​
FROM ubuntu:14.04
​
FROM tomcat:8.5.40  //里面包含了jdk
​
FROM mysql:5.7
LABEL

指定镜像所属信息(作者/版本/描述等)

LABEL maintainer="[email protected]"
​
LABEL version="1.0"
​
LABEL description="description info"
RUN

通常用于安装软件包 / 执行...命令

RUN yum install -y vim
WORKDIR

设置当前的工作目录

WORKDIR /test  #如果目录不存在则自动创建

⚠️需要注意的是尽量使用绝对路径

COPY

从主机的文件系统上复制文件到镜像中

WORKDIR /home
COPY hello .
ADD

与COPY类似,不同的是,如果文件是压缩文件,会自动解压缩

WORKDIR /home
ADD test.tar.gz .
ENV

设置环境变量

WORKDIR /opt
ADD jdk-8u121-linux-x64.tar.gz .
ENV CLASSPATH $JAVA_HOME/lib

EXPOSE

 向外暴露端口

expose 8080 //向外暴露8080端口
ENTRYPOINT vs CMD

两者都是作为容器启动时运行的命令

1. CMD:

首先要明确docker run指令中的参数是什么?(原文链接:Docker之docker run参数覆盖Dockerfile中CMD命令以及CMD与ENTRYPOINT的区别_docker run 覆盖cmd-CSDN博客

—— docker run 指令(-it/-p/-d等) 镜像名 参数(/bin/sh、bash等),即docker run命令中,镜像名后面的 都是给容器执行的命令参数

docker run 运行容器时,不加任何参数,会自动执行CMD,

如果添加参数则会忽略CMD,比如:docker run -it test bash中的bash命令参数覆盖了CMD。

如果有多个CMD,则只有最后一个会执行,其他都会被忽略

2. ENTRYPOINT

运行容器时,如果添加参数不会忽略ENTRYPOINT

2.2 Dockerfile构建镜像命令

docker build -t [仓库名]:[版本号] -f [Dockerfile文件名] .

 docker build -t ch_ubuntu:0.0.1 -f ch_dockerfile . 

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