DockerFile


一、DockerFile概述

官方说明文档
DockerFile是用来构建Docker镜像得文本文件,是由一条条构建镜像所需得指令和参数构成的脚本。在这里插入图片描述

二、构建步骤

在这里插入图片描述

1、编写DockerFile文件

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

2、docker build命令构建镜像

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

3、docker run用镜像运行容器实例

三、DockerFile常用保留字指令

FROM #指定当前镜像的基础镜像

MAINTAINER #指定当前镜像的维护者姓名和邮箱地址

ENV #设置环境变量

USER

RUN :容器构建时需要运行的命令 即 docker build时执行
shell格式:
RUN <命令行命令>
ex:RUN yum install vim
exec格式:
RUN[“可执行文件”,”参数1“,”参数2“,…]

WORKDIR:终端默认登录落脚点

ADD : 将宿主机中的文件拷贝到镜像内,并自动处理URL和解压缩

COPY

VOLUME:容器卷

EXPOSE:当前容器对外暴露的端口

ENTRYPOINT:docker run时运行的命令,不会被docker run后面的指令覆盖掉
命令格式:ENTRYPOINT["执行语句","参数1","参数2","参数3"......]
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令
案例如下:假设已通过 Dockerfile 构建了 nginx:test 镜像:在这里插入图片描述在这里插入图片描述

CMD:指定容器启动后要执行的指令即docker run时执行
cmd可以有多个,但是只有最后一个会生效 会被docker run后面的指令参数覆盖掉

四、DockerFile创建一个CentOS镜像

1、目标

创建一个自带ifconfig,vim命令,jdk的 centOS

2、步骤

1)创建一个空文件夹

[root@localhost /]# cd /
[root@localhost /]# mkdir mydockerfile

2)将jdk的jar包下载到/mydockerfile路径下

[root@localhost /]# cd /mydockerfile
[root@localhost mydockerfiles]# pwd
/mydockerfiles
[root@localhost mydockerfiles]# wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz
--2022-11-12 14:30:41--  https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz
Resolving download.oracle.com (download.oracle.com)... 23.36.48.85
Connecting to download.oracle.com (download.oracle.com)|23.36.48.85|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 189905998 (181M) [application/x-gzip]
Saving to: ‘jdk-19_linux-x64_bin.tar.gz’

jdk-19_linux-x64_bin.tar.gz             100%[===============================================================================>] 181.11M  4.81MB/s    in 36s

2022-11-12 14:31:23 (4.97 MB/s) - ‘jdk-19_linux-x64_bin.tar.gz’ saved [189905998/189905998]

[root@localhost mydockerfiles]# ll
total 185456
-rw-r--r--. 1 root root 189905998 Oct 13 00:24 jdk-19_linux-x64_bin.tar.gz
[root@localhost mydockerfiles]#

3)创建Dockerfile文件

文件名必须时Dockerfile,首字母大写

[root@localhost mydockerfiles]# ll
total 185456
-rw-r--r--. 1 root root 189905998 Oct 13 00:24 jdk-19_linux-x64_bin.tar.gz
[root@localhost mydockerfiles]# touch Dockerfile
[root@localhost mydockerfiles]#

4)编写Dockerfile

(这里的基础镜像建议使用centos7系统 ,默认最新的centos8镜像相关的网络源有问题)
下面文件中的jdk-19_linux-x64_bin.tar.gz 要保证与Dockerfile文件在同一个路径

FROM centos:7
MAINTAINER qlx<104590678@163.com>

ENV MYPATH /data/java
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java及lib库
RUN mkdir -p /data/java
#ADD 是相对路径jar,把jdk-19_linux-x64_bin.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-19_linux-x64_bin.tar.gz /data/java/
#配置java环境变量
ENV JAVA_HOME /data/java/jdk-19.0.1
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 99

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

5)修改配置

进入 /etc/yum.repos.d
vim docker-ce.repo
enabled=1改成enabled=0
目的:解决报错:Error: Cannot retrieve repository metadata (repomd.xml) for repository: docker-ce-nightly. Please ve

6)构建镜像

 [root@localhost mydockerfiles]# docker build -t centos_java19:1.0 .
Sending build context to Docker daemon  189.9MB
Step 1/16 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/16 : MAINTAINER qlx<104590678@163.com>
 ---> Running in d5b33a90342b

7)创建容器

前台运行容器:

[root@localhost mydockerfiles]# docker run -it centos_java19:1.0 /bin/bash
[root@e685bca9062f java]# 

后台运行容器:
原来容器启动时,它是在后台对应着一个线程启动的,它在启动时是已经启动了,但它执行完命令后,就退出了,并没有在后台运行着,所以使用 -dit 参数让它在后台运行即可。

[root@localhost mydockerfiles]# docker run -dit centos_java19:1.0
850ed6df4ba1979c0e4ca45a6cf0cbf939855af66b4a420641b8084a760282b6
[root@localhost mydockerfiles]# docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS                      PORTS     NAMES
850ed6df4ba1   centos_java19:1.0   "/bin/sh -c /bin/bash"   3 seconds ago    Up 3 seconds                99/tcp    xenodochial_joliot
e685bca9062f   centos_java19:1.0   "/bin/bash"              8 minutes ago    Exited (0) 7 minutes ago              eloquent_kalam
5a3c3a20ac3a   centos_java19:1.0   "/bin/bash"              10 minutes ago   Exited (0) 8 minutes ago              beautiful_kilby
33b0f80f7275   centos_java19:1.0   "/bin/sh -c /bin/bash"   11 minutes ago   Exited (0) 11 minutes ago             beautiful_keldysh
61fb73ff37f4   1466c80bc4a4        "/bin/sh -c 'yum -y …"   25 minutes ago   Exited (1) 25 minutes ago             quizzical_haslett
6d6bce2538d0   1466c80bc4a4        "/bin/sh -c 'yum -y …"   26 minutes ago   Exited (1) 26 minutes ago             trusting_torvalds
1dddbb4a6957   1466c80bc4a4        "/bin/sh -c 'yum -y …"   28 minutes ago   Exited (1) 28 minutes ago             flamboyant_keller
546a6db76c16   907e44090d85        "/bin/sh -c 'yum -y …"   54 minutes ago   Exited (1) 54 minutes ago             distracted_pasteur

五、DockerFile创建一个Redis镜像

六、DockerFile创建一个Nginx镜像

七、DockerFile创建一个SpringBoot项目镜像

1、准备jar包

注意:pom依赖添加如下,将启动文件需改成自己的

   <packaging>jar</packaging>
   <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定该Main Class为全局的唯一入口 -->
                    <mainClass>com.buba.TestServer</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!--可以把依赖的包都打包到生成的Jar包中-->
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2、上传jar包与Dockerfile在同一个路径

[root@localhost data]# pwd
/data
[root@localhost data]# ll
total 16232
-rw-r--r--. 1 root root      467 Nov 13 18:57 Dockerfile
-rw-r--r--. 1 root root 16613802 Nov 13 19:04 test-server-1.0-SNAPSHOT.jar

3、创建Dockerfile

order-server-0.0.1-SNAPSHOT.jar文件需要与Dockerfile文件在同一个路径中

# 基础镜像使用java
FROM openjdk:11
# 作者
MAINTAINER qlx
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为test-server.jar
ADD test-server-1.0-SNAPSHOT.jar test-server.jar
# 运行jar包
RUN bash -c 'touch /test-server.jar'
ENTRYPOINT ["java","-jar","/test-server.jar"]
#暴露7001端口作为微服务
EXPOSE 7001

4、构建镜像

注意后面 .

docker build -t test-server:1.0 .
[root@localhost data]# ll
total 4
-rw-r--r--. 1 root root 467 Nov 13 18:57 Dockerfile
drwxr-xr-x. 2 root root   6 Nov  8 22:40 docker-registry
[root@localhost data]# docker build -t test-server:1.0 .
Sending build context to Docker daemon  16.62MB
Step 1/7 : FROM openjdk:11
 ---> 5505a9a39df1
Step 2/7 : MAINTAINER qlx
 ---> Running in a330169b0c74
Removing intermediate container a330169b0c74
 ---> aac4cfc75c9d
Step 3/7 : VOLUME /tmp
 ---> Running in cb8a1f901d13
Removing intermediate container cb8a1f901d13
 ---> 1775a54d1071
Step 4/7 : ADD test-server-1.0-SNAPSHOT.jar test-server.jar
 ---> e02c2b2a5bc7
Step 5/7 : RUN bash -c 'touch /test-server.jar'
 ---> Running in aa40a47c3682
Removing intermediate container aa40a47c3682
 ---> 3678f7e172c1
Step 6/7 : ENTRYPOINT ["java","-jar","/test-server.jar"]
 ---> Running in 0b341ae2be97
Removing intermediate container 0b341ae2be97
 ---> 9c9d2e5f7c03
Step 7/7 : EXPOSE 7001
 ---> Running in e5b0b04de1e0
Removing intermediate container e5b0b04de1e0
 ---> 5f34e252bcf7
Successfully built 5f34e252bcf7
Successfully tagged test-server:1.0

查看镜像:

[root@localhost data]# docker images
REPOSITORY                                 TAG       IMAGE ID       CREATED         SIZE
test-server                                1.0       5f34e252bcf7   4 seconds ago   693MB

5、运行容器

[root@localhost data]# docker run -d -p 7001:7001 test-server:1.0
6d97d63294388bf4f43b9001a1ebd0a846900c846c4432eb0ee817a985635b43

6、查看容器

[root@localhost data]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS             PORTS                                       NAMES
6d97d6329438   test-server:1.0   "java -jar /test-ser…"   16 seconds ago   Up 6 seconds       0.0.0.0:7001->7001/tcp, :::7001->7001/tcp   wizardly_tharp

4、访问测试

在这里插入图片描述

八、虚悬镜像

进行仓库名和版本都是的镜像

1、虚悬镜像查询

docker image ls -f dangling=true

2、虚悬镜像删除

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值