从零开始学Docker(二)

Dockerfile

Dockerfile是Docker中用于定义镜像自动化构建流程的配置文件,在Dockerfile中,包含了构建镜像过程中需要执行的命令和其他操作。通过Dockerfile可以更加清晰、明确的给定Docker镜像的制作过程,由于仅是简单、小体积的文件,在网络等介质中传递的速度快,能够更快的实现容器迁移和集群部署。

docker 编译当前容器 docker build context_docker 编译当前容器

Dockerfile的基本结构

docker 编译当前容器 docker build context_Dockerfile_02

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

docker 编译当前容器 docker build context_jar_03

开放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插件(如果没有安装)

docker 编译当前容器 docker build context_docker_04

idea配置docker

docker 编译当前容器 docker build context_jar_05

docker 编译当前容器 docker build context_Dockerfile_06

docker 编译当前容器 docker build context_docker_07

docker 编译当前容器 docker build context_Dockerfile_08

springboot整合Dockerfile

项目中配置Dockerfile文件

docker 编译当前容器 docker build context_jar_09

docker 编译当前容器 docker build context_Dockerfile_10

模块打包

docker 编译当前容器 docker build context_docker 编译当前容器_11

docker 编译当前容器 docker build context_jar_12

编写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运行配置


docker 编译当前容器 docker build context_Dockerfile_13

docker 编译当前容器 docker build context_Dockerfile_14

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 编译当前容器 docker build context_Dockerfile_15

查看运行的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"]