一. DockerFile
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
举一个简单的定制例子,我们创建一个文件 DockerFile,写入如下
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
这样我们就完成了对一个nginx镜像的定制,这样我么启动定制的镜像,访问该镜像的 nginx 服务应该得到 Hello, Docker! 的输出。
二. Docker 网络
Docker 网络是一个非常重要的概念,我们深入学习 Docker 的话会发现以后的 CI/CD、集群部署等操作都离不开 Docker 之间的网络通信,所以说学好 Docker的网络基础和原理是非常重要的。
当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
1. 基础:从外部访问 Docker 容器
-
在使用
docker run命令的时候,可以使用两个参数,将宿主机的端口与 docker 开放的端口绑定,分别是-p和-P。 -
当使用
-P标记时,Docker 会随机映射一个49000~49900的端口到内部容器开放的网络端口。 -
当使用
-p则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。 -
绑定的时候可以指定 IP 地址,也可以指定 端口,不指定宿主机端口的话 Docker 会随机分配。
[root@undi]# docker run -p 8080:80 nginx
#将宿主机的 8080 端口绑定到容器的 80 端口上,这样访问宿主机的 8080 端口时,就会转发到容器的 80 端口上
[root@undi]# docker run -p 127.0.0.1::80 nginx
#将宿主机的 127.0.0.1:随机一个端口 绑定到容器的80端口上
2. 查看容器绑定的端口
- 使用
docker ps -a列出所有容器,在这里能看到容器所绑定的端口。 - 使用
docker post 容器名可以查看该容器绑定的 IP。 - 使用
docker inspect 容器名可以看到所有变量。
[root@undi]# docker port bloomfilter
6379/tcp -> 0.0.0.0:6379
3. 容器之间的互联
第一种方式是使用 --link 参数,但是现在并不推荐使用这种方式进行连接,他的原理是在容器内的 host 文件中加入映射关系,不仅移植性差,反过来还不行了,墙裂推荐大家加入自定义网络来链接多个容器,就像我们玩虚拟机时候的虚拟网卡一样。
新建网络
下面命令新建一个 新的 Docker 网络
$ docker network create -d bridge my-net
-d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于 Swarm mode,在这里可以忽略它。
连接容器
运行一个容器并连接到新建的 my-net 网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net 网络
$ docker run -it --rm --name busybox2 --network my-net busybox sh
此时我们有两个容器 busybox1 和 busybox2,随便进入一个容器,ping 另一个容器测试成功,反过来测试也是没问题的
# ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
三. Intellij Idea 整合Docker
狂老师的免费视频,2020-05-16 13:37:32发布的视频,还是挺新的
因为视频是录播,没有剪辑,所以狂哥打错字或者纠结的时间有点多,建议倍速,干货是有的。