Docker4

Dockerfile

用来构建docker镜像的文件!命令参数脚本
构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建成一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云)

DockerFile构建过程

  1. 每个保留关键字(指令)都必须是大写
  2. 执行从上到下顺序
  3. 表示注释

  4. 每一个质量都会创建一个新的镜像层,并提交

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

  1. 地址 https://hub.docker.com/ 注册账号
  2. 确定账号可以登录
  3. 在服务器上提交自己的镜像

自己发布的镜像最好带上版本号

发布到阿里云

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中所有网络接口都是虚拟的,虚拟的转发速率高
只要容器删除,对应网桥就没了

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集群


posted @ 2025-08-04 19:39  BJliberty  阅读(7)  评论(0)    收藏  举报