最近在学Docker,花了很多时间,算是把Docker的一些基本使用方法get到了,现在记录下

1. Docker基础知识

1. 什么是Docker

image-20200404105433120.png

官网的介绍是“Docker is the world’s leading software container platform.” 官方给Docker的定位是一个应用容器平台

Docker 是一个容器平台的领导者 Docker 容器平台 Docker 应用容器平台

1.2 为什么使用Docker

  • 合作开发的时候,在本机可以跑,别人的电脑跑不起来

    这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、spring等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序直接打包成镜像,直接运行在容器中即可。

  • 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了

    这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。

  • 公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器

    在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。

1.3 Docker和虚拟机的区别

比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。

传统虚拟机 Docker容器
磁盘占用 几个GB到几十个GB左右 几十MB到几百MB左右
CPU内存占用 虚拟操作系统非常占用CPU和内存 Docker引擎占用极低
启动速度 (从开机到运行项目)几分钟 (从开启容器到运行项目)几秒
安装管理 需要专门的运维技术 安装、管理方便
应用部署 每次部署都费时费力 从第二次部署开始轻松简捷
耦合性 多个应用服务安装到一起,容易互相影响 每个应用服务一个容器,达成隔离
系统依赖 需求相同或相似的内核,目前推荐是Linux

1.4 Docker 的核心

  • 镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等
  • 容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
  • 仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
  • dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
  • tar:一个对镜像打包的文件,日后可以还原成镜像

2. Docker常用操作(centos7.X)

2.1 Docker的安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1、检查内核版本,必须是3.10及以上 
uname ‐r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker ‐v
Docker version 1.13.1, build 7d71120/1.13.1
5、开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi‐user.target.wants/docker.service to
/usr/lib/systemd/system/docker.service.
6、停止docker
systemctl stop docker
7、阿里云镜像加速
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://77t1qhyj.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker

需要注意的是Docker只适合linux内核版本在3.10及以上的,我用的centos,那就需要7.X,所以之前的centos6.X就不行了。

安装完成后,我们一般都会设置开机启动Docker,假如是本地的虚拟机就需要修改镜像拉取地址,不然docker官方的镜像地址就很慢了,而且很容易失败。这里我使用阿里云的镜像加速,在阿里云里搜索镜像加速即可找到。

若是用到云服务器,比如阿里云,腾讯云就不需要了~

配置完记得重新加载配置,再重启下Docker即可。

启动Docker

1
systemctl start docker

关闭Docker

1
systemctl stop docker

2.2 Docker的常用操作

  1. 镜像操作
操作 命令 说明
检索 docker search 关键字 eg:docker search redis 可以去Docker Hub查找镜像的详细信息
拉取 docker pull 镜像名:tag :tag是可以选的,表示标签,多为版本号,如果省略,即为latest
列表 docker images 查看本地所有镜像
删除 docker rmi image-id 删除指定的本地镜像

2.容器操作

从上文我们就已经知道Docker是容器应用平台,那什么是容器呢?

简单的来说,就是运行起来的镜像

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
# 1.运行容器
docker run 镜像名 -------------------------- 镜像名新建并启动容器
--name 别名为容器起一个名字
-d 启动守护式容器(在后台启动容器)
-p 映射端口号:原始端口号 指定端口号启动

例:docker run -it --name myTomcat -p 8888:8080 tomcat
docker run -d --name myTomcat -P tomcat

# 2.查看运行的容器
docker ps -------------------------- 列出所有正在运行的容器
-a 正在运行的和历史运行过的容器
-q 静默模式,只显示容器编号

# 3.停止|关闭|重启容器
docker start 容器名字或者容器id --------------- 开启容器
docker restart 容器名或者容器id --------------- 重启容器
docker stop 容器名或者容器id ------------------ 正常停止容器运行
docker kill 容器名或者容器id ------------------ 立即停止容器运行

# 4.删除容器
docker rm -f 容器id和容器名
docker rm -f $(docker ps -aq) -------------------------- 删除所有容器

# 5.查看容器内进程
docker top 容器id或者容器名 ------------------ 查看容器内的进程

# 6.查看查看容器内部细节
docker inspect 容器id ------------------ 查看容器内部细节

# 7.查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名 ------------------ 查看容器日志
-t 加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后多少条

这里我们以安装Tomcat为例,记录操作全过程:

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
43
#在Docker Hub上查找自己需要的Tomcat版本,由于Tomcat需要JDK环境,所以下载的镜像中包含JDK,我们直接使用拉取命令即可
[root@hspEdu01 ~]# docker pull tomcat:9.0.46-jdk8
Trying to pull repository docker.io/library/tomcat ...
9.0.46-jdk8: Pulling from docker.io/library/tomcat
d960726af2be: Pull complete
e8d62473a22d: Pull complete
8962bc0fad55: Pull complete
65d943ee54c1: Pull complete
da20b77f10ac: Pull complete
fb6a778e6477: Pull complete
ae7884f0e61b: Pull complete
5a229cc6592e: Pull complete
efb3915175c2: Pull complete
805021669e73: Pull complete
Digest: sha256:36c2088c48cb29bb093abce58527259fe70f7feaccc3820cdbf1ca21caa76785
Status: Downloaded newer image for docker.io/tomcat:9.0.46-jdk8
[root@hspEdu01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/tomcat 9.0.46-jdk8 7253c7ce0ab9 4 weeks ago 534 MB
[root@hspEdu01 ~]# docker run -d -p 8080:8080 --name tomcat01 7253c7ce0ab9
a3ec9a313973f624836fc5caf46b001d7fd3c1d8932c33702730e010870d142b
[root@hspEdu01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3ec9a313973 7253c7ce0ab9 "catalina.sh run" 5 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp tomcat01
[root@hspEdu01 ~]#
#打开浏览器 访问http://192.168.27.129:8080/ 出现tomcat,说明启动成功
#我们还可以通过以下命令查看容器日志
[root@hspEdu01 ~]# docker logs -f a3ec
#进去容器
[root@hspEdu01 ~]# docker exec -it a3ec bash
root@a3ec9a313973:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@a3ec9a313973:/usr/local/tomcat# cd webapps
root@a3ec9a313973:/usr/local/tomcat/webapps# ls
root@a3ec9a313973:/usr/local/tomcat/webapps# cd ../conf
root@a3ec9a313973:/usr/local/tomcat/conf# ls
Catalina catalina.properties jaspic-providers.xml logging.properties tomcat-users.xml web.xml
catalina.policy context.xml jaspic-providers.xsd server.xml tomcat-users.xsd
root@a3ec9a313973:/usr/local/tomcat/conf# vim server.xml
bash: vim: command not found
root@a3ec9a313973:/usr/local/tomcat/conf# exit
exit

到这里,出现了一个问题,我们一般部署tomcat项目,都是把项目拷贝到webapps下,tomcat即可自带解析运行项目,但我们有时候还需要配置下默认端口,8080->80,默认访问路径,就需要修改server.xml,web.xml,但我们发现用vim并不行,而且每次都要使用命令进容器,就特别不方便,而且容器一旦被删除,数据也没了。

这时候我们可以选择数据卷的方式,让容器和宿主机建立直接的物理管理,第一是方便操作,第二是可以对数据进行持久化,比如Mysql的数据库

数据卷也很简单,一般是两种:

  • 直接命名数据卷,让Docker去创建
  • 把容器位置和宿主机文件目录建立联系

两者其实是一样的,这里我们都试试吧

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[root@hspEdu01 ~]# docker rm -f a3ec
a3ec
[root@hspEdu01 ~]# docker run -d -p 8080:8080 -v webapps:/usr/local/tomcat/webapps -v webconf:/usr/local/tomcat/conf --name tomcat 7253c7ce0ab9
21795689b90c0447b10250fd3b36b96232188b4f16c88f14a434469cd4e33f0f
[root@hspEdu01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21795689b90c 7253c7ce0ab9 "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp tomcat
#查看本地所有数据卷
[root@hspEdu01 ~]# docker volume ls
DRIVER VOLUME NAME
local webapps
local webconf
[root@hspEdu01 ~]# docker inspect webapps
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/webapps/_data",
"Name": "webapps",
"Options": {},
"Scope": "local"
}
]
[root@hspEdu01 ~]# cd /var/lib/docker/volumes/webapps/_data
[root@hspEdu01 _data]# ls
[root@hspEdu01 _data]# touch a.html
[root@hspEdu01 _data]# vim a.html
[root@hspEdu01 _data]# cat a.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h3>Tomcat</h3>
</body>
</html>

[root@hspEdu01 _data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21795689b90c 7253c7ce0ab9 "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp tomcat
#进入容器
[root@hspEdu01 _data]# docker exec -it 2179 bash
root@21795689b90c:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@21795689b90c:/usr/local/tomcat# cd webapps
root@21795689b90c:/usr/local/tomcat/webapps# ls
a.html
root@21795689b90c:/usr/local/tomcat/webapps# exit
exit
[root@hspEdu01 _data]# docker restart 2179
2179
[root@hspEdu01 _data]# docker inspect webconf
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/webconf/_data",
"Name": "webconf",
"Options": {},
"Scope": "local"
}
]
[root@hspEdu01 _data]# cd /var/lib/docker/volumes/webconf/_data
[root@hspEdu01 _data]# ls
Catalina catalina.properties jaspic-providers.xml logging.properties tomcat-users.xml web.xml
catalina.policy context.xml jaspic-providers.xsd server.xml tomcat-users.xsd
[root@hspEdu01 _data]#

可以发现,宿主机,已经和容器目录建立联系,下面只是把左边的wenapps改成宿主机的文件夹即可

现在我们来装下mysql,不仅涉及到数据卷,还涉及到用户账号的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@hspEdu01 data]# docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --privileged=true -d mysql:5.7
95628d5d89c5c1513e1046bb19181007c2dfc43ea1f3132472ff57f4453fda7b
[root@hspEdu01 data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95628d5d89c5 mysql:5.7 "docker-entrypoint..." 3 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
[root@hspEdu01 data]# cd /root
[root@hspEdu01 ~]# ls
anaconda-ks.cfg data data2 initial-setup-ks.cfg mysql 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@hspEdu01 ~]# cd mysql/
[root@hspEdu01 mysql]# ls
conf.d data
[root@hspEdu01 mysql]# cd conf.d/
[root@hspEdu01 conf.d]# ls
[root@hspEdu01 conf.d]# cd ../data/
[root@hspEdu01 data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
[root@hspEdu01 data]#

可以看到确定把mysql的配置目录和数据库存储目录挂载到宿主机了,我们用navicat测试,连接成功!

为什么要把mysql容器的data挂载出去呢?因为容器是不为应用提供任何持久化操作的,一旦容器关闭,数据也没了,假如是这样,数据库存在的意义也就没了,所以需要把也是必须把数据库的存储数据的文件夹挂载到宿主机上。

基本上镜像的启动也就只需要注意端口映射,数据卷的设置,用户账号密码的设置,其它的可以参考Docker Hub中,对相应镜像启动都给出了参考。

注:–privileged=true 是由于权限问题,需要带入权限才能正常启动,假如你能正常启动,就不需要带这个参数

3. Dockerfile

3.1什么是Docerfile

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件

通过架构图可以看出通过DockerFile可以直接构建镜像

3.2 Dockerfile解析过程

3.3 Dockerfile的保留命令

官方说明:https://docs.docker.com/engine/reference/builder/

保留字 作用
FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROM
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 构建镜像时需要运行的指令
EXPOSE 当前容器对外暴露出的端口号
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY 类似于ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

3.3.1 FROM 命令

  • 基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现

  • 语法:

    1
    2
    3
    FROM  <image>
    FROM <image>[:<tag>] 使用版本不写为latest
    FROM <image>[@<digest>] 使用摘要

3.3.2 MAINTAINER 命令

  • 镜像维护者的姓名和邮箱地址[废弃]

  • 语法:

    1
    MAINTAINER <name>

3.3.3 RUN 命令

  • RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步

  • 语法:

    1
    2
    3
    4
    5
    RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
    RUN echo hello

    RUN ["executable", "param1", "param2"] (exec form)
    RUN ["/bin/bash", "-c", "echo hello"]

3.3.4 EXPOSE 命令

  • 用来指定构建的镜像在运行为容器时对外暴露的端口

  • 语法:

    1
    2
    EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
    EXPOSE 80/udp

3.3.5 CMD 命令

  • 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 语法:

    1
    2
    3
    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)

3.3.6 WORKDIR 命令

  • 用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

  • 语法:

    1
    2
    3
    4
    5
    6
    WORKDIR /path/to/workdir

    WORKDIR /a
    WORKDIR b
    WORKDIR c
    `注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`

3.3.7 ENV 命令

  • 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

  • 语法:

    1
    2
    ENV <key> <value>
    ENV <key>=<value> ...

3.3.8 ADD 命令

  • 用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。

  • 语法:

    1
    2
    3
    4
    5
    ADD hom* /mydir/       通配符添加多个文件
    ADD hom?.txt /mydir/ 通配符添加
    ADD test.txt relativeDir/ 可以指定相对路径
    ADD test.txt /absoluteDir/ 也可以指定绝对路径
    ADD url

3.3.9 COPY 命令

  • 用来将context目录中指定文件复制到镜像的指定目录中

  • 语法:

    1
    2
    COPY src dest
    COPY ["<src>",... "<dest>"]

3.3.10 VOLUME 命令

  • 用来定义容器运行时可以挂在到宿主机的目录

  • 语法:

    1
    VOLUME ["/data"]

3.3.11 ENTRYPOINT命令

  • 用来指定容器启动时执行命令和CMD类似

  • 语法:

    1
    2
    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2

    ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
    CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

3.3.11 ENTRYPOINT命令

  • 用来指定容器启动时执行命令和CMD类似

  • 语法:

    1
    2
    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2

    ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
    CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

4. Dockerfile构建springboot项目部署

4.1 准备一个springboot项目

这里推荐个小技巧,可以用idea中的tools连接虚拟机,相当于一个简单的xftp,在虚拟机中新建个文件夹,用于存放镜像打包所需的材料

4.2 编写Dockerfile文件

这里可以在idea中安装个Docker插件,即可支持Dockerfile代码提示

1
2
3
4
5
6
FROM openjdk:8-jre
WORKDIR /app
ADD dockerfile-test-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8010
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]

Java项目肯定需要jdk环境的,所以需要首先拉取jdk镜像

4.3 把Dockerfile和jar文件拖入到文件夹里

4.4 详细的命令记录

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
43
44
45
46
47
48
49
50
51
52
53
[root@hspEdu01 dockerfile-test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/tomcat 9.0.46-jdk8 7253c7ce0ab9 4 weeks ago 534 MB
docker.io/mysql 5.7 2c9028880e58 4 weeks ago 447 MB
docker.io/openjdk 8 eca41db787bd 4 weeks ago 514 MB
[root@hspEdu01 dockerfile-test]# docker build -t app .
Sending build context to Docker daemon 17.08 MB
Step 1/6 : FROM openjdk:8-jre
Trying to pull repository docker.io/library/openjdk ...
8-jre: Pulling from docker.io/library/openjdk
d960726af2be: Already exists
e8d62473a22d: Already exists
8962bc0fad55: Already exists
961f7da1b9e5: Pull complete
7ba190cfbc66: Pull complete
595e52ef2a1b: Pull complete
Digest: sha256:5f5917a0754c79104a0025d3debb2bdc0c2fc11d60e80e008e9de89822281e46
Status: Downloaded newer image for docker.io/openjdk:8-jre
---> a979584e265d
Step 2/6 : WORKDIR /app
---> ed8a0ad97eb5
Removing intermediate container a4d123dd9196
Step 3/6 : ADD dockerfile-test-0.0.1-SNAPSHOT.jar app.jar
---> 53cd89081273
Removing intermediate container 93713300ae57
Step 4/6 : EXPOSE 8010
---> Running in 8bf5e5054545
---> a550b7d7348e
Removing intermediate container 8bf5e5054545
Step 5/6 : ENTRYPOINT java -jar
---> Running in a8596518fb47
---> c5097be2928d
Removing intermediate container a8596518fb47
Step 6/6 : CMD app.jar
---> Running in 4c3318ac728d
---> a8e34817044f
Removing intermediate container 4c3318ac728d
Successfully built a8e34817044f
[root@hspEdu01 dockerfile-test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest a8e34817044f 43 seconds ago 285 MB
docker.io/tomcat 9.0.46-jdk8 7253c7ce0ab9 4 weeks ago 534 MB
docker.io/mysql 5.7 2c9028880e58 4 weeks ago 447 MB
docker.io/openjdk 8-jre a979584e265d 4 weeks ago 268 MB
docker.io/openjdk 8 eca41db787bd 4 weeks ago 514 MB
[root@hspEdu01 dockerfile-test]# docker run -d -p 8010:8010 a8e34
760a2956258e4b6d0f56351597049f45677bed264aa5241ba1f584e0e2d38645
[root@hspEdu01 dockerfile-test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
760a2956258e a8e34 "java -jar app.jar" 4 seconds ago Up 2 seconds 0.0.0.0:8010->8010/tcp adoring_pare
95628d5d89c5 mysql:5.7 "docker-entrypoint..." 42 minutes ago Up 42 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
[root@hspEdu01 dockerfile-test]#

4.5 测试接口

Docker的操作远不如此,这里仅仅只是入门,后面会继续更新的~