《Docker系列》如何把我的程序运行在容器里面?

1,208 阅读4分钟

前面《Docker系列》Docker是个啥东西? 里面,跑起来了第一个容器,在容器中运行一个centos镜像。那么怎样去构建镜像呢,怎样把自己的Java代码放到容器里面运行呢?接下来的内容,我们就来探索下如何构建我们自己的镜像。

关键性角色,Dockerfile

docker可以自动化根据描述文件,构建镜像,我们只需要把描述文件写好,使用docker build命令就可以构建自己的镜像。首先来了解下描述文件都有哪些内容,需要怎样的格式?

Dockerfile里面可以有一系列命令,先来了解下都有哪些命令:

FROM命令

首先,一个合法的Dockerfiles都必须有一个FROM命令来创建一个镜像层,并指定基础镜像,也就是说我们的镜像必须在基础镜像的基础上增加我们自己的内容,语法如下:

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

任何合法的镜像都可以作为基础镜像,我们一般使用公开的镜像来作为我们的基础镜像。如我们希望我们的java程序跑在centos上,那么我们可以把centos作为基础镜像来构建。[--platform=<platform>]参数为可选参数,用于指定平台,如linux/amd64、linux/arm64、windows/amd64,默认会是构建是有构建时的平台类型。<image>[:<tag>]为镜像及版本。[AS <name>]也是可选的,这个没什么好说,起个名字。 例子:

FROM centos:centos7 AS centos7

RUN 命令

RUN命令可以当前的镜像层上运行任何的命令,如,可以直接在centos上面执行yum install java-1.8.0-openjdk.x86_64安装JDK,两种格式如下:

RUN <command>
RUN ["executable", "param1", "param2"]

命令没有什么好解析的,两种格式是等价的,例子:

RUN yum -y install java-1.8.0-openjdk.x86_64
RUN ["yum", "-y", "install", "java-1.8.0-openjdk.x86_64"]

CMD 命令

CMD命令用于指定容器启动时,运行啥程序,Docker容器虽然可以像虚拟机一样提供一个独立环境,但它与虚拟机是不一样的,虚拟机上可以直接运行一个系统,而docker容器只是一个进程,它需要指定跑哪些程序,如跑起来centos下的控制台/bin/bash。一个Dockerfile只能有一个CMD命令,如果有多个的话,只有最后一个会生效,3种格式如下:

CMD ["executable","param1","param2"]
CMD command param1 param2
CMD ["param1","param2"] //先不做了解,后续再深入

例子:

CMD ["/bin/bash"]

ADD命令

ADD命令,用于将本地或者远程的文件拷贝到镜像中,要在镜像中跑我们的spring boot代码,需要将我们代码的jar包拷贝到镜像中,命令格式如下:

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

[--chown=<user>:<group>]是可选参数,只能在linux的镜像上使用,设置文件所属用户、组相关。 后面两个参数为源文件文章,拷贝文件存放的目标位置。例子:

ADD spboot-0.0.1-SNAPSHOT.jar /spboot-0.0.1-SNAPSHOT.jar

构建第一个镜像

了解了上面的4个命令就足以让我们构建起第一个镜像了。这里我们先简单创建一个spring boot项目,之后简单写个测试接口,端口配置为8888,之后将Spring boot项目打包称为一个jar包。 之后创建一个文件夹,直接把打包好的jar包复制到该文件夹下,同时在该文件夹下创建Dockerfile文件。 Dockerfile文件内容如下:

FROM centos:centos7 AS centos7
RUN yum -y install java-1.8.0-openjdk.x86_64
ADD spboot-0.0.1-SNAPSHOT.jar /tmp/spboot-0.0.1-SNAPSHOT.jar
CMD ["java","-jar", "/tmp/spboot-0.0.1-SNAPSHOT.jar"]

开启一个控制台,切换到我们刚创建的文件夹目录下,执行docker build -t centosjdk_spboot:1.0 .,-t 后面的参数指定镜像名称及版本,.表示使用当前目录的Dockerfile文件构建。构建如下图

构建成功后就可以通过docker images查询到我们的镜像了。 镜像构建完成,就可以在我们的容器中跑起来了。 docker run -it -p 80:8888 centosjdk_spboot:1.0, -p指定本地80端口映射到docker容器8888端口,-it上一篇文章说过,使用标准输入输出、及终端。跑起来之后,我们就可以访问我们运行在容器里的spring boot项目了。

总结

本文简述了如何去构建第一个自己的镜像。Docker构建镜像需要编写Dockerfile文件,简单介绍了文件中的4个命令FROM、RUN、CMD、ADD,以及构建跑起来了自己的镜像。本文到此位置,更多内容,敬请期待。