- 基础知识
- 构建镜像
- 完全指令
- 指令一(FROM)
- 指令二(MAINTAINER)
- 指令三(WORKDIR)
- 指令四(RUN)
- 指令五(ADD)
- 指令六(COPY)
- 指令七(CMD)
- 指令八(ENV)
- 指令九(EXPOSE)
- 指令十(ENTRYPOINT)
- 实战案例(构建Tomcat)
- 网络管理
- 容器互联
- 网络模式
- 自定义网络
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像
基本结构:Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。一般而言,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
例如
## Dockerfile文件格式 # 1、第一行必须指定 基础镜像信息 FROM java:8 # 2、维护者信息 MAINTAINER jianghao# 3、镜像操作指令 RUN echo "wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.55/bin/apache-tomcat-9.0.55.tar.gz" RUN tar -zxf apache-tomcat-9.0.55.tar.gz -C /usr/local # 4、容器启动执行指令 CMD /usr/local/tomcat/bin/catalina.sh
构建镜像Dockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
- 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令
第一步:在一个空白的文本文件, 命名为 Dockerfile (名字不能改)
vim Dockerfile
第二步:写文件内容
#基础镜像 FROM centos #维护者 MAINTAINER baizhan#启动容器运行命令 CMD echo "hello Dockerfile"
第三步:构建镜像
# 镜像名字和版本自己随便取 . 表示Dockerfile的路径在当前路径 docker build -t 镜像名字:版本 .完全指令 指令一(FROM)
指定基础镜像,必须为第一个命令
# 举例 FROM java:8
指令二(MAINTAINER)备注:这里指定的基础镜像是别人搭建好的,我们在这个基础上继续搭建,因为 java:8 已经搭建好了 linux 的环境,所以我们不需要担心其他的了
维护者信息
# 举例 MAINTAINER jianghao指令三(WORKDIR)
工作目录,类似于cd命令
# 举例 WORKDIR /opt
指令四(RUN)注意:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行
构建镜像时执行的命令
# 举例 RUN mkdir docker RUN echo "test" > a.info指令五(ADD)
将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源,类似wget
# 举例 添加所有以"hom"开头的文件 ADD hom* /mydir/ # 添加 "test" 到 /absoluteDir/ ADD test /absoluteDir/指令六(COPY)
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,单纯的拷贝而已
# 举例 COPY ./start.sh /start.sh指令七(CMD)
构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换(可以被替换的,如果用户在构建容器时后面加了自己的命令就会替换 CMD)
# 举例 CMD echo "This is a test"
指令八(ENV)注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令
这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量
# 举例 ENV JAVA_HOME=/usr/local/jdk ENV PATH=$JAVA_HOME/bin:$PATH指令九(EXPOSE)
指定于外界交互的端口
# 举例 EXPOSE 8080指令十(ENTRYPOINT)
实战案例(构建Tomcat)指定这个容器启动的时候要运行的命令,可以追加命令,与 CMD 不同的是,这个不会替换而是追加
在生产环境下,各个小版本不同,使用别人的镜像也许会不好,所以需要自己搭建
#基础镜像 FROM java:8 #维护者 MAINTAINER jianghao网络管理#拷贝tomcat包 ADD ./apache-tomcat-9.0.50.tar.gz /usr/local #设置工作目录 WORKDIR /usr/local #设置tomcat环境变量 ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.50 ENV PATH=$PATH:$TOMCAT_HOME/bin #保留端口 EXPOSE 8080 #启动容器运行命令 CMD startup.sh && tail -F catalina.out
容器互联每启动一个 Docker 容器, Docker 就会给容器分配一个 IP,只要安装 Docker 就会有一个 Docker0 网卡
Docker0 网卡的地址一般为 172.17.0.1 往后分配
不同的容器之间可以通过 Docker0 分配的 IP 地址进行 PING 通,但是有的容器采用的时纯净的操作系统,没有提供命令让我们查看 IP,所以我们可以通过下面的办法来实现通过主机名来连接
可以使用:docker network inspect bridge 查看桥接模式的状态得到容器的 IP (自定义网络哪里)
语法格式:–link xxx
# 举例 这样 tomcat 就可以通过 mysql 这个名字联通 mysql 这个容器 docker run -d -it --name tomcat --link mysql -p 8080:8080 tomcat网络模式
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关
在创建启动容器时可以自己指定网络模式 --net=xxx
| 网络模式 | 配置 | 说明 |
|---|---|---|
| host模式 | -–net=host | 容器和宿主机共享Network namespace。 |
| container模式 | –net=container | 容器和另外一个容器共享Network namespace |
| none模式 | -–net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置 |
| bridge模式 | -–net=bridge | (默认为该模式) |
Host模式:如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
Container模式(几乎不用):这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享
None模式:这种网络模式下容器只有io回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性
自定义网络Bridge模式:bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式
docker network --help
- 命令名称 说明
- docker network connect 将容器连接到网络
- docker network create 创建一个网络
- docker network disconnect 断开容器的网络
- docker network inspect 显示一个或多个网络的详细信息
- docker network ls 列出网络
- docker network prune 删除所有未使用的网络
- docker network rm 删除一个或多个网络
# 创建一个网络 mynet 创建网络时指定模式用 --drive # --subnet=192.168.200.0/24命令指定该网络模式网段范围,其中24代表该网段前24位相同,后8位不同,即该网段范围为:# 192.168.200.1~192.168.200.254 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet # 将容器连接到新建网络 docker network connect 网络名 容器名 # 查看容器网络情况 docker network inspect 网络名
docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式和自己创建的网络了



