环境准备
- jdk8
- 安装docker
- 镜像加速器配置
- docker私有仓库
- springboot工程的jar包
docker部署项目
dockfile
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。参考
注意Dockerfile必须和Jar包在同一路径下
创建并编辑dockfile文件
touch Dockerfile
Dockfile
FROM java:8 EXPOSE 8080 VOLUME /slm ADD helloworld-1.0-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
- FROM 基础镜像必要,代表你的项目将构建在这个基础上面
- EXPOSE 允许指定端口转发
- VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
- ADD 将文件从路径
- ENV 可以用于为docker容器设置环境变量
- ENTRYPOINT 指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。
开始构建:
docker build -t app .
-t boot-docker 代表你要构建的名字
控制台输出:
Sending build context to Docker daemon 14.35MB Step 1/7 : FROM java:8 8: Pulling from library/java 5040bd298390: Pull complete fce5728aad85: Pull complete 76610ec20bf5: Pull complete 60170fec2151: Pull complete e98f73de8f0d: Pull complete 11f7af24ed9c: Pull complete 49e2d6393f32: Pull complete bb9cdec9c7f3: Pull complete Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d Status: Downloaded newer image for java:8 ---> d23bdf5b1b1b Step 2/7 : EXPOSE 8080 ---> Running in baa4bf07bb14 Removing intermediate container baa4bf07bb14 ---> f11644c60f39 Step 3/7 : VOLUME /slm ---> Running in b9416fbc0df5 Removing intermediate container b9416fbc0df5 ---> 3f5578b86bca Step 4/7 : ADD helloworld-1.0-SNAPSHOT.jar app.jar ---> 2644a63eee12 Step 5/7 : RUN sh -c 'touch /app.jar' ---> Running in 287d2c7fea63 Removing intermediate container 287d2c7fea63 ---> 5eadcec67575 Step 6/7 : ENV JAVA_OPTS="" ---> Running in df119f19b273 Removing intermediate container df119f19b273 ---> 1259b5b9c02a Step 7/7 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] ---> Running in 7bdbc2046342 Removing intermediate container 7bdbc2046342 ---> 20a76c5f6685 Successfully built 20a76c5f6685 Successfully tagged app:latest
我们可以看到已经构建完成,Successfully built 20a76c5f6685这句话指明了刚刚构建的镜像ID现在我们可以根据这个ID来进行操作。
docker run -d -p 8080:8080 20a76c5f6685
控制台输出:
[root@iZ2ze895xh98oa4skpbtiuZ hello]# docker run -d -p 8080:8080 20a76c5f6685
4e3881ca9f99bbf59852a1b54131783ceec264334d708d4f8ddbfdf0f9fcf306
查看镜像
[root@iZ2ze895xh98oa4skpbtiuZ hello]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE app latest 20a76c5f6685 6 seconds ago 672MB hello-world latest fce289e99eb9 11 months ago 1.84kB java 8 d23bdf5b1b1b 2 years ago 643MB
可以看到app镜像已经有了
查看正在运行的镜像
[root@iZ2ze895xh98oa4skpbtiuZ hello]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e3881ca9f99 20a76c5f6685 "sh -c 'java $JAVA_O…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp strange_knuth
可以看到app镜像的CONTAINER的ID为4e3881ca9f99,名称为strange_knuth,映射的端口号为8080
进入app镜像所在的容器
[root@iZ2ze895xh98oa4skpbtiuZ hello]# docker exec -it 4e3881ca9f99 /bin/bash
root@4e3881ca9f99:/#
查看容器中的信息
root@4e3881ca9f99:/# ls
app.jar bin boot dev etc home lib lib64 media mnt opt proc root run sbin slm srv sys tmp usr var
可以看到app.jar在容器中
宿主机开放8080访问端口,在浏览器中进行访问
访问成功
docker相关命令
目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加-v参数, 后边为 宿主机目录:容器目录 --name后边是容器名称 centos:7指的是镜像以及版本号
docker run -di /usr/local/myhtml:/usr/local/myhtml --name=mycentos7 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。
Permission denied
这是因为Centos7中的安全模块selinux把权限禁掉了,我们需要添加参数 -privileged=true来解决挂载目录没有权限的问题
将容器保存为镜像
docker commit contailer_nginx mynginx
contailer_nginx是容器名称 mynginx是新的镜像名称
镜像备份
docker save -o mynginx.tar mynginx
-o 输出到的文件
执行后,运行ls命令即可看到打成的jar包
恢复镜像
doker load -i mynginx.tar
参考网址:
https://www.jb51.net/article/165159.htm
https://www.runoob.com/docker/docker-architecture.html