java for developers_Docker for Java Developers

1.  基本概念

1.1.  主要组件

Docker有三个主要组件:

镜像是Docker的构建组件,而且是定义应用程序操作系统的只读模板

容器是Docker的运行组件,它是从镜像创建的。容器可以运行、启动、停止、移动和删除

镜像在注册中心中存储、共享和管理,并且是Docker的分发组件。Docker Store 是一个公开可用的注册中心。https://hub.docker.com/

为了上这三个组件协同工作,Docker守护进程(或者叫Docker容器)运行在一个主机上,并负责构建、运行和分发Docker容器。此外,客户端是一个Docker二进制文件,它接受来自用户的命令并与引擎来回通信。

518160bf44dcf58feda703e85df5777f.png

1.2.  Docker Image

Docker镜像是一个可以从其中启动Docker容器的只读模板。每个镜像又一系列的层组成。(PS:现在发现,把“Image”翻译成专业术语“镜像”的话这里就感觉跟别扭。原文是“Each image consists of a series of layers”,如果按“Image”本来的意思“图像”去理解就很好理解了,对PhotoShop有点儿了解的人都能理解这句话,“图像由一系列图层组成”,真是太形象了。)

Docker如此轻量级的原因之一就是这些层(图层)。当你修改镜像(例如,将应用程序更新到新版本)时,将构建一个新的层。因此,只添加或更新该层,而不是像使用虚拟机那样替换整个映像或完全重建。现在,您不需要发布整个新图像,只需要更新即可,从而使分发Docker镜像更快、更简单。(PS:越发觉得此处用“图像”更好理解,加个新图层或者在原先的图层上做修改即可)

每个镜像都是从一个基本镜像开始的。你也可以使用自己的镜像作为新镜像的基础。如果你有一个基本的Apache镜像,那么你可以使用它作为所有web应用程序镜像的基础。

d59ed937eb83954406c20fbd47e1ed2e.png

Docker使用一组称为指令的简单描述性步骤来构建镜像。每条指令在镜像中创建一个新层。

运行一条命令

添加一个文件或目录

创建一个环境变量

当启动一个容器时运行一个进程

这些指令被存储在一个叫“Dockerfile”的文件中。当你请求构建镜像时,Docker读取这个Dockerfile文件,然后执行这些指令,并返回最终的镜像。

(PS:关于镜像,记住下面两句话

Each image consists of a series of layers.

Each instruction creates a new layer in our image.

)

1.3.  Docker Container

容器由操作系统、用户添加的文件和元数据组成。正如我们所看到的,每个容器都是由一个镜像构建的。镜像告诉Docker容器持有什么、启动容器时运行什么进程以及各种其他配置数据。镜像是只读的。当Docker从映像运行容器时,它会在镜像之上添加一个读写层,然后你的应用程序就可以在其中运行了。

1.4.  Docker Engine

Docker Host是在安装Docker的时候创建的。一旦Docker Host被创建了,那么你就可以管理镜像和容器了。例如,你可以下载镜像、启动或停止容器。

1.5.  Docker Client

Docker Client与Docker Host通信,进而你就可以操作镜像和容器了。

2.  构建一个镜像

2.1.  Dockerfile

Docker通过从Dockerfile文件中读取指令来构建镜像。Dockerfile是一个文本文档,它包含用户可以在命令行上调用的所有命令来组装一个镜像。docker image build命令会使用这个文件,并执行其中的所有命令。

build命令还传递一个在创建映像期间使用的上下文。这个上下文可以是本地文件系统上的路径,也可以是Git存储库的URL。

下面是一些常用的命令:

5daeb39e7fa4594f148c9a8cea5d96ae.png

2.2.  创建你的第一个镜像

首先,创建一个目录hellodocker,然后在此目录下创建一个名为Dockerfile的文本文件,编辑该文件,内容如下:

cfb75c006c13aa7003b56078b370b91a.png

从以上两行命令我们可以看到,该镜像是以ubuntu作为基础基础,CMD命令定义了需要运行的命令。它提供了一个不同的入口/bin/echo,并给出了一个参数“hello world”。

269fd1d89649da47ffbb8835e335da29.png

d132950c88f565892cb1bd7310386c1b.png

2.3.  用Java创建你的第一个镜像

补充:OpenJDK是Java平台标准版的一个开源实现,是Docker官方提供的镜像

ea002798c8fa38949832843cc3f4da4d.png

首先,让我们创建一个java工程,然后打个jar包,接着创建并编辑Dockerfile

f9daa5d38d0a202d0ad3bf0bb8df025f.png

使用docker image build构建镜像

b26732ccea744d6133bf25a82494a6d4.png

使用docker container run启动容器

8c93756f6e7f389b156d455e04cf7d9b.png

其实,跟我们平常那一套没多大区别,不过是把打好的jar包做成镜像而已

2.4.  使用Docker Maven Plugin构建镜像

利用Docker Maven Plugin插件我们可以使用Maven来管理Docker镜像和容器。下面是一些预定义的目标:

d57ed4fbcbbcee594dc208fcfd858174.png

4ec111dcd6c901565cf939d5cb28e12e.png

补充:Maven中的生命周期、阶段、目标

生命周期有三套:clean、default、site

生命周期由多个阶段组成的,比如default生命周期的阶段包括:clean、validate、compile、

每个阶段由多个目标组成,也就是说目标才是定义具体行为的

插件是目标的具体实现

稍微留一下IDEA里面的Maven区域就不难理解了

b8a1f3a8fcf779c0c25b1574224c070a.png

言归正传,利用docker-maven-plugin来构建镜像的方式有很多,比如,可以配置插件或属性文件,还可以结合Dockerfile,都在这里:

41b2bfbe40619958919d6cd8b0a39f59.png

此处,我们演示用属性文件的方式,首先,定义一段profile配置,比如这样:

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4 4.0.0

5

6 org.springframework.boot

7 spring-boot-starter-parent

8 2.1.4.RELEASE

9

10

11 com.cjs.example

12 hello-demo

13 0.0.1-SNAPSHOT

14 hello-demo

15 Demo project for Spring Boot

16

17

18 1.8

19

20

21

22

23 org.springframework.boot

24 spring-boot-starter-web

25

26

27

28 org.springframework.boot

29 spring-boot-starter-test

30 test

31

32

33

34

35

36

37 org.springframework.boot

38 spring-boot-maven-plugin

39

40

41

42

43

44

45 docker

46

47

48

49 io.fabric8

50 docker-maven-plugin

51 0.30.0

52

53

54

55 hellodemo

56

57 openjdk:latest

58

59 artifact

60

61 java -jar maven/${project.name}-${project.version}.jar

62

63

64

65

66

67

68 docker:build

69 package

70

71 build

72

73

74

75 docker:start

76 install

77

78 run

79 logs

80

81

82

83

84

85

86

87

88

然后,在构建的时候指定使用docker这个profile即可

1 mvn clean package -Pdocker

5868c89e278c0c7535dedc0d0f692e39.png

03ffc73cc1068effed2a49a07965c2a7.png

2.5.  Dockerfile命令(番外篇)

CMD 与 ENTRYPOINT 的区别

容器默认的入口点是 /bin/sh,这是默认的shell。

当你运行 docker container run -it ubuntu 的时候,启动的是默认shell。

fcab746d20e4d4caaeabf09a4a85c828.png

ENTRYPOINT 允许你覆盖默认的入口点。例如:

a74bf51b6c596e5ccf57bf1f339ca929.png

这里默认的入口点被换成了/bin/cat

ADD 与 COPY 的区别

ADD有COPY所有的能力,而且还有一些额外的特性:

允许在镜像中自动提取tar文件

允许从远程URL下载文件

3.  运行一个Docker容器

3.1.  交互

以交互模式运行WildFly容器,如下:

1 docker container run -it jboss/wildfly

默认情况下,Docker在前台运行。-i允许与STDIN交互,-t将TTY附加到进程上。它们可以一起用作 -it

按Ctrl+C停止容器

3.2.  分离容器

1 docker container run -d jboss/wildfly

用-d选项代替-it,这样容器就以分离模式运行

(PS:-it前台运行,-d后台运行)

3.3.  用默认端口

如果你想要容器接受输入连接,则需要在调用docker run时提供特殊选项。

1 $ docker container ls

2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

3 93712e8e5233 jboss/wildfly "/opt/jboss/wildfly/…" 4 minutes ago Up 4 minutes 8080/tcp serene_margulis

4 02aa2ed22725 ubuntu "/bin/bash" 2 hours ago Up 2 hours frosty_bhabha

重启容器

1 docker container stop `docker container ps | grep wildfly | awk '{print $1}'`

2 docker container run -d -P --name wildfly jboss/wildfly

-P选项将镜像中的任何公开端口映射到Docker主机上的随机端口。--name选项给这个容器起个名字。

1 $ docker container ls

2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

3 3f2babcc1df7 jboss/wildfly "/opt/jboss/wildfly/…" 47 seconds ago Up 47 seconds 0.0.0.0:32768->8080/tcp wildfly

a7b42ac1bba434088c591dd17abf0531.png

3.4.  用指定端口

1 docker container stop wildfly

2 docker container rm wildfly

或者你还可以用 docker container rm -f wildfly 来停止并删除容器

1 docker container run -d -p 8080:8080 --name wildfly jboss/wildfly

格式是: -p hostPort:containerPort

此选项将主机上的端口映射到容器中的端口。这样就使得我们可以通过主机上的特定的端口来访问容器。

现在我们访问http://localhost:8080/跟刚才http://localhost:32768/是一样的

3.5.  停止容器

1 # 按id或name停止指定的容器

2 docker container stop

3 docker container stop

4

5 # 停止所有容器

6 docker container stop $(docker container ps -q)

7

8 # 停止已经退出的容器

9 docker container ps -a -f "exited=-1"

3.6.  删除容器

1 # 按id或name删除指定的容器

2 docker container rm

3 docker container rm

4

5 # 用正则表达式删除匹配到的容器

6 docker container ps -a | grep wildfly | awk '{print $1}' | xargs docker container rm

7

8 # 删除所有容器

9 docker container rm $(docker container ps -aq)

3.7.  查看端口映射

1 docker container port or

4.  参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值