Docker4
Dockerfile
用来构建docker镜像的文件!命令参数脚本
构建步骤
- 编写一个dockerfile文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云)
DockerFile构建过程
- 每个保留关键字(指令)都必须是大写
- 执行从上到下顺序
-
表示注释
- 每一个质量都会创建一个新的镜像层,并提交
DockerFile指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口
RUN #运行
CMD #指定这个容器启动的时候要运行的命令
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的 DockerFile 这个时候就会运行ONBUILD 指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量
实战测试
Docker Hub 中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建
创建一个自己的centos
1编写DockerFile的文件
FROM centos
MAINTAINER lh<1002276945@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
2通过这个文件构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag]
3测试运行
支持了移植的命令
平时拿到一个镜像,可以研究一下怎么做的
CMD 和 ENTRYPOINT 区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
1编写DockerFile的文件
vim dockerfile-cmd-test
FROM cemtos
CMD ["ls","-a"]
构建镜像
docker build -f dockerfile-cmd-test -t cmdtest
run运行,发现我们的ls -a命令生效
docker run 7d202bdf002be182b794b7f2b4c90c4fe3560c3ac4f
[root@hadoop101 ~]# docker run 7d202bdf002be182b794b7f2b4c90c4fe3560c3ac4f
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
发布镜像
DockerHub
- 地址 https://hub.docker.com/ 注册账号
- 确定账号可以登录
- 在服务器上提交自己的镜像
自己发布的镜像最好带上版本号
发布到阿里云
1 登陆阿里云
2 找到容器镜像服务
3 创建命名空间
4 创建容器镜像
5 浏览阿里云
docker push lh/tomcat:1.0
小结
Dockerfile→build👉images
images→run👉container
container→commit👉images
Docker网络(容器编排,集群部署)
理解Docker网络(Docker0)
docker rm -f $(docker ps -aq) 把所有容器移除
docker rmi -f $(docker images -aq) 把所有镜像移除
清空所有环境
ip addr

1.本机回环地址
2.阿里云内网地址
3.docker0地址
三个网络
问题:docker是如何处理容器网络访问的?
测试:
docker run -d -P --name tomcat01 tomcat
查看容器内部网络地址 ip addr "IPAddress": "172.17.0.2",
docker exec -it tomcat01 ip addr //-it 是交互模式
↑↑遇到问题了,应该是镜像版本不一样,没有ip addr指令
先docker exec -it tomcat01 /bin/bash
再apt update && apt install -y iproute2
最后就可以ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
思考:Linux能不能ping通容器内部
[root@hadoop101 /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.065 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.068 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.060 ms
ping通了
Linux可以ping通docker容器内部
原理:
1.每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0
桥接模式,使用的技术是veth-pair技术
2.再启动一个容器测试,发现又多了一对网卡
我们发现这些容器带来的网卡,都是一对一对的
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备
Docker容器之间的连接,都是使用这个veth-pair技术
3.我们测试下tomcat01和02能否ping通
容器内没有ping指令
先进入容器docker exec -it tomcat02 /bin/bash
再apt-get update
再apt -y install iputils-ping
就可以ping通了
root@9d5cfebdb8a2:/usr/local/tomcat# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.165 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.069 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.073 ms
结论:容器和容器之间可以互相ping通
tomcat01和tomcat01是共用一个路由器,docker0
所有容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
试过了,容器也可以ping通外部网络,比如ping百度
[root@hadoop101 /]# docker exec -it tomcat01 /bin/bash
root@8a253f601acf:/usr/local/tomcat# ping www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=127 time=18.7 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=2 ttl=127 time=15.0 ms
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=3 ttl=127 time=13.1 ms
小结
Docker使用的是Linux的桥接
Docker中所有网络接口都是虚拟的,虚拟的转发速率高
只要容器删除,对应网桥就没了
--link
docker run -d -P --name tomcat01 --link tomcat02 这样03和02就是一个网络的了
直接通过名字能ping通
docker exec -it tomcat03 ping tomcat02
就是tomcat03在本地配置了02
docker exec -it tomcat03 cat /etc/hosts
不推荐使用!
自定义网络!不适用docker0!
docker0问题:不支持容器名连接访问
自定义网络
查看所有docker网络
[root@hadoop101 /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
74ccee272b50 bridge bridge local
91ec8ee72114 host host local
a70e2639a4ab none null local
网络模式
bridge :桥接docker(默认,自己创建也使用)
none :不配置网络
host :和宿主机共享网络
container:容器网络连通(用的少!局限很大)
测试
[root@hadoop101 /]# docker run -d -P --name tomcat01 --net bridge tomcat c18d732843b4dbdc4a78b75e8e3c15e31b411875ac1e88c248e005b96dab4ff4
docker0特点,默认,域名不能访问,--link可以打通
自己创建一个网络
[root@hadoop101 /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
9e6ca26f25cb44e1b2b8b49a9ecdb89a25ebfff0ef173008ab693ef56eef70fb
[root@hadoop101 /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
74ccee272b50 bridge bridge local
91ec8ee72114 host host local
9e6ca26f25cb mynet bridge local
a70e2639a4ab none null local
自己的网络就创建好了
[root@hadoop101 /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "9e6ca26f25cb44e1b2b8b49a9ecdb89a25ebfff0ef173008ab693ef56eef70fb",
"Created": "2024-04-07T21:32:22.031346328+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@hadoop101 /]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
725039b58dd0912f26ed24ffd13c21306baf65a31861d9970925894e8fc756c2
[root@hadoop101 /]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
2999db6b6e5cdd1efed45db2eca1383154e9862de51632ac1c636eab5b269bb5
[root@hadoop101 /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "9e6ca26f25cb44e1b2b8b49a9ecdb89a25ebfff0ef173008ab693ef56eef70fb",
"Created": "2024-04-07T21:32:22.031346328+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"2999db6b6e5cdd1efed45db2eca1383154e9862de51632ac1c636eab5b269bb5": {
"Name": "tomcat-net-02",
"EndpointID": "594b606927da78c90125373ed69580ecd388d77d330fca54f946115356fa4439",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"725039b58dd0912f26ed24ffd13c21306baf65a31861d9970925894e8fc756c2": {
"Name": "tomcat-net-01",
"EndpointID": "d04f0368209f1907ce72036adf4c12f3e99f4527d586d8c5fce156d14f50481c",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
自定义网络是可以通过名字ping通,不用--link
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐平时这样使用网络
好处:
redis - 不同的集群使用不同的网络,保证集群是安全和健康的
mysql - 不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
联通之后就是将 tomcat01放到了mynet网络下
一个容器两个ip地址。阿里云服务,公网ip,私网ip
实战部署redis集群

浙公网安备 33010602011771号