文章目录
一、DockerFile概述
官方说明文档
DockerFile是用来构建Docker镜像得文本文件,是由一条条构建镜像所需得指令和参数构成的脚本。
二、构建步骤
1、编写DockerFile文件
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
2、docker build命令构建镜像
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚刚提交的镜像运行一个新容器
- 执行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