ENTRYPOINT
用来指定一个容器启动时要运行的命令
类似于 CMD 指令,但是ENTRYPOINT不会被
docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令
指定的程序
1 ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给
ENTRYPOINT 传参
也就是说当我们指定了ENTRYPOINT之后,CMD的含义就发生了变化,不再是直接运行命
令,而是将CMD命令的内容作为参数传递给ENTRYPOINT 指令
最终会组合成 ENTRYPOINT "<CMD>"
1 FROM nginx 2 3 ENTRYPOINT ["nginx", "-c"] # 定参 4 CMD ["/etc/nginx/nginx.conf"] # 变参
注意
😀在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数
如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效
dockerfile命令列表
1 FROM #镜像基础 镜像从这里开始构建 2 MAINTAINER #镜像是谁写里 姓名:邮箱 3 RUN #镜像构建的时候需要运行的命令 4 ADD #将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包(copy文件,会自动解压) 5 WORKDIR #设置工作目录(不指定就在启动目录运行 ) 6 VOLUME #挂载的目录 7 EXPOSE #暴露端口配置8 CMD #MA(只有最后一个会生效可被替代) 9 ENTRYPOINT #指定这个容器启动的命令,可以追加命令 10 ONBUILD #当构建一个被继承 dockerfile这个时候就会运行ONBUILD 的指令 触发指令 11 COPY #类似ADD 将文件拷贝进容器 12 ENV #构建的时候设置环境变量
创建一个自己的centos
docker网络
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,
就会有一个网卡docker0桥接模式,使用的技术是evth-pair
docker实际上就相当于一个虚拟的交换机,我们用的电脑就相当于容器, 我们的docker0
和容器就相当于在一个局域网呢
对比这两个IP就能发现都在同一个局域网内
evth-pair
就是 一对的虚拟设备接口,他们都是成对出现的, 一段连着协议,一段彼此相连
正因为有这个特性,evth-pair 充当一个桥梁 连接各种虚拟网络设备的
容器和容器之间是可以互相ping通的
两个容器是共用一个路由器 docker0
所有的容器不指定网络的情况下 都是docker路由的 docker会给我们的容器分配一个默认
的ip
docker种的所有网络接口都是虚拟机
docker默认提供了三种网络模式,生成容器时不指定的情况下默认使用bridge模式bridge模式(默认)
这种模式会为每个容器分配一个独立的Network Namespace(网络空间)同一个宿主机上所
有容器都会在同一个网段下,相互之间是可以通信的
host模式
如果容器使用时使用host模式,那么容器将不会获得一个Network Namespace(网络空间)
而是和主机同用一个Network Namespace 容器将不会虚拟出自己的网卡,配置IP等,而是使
用宿主机的IP和端口 但是容器其他方面 如文件系统 进程列表 还是和宿主机隔离的
😀使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端
口也可以使用宿主机的端口,host最大的优势就是网络性能比较好,但是docker
host上已经使用的端口就不能再用了,网络的隔离性不好。
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何
网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加
网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--
network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
macvlan模式
Macvlan Network:属于Docker的网络驱动。
把docker主机网卡接口逻辑上分为多个子接口 每个子接口标识一个vlan容
器直接连接
docker主机接口通过路由策略转发到另一个docker主机
macvlan最大的优势 它支持能去连接子接口 linux子接口最大4094个1
首先开启网卡混杂模式 2 ifconfig 网卡名称 promisc #网卡名通过ip a去查看 3 创建docker macvlan 网络 4 docker network create -d macvlan --subnet=172.16.42.0/24(你的网段) --gateway=172.16.42.2 (网关) -o parent=ens33(网卡名) 网络名 5 -d 指定 Docker 网络 driver 6 --subnet 指定 macvlan 网络所在的网络 7 --gateway 指定网关 8 -o parent 指定用来分配 macvlan 网络的物理网卡 9 启动一个容器指定网络指定IP 10 docker run -itd --name=nginx --ip=192.168.42.200 --network=test-xiaole nginx 11 --ip #指定容器的ip 12 --network #指定容器所使用的网络
Docker 容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
1 新建一个网络 2 docker network create -d 网络模式 网卡名 3 [root@localhost nginx]# docker network create -d bridge xiaole 4 e697268c65667812add726ac562b087b2ebfb87ba299d75f65b92553ceb2f6ad 5 查看网络列表 6 docker network ls 7 [root@localhost nginx]# docker network ls 8 NETWORK ID NAME DRIVER SCOPE 9 62a5ed6d7649 bridge bridge local 10 00603cd7338b host host local 11 131e07c80505 none null local 12 75cc4ca5f7ce test-xiaole macvlan local 13 e697268c6566 xiaole bridge local 14 最下面一行就是我们新添加的网络 15 16 运行一个容器并连接到网络17 [root@localhost nginx]# docker run -itd --network=xiaole --name=centos1 58f02a033062 启动第一个容器并添加到xiaole网络里 18 ccf77bbbafc9502b555e167fea643b0ca452f97a2d7587081c6c559f724d5b08 19 20 --network 要使用哪个网络 21 22 [root@localhost nginx]# docker ps 23 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 24 ccf77bbbafc9 58f02a033062 "/bin/bash" 3 seconds ago Up 2 seconds centos1 25 [root@localhost nginx]# docker run -itd --network=xiaole --name=centos2 58f02a033062 动第二个容器并添加到xiaole网络里 26 19df38d91d74633875153dbedd823746ee451fb7158e194fdd6d4caad393c820 27 [root@localhost nginx]# docker ps 28 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 29 19df38d91d74 58f02a033062 "/bin/bash" 3 seconds ago Up 2 seconds centos2 30 ccf77bbbafc9 58f02a033062 "/bin/bash" 17 seconds ago Up 16 seconds centos1 31 [root@localhost nginx]# docker exec 19df38d91d74 ifconfig 获取容器ip 32 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 33 inet 172.18.0.3 netmask 255.255.0.0 broadcast 0.0.0.0 34 inet6 fe80::42:acff:fe12:3 prefixlen 64 scopeid 0x20<link> 35 ether 02:42:ac:12:00:03 txqueuelen 0 (Ethernet) 36 RX packets 8 bytes 656 (656.0 B) 37 RX errors 0 dropped 0 overruns 0 frame 0 38 TX packets 8 bytes 656 (656.0 B) 39 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 40 41 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 42 inet 127.0.0.1 netmask 255.0.0.0 43 inet6 ::1 prefixlen 128 scopeid 0x10<host> 44 loop txqueuelen 1000 (Local Loopback) 45 RX packets 0 bytes 0 (0.0 B) 46 RX errors 0 dropped 0 overruns 0 frame 0 47 TX packets 0 bytes 0 (0.0 B) 48 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 49 50 [root@localhost nginx]# docker exec ccf77bbbafc9 ifconfig 获取容器ip 51 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 150052 inet 172.18.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 53 inet6 fe80::42:acff:fe12:2 prefixlen 64 scopeid 0x20<link> 54 ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet) 55 RX packets 24 bytes 1968 (1.9 KiB) 56 RX errors 0 dropped 0 overruns 0 frame 0 57 TX packets 8 bytes 656 (656.0 B) 58 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 59 60 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 61 inet 127.0.0.1 netmask 255.0.0.0 62 inet6 ::1 prefixlen 128 scopeid 0x10<host> 63 loop txqueuelen 1000 (Local Loopback) 64 RX packets 0 bytes 0 (0.0 B) 65 RX errors 0 dropped 0 overruns 0 frame 0 66 TX packets 0 bytes 0 (0.0 B) 67 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 68 69 [root@localhost nginx]# docker exec 19df38d91d74 ping 172.18.0.2 ping另一个容器 70 PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data. 71 64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.109 ms 72 64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.074 ms 73 64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.076 ms 74 75 配置dns 76 我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS: 77 { 78 "dns" : [ 79 "114.114.114.114", 80 "8.8.8.8" 81 ] 82 } 83 设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。 84 配置完,需要重启 docker 才能生效。 85 查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息: 86 cat etc/resolv.conf 查看容器的dns 87
docker仓库管理
仓库是集中存放镜像的地方 你docker pull 拉取的镜像都是从仓库里面拉取的
官方仓库( Docker Hub):https://hub.docker.com/(当然不止 docker hub,只是远程的服
务商不一样,操作都是一样的。)
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
登录
1 [root@localhost nginx]# docker login 2 Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. 3 Username: 1181469655 4 Password: 5 Login Succeeded 6 7 使用docker login来登录 8 输入命令会出现输入账号和密码的地方 9 输入完成后点回车出现Login Succeeded就是登录成功了 10
退出
1 docker logout
推送镜像
1 docker push xiaolecentos:1.0