Dockerfile

Tips:学习要学会去百度搜索图片,
例如:去百度图片搜索Dockerfile命令,就会给出对应的命令和命令什么含义。

Dockerfile再总结

注意事项

  • 每个关键字都是大写字母
  • 执行顺序从上到下
  • 井号#表示注释
  • 每个指令都会创建一个镜像层,并提交
    在这里插入图片描述

使用步骤

1
2
3
4
5
6
7
使用三步骤 
1,编写Dockerfile
2,docker build -f /everything/docker/Dockerfile -t panfeng:1 .
* -f 指定Dockerfile文件。不加默认在当前路径找名称“ Dockerfile ”的文件
* -t 代表镜像名称 panfeng 镜像标签 1,标签不写默认为latest
* . 代表当前目录
3,docker run ...

Dockerfile命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1,基础镜像。基于哪个镜像进行构建
FORM java:8

2,镜像谁写的,姓名+邮箱
MAINTAINER 镜像姓名

LABEL key=value key=value 可以指定多个

3,构建过程中设置环境变量
ENV

4,镜像工作目录,docker exec -it进入容器之后的默认目录
WORKDIR

5,拷贝进来并解压
ADD

6,将文件拷贝镜像中,类似ADD,有区别
COPY

7,容器构建时需要运行的命令
RUN

8,挂载目录(容器卷),用户持久化,与Linux同步
VOLUME

9,容器向外暴露端口
EXPOSE

10,可以有多个命令,只有最后一个生效,会被docker run 命令替换
CMD

11,和cmd差不多,但会执行多行,docker run命令会追加,
ENTRYPOINT

12,触发指令,了解
ONBUILD

CMD/ENTRYPOINT

1
2
FROM centos
CMD ["ls","-a"]

docker run 镜像id #会打印容器工作目录的ls -a的内容,不会进入容器
docker run 镜像id -l #会出错,因为-l会替代ls -a命令,因为-l这个不是一个命令
docker run 镜像id ls -al 可以执行,会打印工作目录的ls -al的内容,不会进入容器,因为ls -al会替换Dockerfile最后一个CMD命令的ls -a。

1
2
FROM centos
ENTRYPOINT ["ls","-a"]

docker run 镜像id #同上面一样,会打印容器工作目录的ls -a的内容,不会进入容器
docker run 镜像id -l #打出来的是ls -al的效果

案例

mycentos

构建自己centos,拥有vim 和 ifconfig命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
FROM centos
MAINTAINER taopanfeng<1801957499@qq.com>

#指定环境变量 K,V格式
ENV MYPATH /usr/local
#指定进入容器后的目录
WORKDIR $MYPATH

#执行多个命令
RUN yum -y install vim
RUN yum -y install net-tools

#容器向外暴露的端口
#EXPOSE 80 81可指定多个
EXPOSE 80

#指定多个,只有最后一个生效
#最后一个上面的都会在构建的时候执行一下
CMD echo $MYPATH
CMD echo "done..."
CMD /bin/bash

---

docker build -f /app/docker/Dockerfile01 -t mycentos:1.0 .
-f 指定Dockerfile文件,不指定会找到当前路径下名称为Dockerfile的文件
-t 镜像名称:标签,不写标签,默认为latest
注意:最后面有一个.点

docker run -it mycentos:1.0
进入之后,就是/usr/local目录,此时也可以使用vim ifconfig命令

FROM scratch
百分之99都镜像都是从它来的,最基础镜像,引导加载

# 查看镜像构建过程
docker history 镜像id

JDK8,Tomcat9

当前要有
、Dockerfile
、readme.md
、jdk-8u11-linux-x64.tar.gz
、apache-tomcat-9.0.22.tar.gz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FROM centos
MAINTAINER taopanfeng<1801957499@qq.com>

COPY readme.md /usr/local/readme.md

ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && \
tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

---

# 构建镜像。默认标签latest
docker build -t diytomcat .

# 启动容器
docker run --name tomcat01 -p 8080:8080 \
-v /app/docker/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \
-v /app/docker/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs \
-d diytomcat

在/app/docker/tomcat/test下面创建WEB-INF目录里面放web.xml文件

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

</web-app>

在/app/docker/tomcat/test下面创建index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8">
<title>首页</title>
</head>
<body>
Hello World!
<%
System.out.println(LocalDateTime.now());
%>
</body>
</html>

就可以看到/app/docker/tomcat/logs/catalina.out看到日志

nginx

Dockerfile初体验 2019-09-19 13:43:52

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
创建一个文件夹
mkdir -p /nginx

进入创建的目录
cd /nginx

创建并编辑 添加下面两行
vim Dockerfile

行1,去本地找基础的镜像
FROM nginx
行2,把<h1>I'm index.html...</h1>写到 /usr/share/nginx/html/index.html文件中
RUN echo "<h1>I'm index.html...</h1>" > /usr/share/nginx/html/index.html

构建镜像 nginx代表镜像名称 taopanfeng相当于版本号 .代表当前目录
docker build -t nginx:taopanfeng .

运行容器
docker run --name nginx_01 -p 91:80 -d nginx:taopanfeng

Windows访问 192.168.1.3:91 就可以显示我们往index.html中写入的内容了

springboot项目

Dockerfile初体验 2019-09-19 13:43:52

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
部署
mkdir -p /app/test
cd /app/test

1,spring快速创建项目
2,添加web启动器
3,在application.properties中添加server.port=8101
4,在Controller创建一个方法 GetMapping("hello")返回 I'm hello...
5,直接maven clear package
6,把target中的jar包传到 /app/test

vim Dockerfile
###
# 基于java:8 这个镜像
FROM java:8
# 将本地文件夹挂载到容器的/tmp
VOLUME /tmp
# 把这个jar添加到容器的根目录 并改名为 app.jar
ADD panfeng-register-1.0.0-SNAPSHOT.jar /app.jar
# 向外暴露8101 也就是Docker容器的端口为8101
EXPOSE 8101
# 配置容器启动后执行 java -jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
###

创建镜像 test镜像名 0.0.1版本号 .代表当前目录
docker build -t test:0.0.1 .

执行容器端口8101 Linux端口8102 容器名称 test01
docker run --name test01 -p 8102:8101 -d test:0.0.1

这里test01就是我们刚才启动的名称,显示出信息IPAddress对应就是容器ip
docker inspect test01

Linux---访问 返回I'm hello...
这里表示Linux访问容器的ip和端口 因为那个jar是在容器中执行的
curl 172.17.0.4:8101/hello

Windows---浏览器访问 返回I'm hello...
这里表示Windows访问Linux的ip和端口
因为Windows不能访问容器 需要通过Linux的ip加上docker run中的-p代理的端口访问
192.168.1.3:8102/hello