从零开始学Docker(二)
Dockerfile
Dockerfile是Docker中用于定义镜像自动化构建流程的配置文件,在Dockerfile中,包含了构建镜像过程中需要执行的命令和其他操作。通过Dockerfile可以更加清晰、明确的给定Docker镜像的制作过程,由于仅是简单、小体积的文件,在网络等介质中传递的速度快,能够更快的实现容器迁移和集群部署。
Dockerfile的基本结构
linux服务器配置docker
配置docker remote api
在linux中配置docker的远程调用接口。
编辑docker.service
使用 vim 打开/lib/systemd/system/docker.service文件。
vim /lib/systemd/system/docker.service
编辑service模块
修改ExecStart的内容:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock #原来的ExecStart
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock #新的ExecStart
重新加载docker
重新加载docker的daemon
systemctl daemon-reload
重新启动docker
systemctl restart docker.service
验证配置
查询端口2375状态
[root@localhost system]# netstat -nplt|grep 2375
tcp6 0 0 :::2375 :::* LISTEN 83061/dockerd
使用crul测试api
curl http://192.168.200.104:2375/info
开放2375端口
[root@localhost system]# firewall-cmd --zone=public --add-port=2375/tcp --permanent
success
[root@localhost system]# firewall-cmd --reload
success
idea配置docker插件
idea安装docker插件(如果没有安装)
idea配置docker
springboot整合Dockerfile
项目中配置Dockerfile文件
模块打包
编写Dockerfile文件
下载java镜像
项目中要依赖java,需要先引用anapsix/alpine-java.
FROM anapsix/alpine-java:latest #引用java镜像
EXPOSE 10021
ADD target/book-type-1.0-SNAPSHOT.jar /TypeApp.jar
ENTRYPOINT ["java","-jar","/TypeApp.jar"]
Dockerfile运行配置
Deploying 'book-type Dockerfile: springcloud-book/book-type/Dockerfile'…
Building image…
Preparing build context archive…
[==================================================>]27/27 files
Done
Sending build context to Docker daemon…
[==================================================>] 93.11MB
Done
Step 1/4 : FROM anapsix/alpine-java:latest
---> c45785c254c5
Step 2/4 : EXPOSE 10021
---> Running in a0e0b88e20d7
Removing intermediate container a0e0b88e20d7
---> 98fc31b4558c
Step 3/4 : ADD target/book-type-1.0-SNAPSHOT.jar /TypeApp.jar
---> d5b33e13e466
Step 4/4 : ENTRYPOINT ["java","-jar","/TypeApp.jar"]
---> Running in 0aa3390c7196
Removing intermediate container 0aa3390c7196
---> c23e9113236b
Successfully built c23e9113236b
Successfully tagged book-type:lastest
Creating container…
Container Id: ea558c4eac5464b00f17e942945b1016cd2c1129c2fe06dca24dc05f1d30a666
Container name: 'book-type'
Starting container 'book-type'
'book-type Dockerfile: springcloud-book/book-type/Dockerfile' has been deployed successfully.
linux服务器
查看镜像
查看运行的docker容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea558c4eac54 c23e9113236b "java -jar /TypeApp.…" 8 minutes ago Up 8 minutes 0.0.0.0:10021->10021/tcp book-type
47880573879f mysql "docker-entrypoint.s…" 2 weeks ago Up 35 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql_3306
Dockerfile文件常用指令
FROM 指定基础镜像
FROM指令初始化一个新的构建阶段,并为后续指令设置基础镜像。因此,有效的 Dockerfile 必须以 FROM 指令开头。该镜像可以是任何有效的镜像–很容易通过从Public Repositories(镜像仓库) 拉取一个镜像。
FROM类似于Java中extends关键字继承于基础镜像,即FROM之后的内容都依赖于此基础镜像。
格式
格式:
FROM 镜像名称
FROM 镜像名称:<tag>
FROM 镜像名称@<digest>
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
案例
FROM mysql:5.6
FROM anapsix/alpine-java:latest
MAINTAINER指定维护者信息
MAINTAINER指令用于指定维护者的信息,用于为Dockerfile署名。
格式
MAINTAINER
案例
MAINTAINER ohb
COPY/ADD 复制文件
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
格式
ADD src … dest
ADD [“src”,… “dest”] 用于支持包含空格的路径
从src目录复制文件到容器的dest。
案例
ADD target/springboot-dockerfile-1.0-SNAPSHOT.jar /app.jar
将本机target/springboot-dockerfile-1.0-SNAPSHOT.jar文件拷贝到容器内**/app.jar**
ENTRYPOINT 入口点
ENTRYPOINT 允许您配置将作为可执行文件运行的容器。用ENTRYPOINT的exec形式来设置相当稳定的默认命令和参数,然后使用CMD的任何一种形式来设置更可能更改的其他默认值。
注: 一般在制作一些执行就关闭的容器中会使用。
格式
ENTRYPOINT [“executable”, “param1”, “param2”] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
案例
ENTRYPOINT ["java","-jar","/app.jar"]
WORKDIR
类似于cd命令,为了改变当前的目录域。
此后RUN、CMD、ENTRYPOINT、COPY、ADD等命令都在此目录下作为当前工作目录。
WORKDIR /usr/local
EXPOSE
指定新镜像加载到Docker时要开启的端口暴露端口,就是这个容器暴露出去的端口号。并不会直接暴露出去,docker run时还需要-P指定才可以,这里更像是一个说明
格式
EXPOSE <port> [<port>…]
案例
EXPOSE 9091
VOLUME 指定挂载点
使用指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可以共享给其它容器。
格式
VOLUME
案例
VOLUME /tmp
CMD
为容器设置默认启动命令或参数。
CMD
运行结束后容器将终止,CMD
可以被docker run后面的命令覆盖。一个Dockerfile只有顺序向下的最后一个CMD生效
Dockerfile案例
FROM anapsix/alpine-java:latest
EXPOSE 11000
ADD target/movie-type-1.0-SNAPSHOT.jar /movie-type.jar
ENTRYPOINT ["java","-jar","-Dspring.cloud.nacos.discovery.ip=192.168.198.128","-Dspring.cloud.nacos.discovery.port=11000"]
CMD ["/movie-type.jar"]