上一篇,在centos7中搭建好了docker,并尝试了基础的image镜像和container容器的命令操作。
这一篇就尝试自己在docker容器中启动并使用springboot服务,基本步骤就是准备jar、配置Docker、构建image、启动container、测试服务功能。
准备springboot的jar
为了简单演示,我创建了一个新的springboot项目,只写了一个controller接口以供查看效果,controller接口代码如下:
@RestController
@RequestMapping
public class TestController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
确定上述代码可以正常运行并在浏览器正常访问后,生成springboot可运行的jar,我这里命名为demo.jar
,然后把这个文件上传到linux虚拟机中准备构建docker镜像的目录,例如/root/docker/demo
。
配置Dockerfile
有了jar之后,接下来就可以配置Dockerfile文件了,我这里是按这个顺序来的,因为Dockerfile里需要指定jar文件。
而实际上Dockerfile文件只是一个静态文件,在jar之前配置也没有问题,只需要后续生成的jar名字及路径和Dockerfile里的保持一致即可。
在上边jar所在目录,使用vi命令创建并编辑Dockerfile文件:
vi Dockerfile
编辑文件内容:
FROM java:8
VOLUME /tmp
COPY demo.jar app.jar
RUN bash -c “touch /app.jar”
ENTRYPOINT ["java","-jar","/app.jar"]
以上内容的含义如下:
第一行,本Dockerfile文件生成的image镜像,基于java8的镜像;
第三行,把当前目录下的demo.jar
文件拷贝到docker容器中,同时重命名为app.jar
;
第四行和第五行,运行app.jar
,即启动spingboot服务。
上記の説明では2行目に触れていないことに注意してください。この行は必要ないためです。この行は、ファイルシステムを使用する必要がある場合にのみ使用されます。つまり、ファイルを直接操作するときにdockerのプログラムを構成する必要があります。これです。
さらに、この書き込み方法は、Dockerとホストファイルを関連付ける方法の1つにすぎません。他の書き込み方法もあり、詳細については後で説明します。
上記の構成は、多くのオンラインチュートリアルで記述されているものと類似しています。ある程度、不明確な人々に誤解を与える可能性があり、それらの多くは修正された記述であると思われますが、実際、上記の内容の多くは他の方法で記述できます。
まず、上記の各行の先頭の単語はすべて大文字ですが、mysqlクエリを使用する場合のsqlキーワードと同様に、ここのキーワードは大文字である必要はなく、小文字も使用できます。
第2に、2行目が必要な場合は、後ろが指すディレクトリでtmpを使用する必要はなく、他のディレクトリも使用できます。
次に、ローカルファイルをコンテナに追加する操作があり、これを使用copy
または使用できますadd
。どちらも2つのパラメータが必要です。1つはローカルファイルパスとファイル名、もう1つはDockerコンテナ内のファイル名です。
したがって、後ろのapp.jarは、使用時に一貫している限り、他の名前で呼び出すこともできます。
したがって、上記の構成の表現を次のように変更することもできます。
from java:8
volume /test
add demo.jar demo.jar
run bash -c "touch /demo.jar"
entrypoint ["java","-jar","/demo.jar"]
画像ビルド
実行する必要のあるjarファイルと構成済みのDockerfileファイルが用意できたので、準備が完了し、次のコマンドを使用してイメージイメージをビルドできます。
docker build -t docker-spring .
上記のコマンドの最後にあるドット記号に特に注意してください.
。簡単に無視できます。上記のコマンドを実行すると、次の出力が表示されます。
Sending build context to Docker daemon 16.52MB
Step 1/6 : from java:8
---> d23bdf5b1b1b
Step 2/6 : volume /test
---> Running in 5533951f04ca
Removing intermediate container 5533951f04ca
---> 0965f253bac5
Step 3/6 : add demo.jar demo.jar
---> bff720047ccb
Step 4/6 : run bash -c "touch /demo.jar"
---> Running in 900c847c14a4
Removing intermediate container 900c847c14a4
---> edb32f0ef654
Step 5/6 : expose 8080
---> Running in c25a898a3e37
Removing intermediate container c25a898a3e37
---> 55bbf5e81907
Step 6/6 : entrypoint ["java","-jar","/demo.jar"]
---> Running in b891f3caeeb3
Removing intermediate container b891f3caeeb3
---> 8caaec5d617b
Successfully built 8caaec5d617b
Successfully tagged docker-spring:latest
上記の出力は、イメージが正常にビルドされたことを意味します。このマシンで初めてdockerが使用され、java8ミラーがない場合、上記のコマンドの実行は遅くなり、最初でない場合は、リモートミラーライブラリからjava8ミラーがプルされます。このミラーはすでにローカルに存在し、直接使用されるため、2回目ははるかに高速になります。
コンテナを開始
イメージが完了したら、コンテナーを開始するイメージを指定できます。コンテナー自体はサービスの実行後にポートを開始しますが、物理マシンのポートを直接使用しないため、開始時にdockerのサービスポートを外部ポートにマップする必要があります。同時に、操作を容易にするために、バックグラウンド実行モードを使用してを使用することもできます。-d
最後の開始コマンドは次のとおりです。
docker run -d -p 8000:8080 docker-spring
上記の操作により、Docker-Springイメージが開始され、Dockerコンテナーのポート8080が使用され、ポート8080が仮想マシンのポート8000にマップされます。
なお、実際の使用では、上記のパラメーター指定はミラー名の前に指定する必要があり、ミラー名を書き込んだ後にパラメーターを指定すると、パラメーターが有効になりません。
検証
コンテナーとサービスが開始されたら、ブラウザーで仮想マシンのIPとマップされたポートを使用して、Dockerのサービスにアクセスできます。たとえば、私の仮想マシンは192.168.139.91
です。最初のインターフェースコードによると、ブラウザーに次のURLを入力できます。
http://192.168.139.91:8000/hello
ブラウザが通常のhello
文字列を返すことがわかります。これは、Dockerのspringbootサービスが正常にデプロイされていることを示しています。