文章目录
-
-
- 安装docker
- 卸载docker
- 删除镜像
- 容器命令
- 查看日志
- 进入正在运行的容器
- 从容器内拷贝文件到主机上
- 启动ES
- Docker可视化
- Docker保存加载镜像
-
- [tag 镜像](#tag 镜像)
- commit镜像
- [save 保存镜像](#save 保存镜像)
- [load 加载镜像](#load 加载镜像)
- [import 加载镜像](#import 加载镜像)
- Docker数据卷
- DockerFille
-
- dockerFile指令
- [CMD 和 ENTRYPOINT 的区别](#CMD 和 ENTRYPOINT 的区别)
- 制作Tomcat镜像
- [Tomcat 的挂载目录](#Tomcat 的挂载目录)
- Nginx
- Docker网络
-
- 创建集群
- 连接集群
- 查看集群信息
- [cluster info](#cluster info)
- [cluster nodes](#cluster nodes)
安装docker
sh
# 1. 卸载旧版docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 需要的安装包
sudo yum install -y yum-utils
# 3. 设置镜像仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的贼慢
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云, 贼快
# 更新yum软件包索引
sudo yum makecache fast
# 4. 安装docker相关的 docker-ce 社区版 ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io
# 5. 启动docker
sudo systemctl start docker
# 6. 使用docker version查看是否安装成功
docker version
# 7. hello world
sudo docker run hello-world
卸载docker
shell
# 1. 卸载镜像
sudo yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除目录
sudo rm -rf /var/lib/docker
# 3. /var/lib/docker docker的默认工作路径
删除镜像
shell
docker rmi 镜像id -f # 删除指定镜像
docker rmi 镜像id 镜像id -f # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除所有镜像
容器命令
shell
# --name 给容器起名
# -p 端口映射
# -d 后台启动
# -it 交互模式启动
# 交互模式启动
docker run -it 镜像名/id /bin/bash
docker run -it --name 起容器名 -p 宿主机端口:容器内部端口 镜像名/id /bin/bash
# 后台启动容器 没有前台进程会自动停止
docker run -d 镜像名/id
# 关闭即删除容器 一般测试用
docker run -it --rm 镜像名/id
# 退出容器
Ctrl + P + Q # 保存退出
exit # 杀掉容器退出
# 查看容器
-a 显示所有容器
-q 显示id
docker ps -aq
# 启动容器
docker start 容器id
docker restart 容器id
# 停止容器
docker stop 容器id
docker kill 容器id
# 删除指定容器
docker rm -f 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
查看日志
shell
# 查看指定数量日志
docker logs -t -f --tail 10(日志条数) 容器id
# 查看所有日志
docker logs -tf 容器id
# 自己编写shell脚本启动, 为了产生日志
docker run -d centos /bin/sh -c "while true; do echo jiawei;sleep 1; done"
查看容器进程信息
shell
# 查看docker容器进程信息
docker top 容器id
查看镜像源数据
shell
docker inspect 容器id
进入正在运行的容器
shell
# 进入容器 新开一个终端
docker exec -it 容器id /bin/bash
# 进入容器原来的终端
docker attach 容器id
从容器内拷贝文件到主机上
shell
# 从容器内拷贝文件到linux主机上
docker cp 容器id:容器内路径 目标主机路径
启动ES
shell
# 启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type-single-node" 容器id
# 增加内存限制, 修改配置文件 -e 环境配置修改
docker run -d --name es01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
Docker可视化
portainer ---> Docker的图形化管理页面Rancher
portainer
shell
# 下载加启动
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试: http://ip:8088 http://42.194.193.13:8088
Docker保存加载镜像
tag 镜像
shell
# 镜像打 tag 标签
docker tag 镜像id/名 新名字
docker tag fce91102e17d tomcat01
commit镜像
shell
docker commit 提交容器成为一个新的副本
# 容器生成新镜像
docker commit -m="提交描述信息" -a="作者" 容器id 自己起镜像名:版本
docker commit -m="新增app" -a="jiawei" 容器id tomcat:1.0
save 保存镜像
shell
# 把镜像打包成 .tar
-o 要保存路径.tar
> 要保存路径.tar
docker save 镜像id>/存储路径/xxx.tar
docker save fce91102e17d>/root/tomcat.tar
docker save 镜像id -o 存储路径
docker save fce91102e17d -o /root/tomcat.tar
load 加载镜像
shell
# 加载镜像
-i .tar包路径
< .tar包路径
docker load</镜像路径/xxx.tar
docker load</root/xxx.tar
docker load -i /路径/xxx.tar
docker load -i /root/tomcat.tar
import 加载镜像
shell
# 使用
docker import /镜像路径/xx.tar 新镜像名
docker import /root/tomcat.tar tomcat01
Docker数据卷
容器之间的数据共享技术, Docker容器产生的数据同步到本地
卷技术 --> 目录挂载, 将容器内的目录挂载到服务器上
使用命令来挂载 -v
shell
# 可以挂载多个目录
docker run -it -v 主机目录地址:容器内目录地址
# 测试
docker run -it -v /root/temp:/home centos /bin/bash
linux主机的temp目录就和容器的home目录的操作是双向绑定了
删除容器并不会删除linux主机的数据
安装Mysql
shell
启动mysql是需要配置密码的
# 官方测试
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mypassword -dmysql:tag
# 自己运行容器挂载目录
-v 卷挂载
-e 环境配置
docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
具名和匿名挂载
shell
# 匿名挂载
-P 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 具名挂载
-v 挂载名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 卷操作
docker volume --help
create Create a volume
inspect Display detailed information on one or more volumes
ls 查看所有卷
prune Remove all unused local volumes
rm Remove one or more volumes
# docker volume ls
local 39381d9f3555d38c6c24dcb0d3e7d6813b7e869e4c1a0f4e0a24c128dd483148 # 匿名挂载
local juming-nginx # 具名挂载
# 查看卷 docker volume inspect 卷id/卷名
docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-08-29T13:35:12+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有容器内的卷, 在没有指定目录的情况下都可以在这查看: `/var/lib/docker/volumes/xxx/_data`
扩展
shell
# -v 容器内路径:ro rw 设置读写权限 默认是 rw
:ro readonly 只读
:rw readwrite 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 路径只能通过宿主机来操作, 容器内无法操作
数据卷容器
--volumes-from 容器名
shell
# 通过 --volumes-from 容器名/id 来同步docker01的数据卷
--volumes-from 容器名/id # 同步这个容器的数据卷
docker run -it --name docker02 --volumes-from docker01 jiawei-centos:1.0
多个容器通过 --volumes-from 绑定的容器之间是双向绑定的, 删除`数据卷容器`不会影响其他容器, 其他容器他们还是绑定的
# 就是把所有关联的容器都停止了, 才会结束
结论: 数据卷容器的生命周期会一直持续到没有容器使用为止
DockerFille
shell
# 创建dockerFile文件 , 文件名可以随意, 最好就用 Dockerfile
# 指令(大写) 后面接参数
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "____end___"
CMD /bin/bash
# 构建容器
-f dockerFile 文件路径
-t 镜像名:版本
. 生成到哪里
docker build -f ./dockerFile01 -t jiawei-centos:1.0 .
dockerFile指令
shell
FROM # 基础镜像, 一起从这里开始构建
MAINTAINER # 镜像作者, 按照国际惯例一般是 姓名+邮箱
RUN # 镜像构建时运行的命令
ADD # 添加的东西, 会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 卷的挂载目录
EXPOSE # 暴露端口
CMD # 容器启时运行的命令, 只有最后一个会生效, 可被替代
ENTRYPOINT # 容器启时运行的命令, 可以追加命令
ONBUILD # 构建一个被继承 DockerFile 这个时候就好运行 ONBUILD 指令, 触发指令
COPY # 复制, 类似ADD指令
ENV # 构建的时候设置环境变量
dockerHub 中99%的镜像都是通过它来构建的 FROM scratch
shell
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20200809" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-08-09 00:00:00+01:00"
CMD ["/bin/bash"]
创建一个自己的centos
shell
# 1. 编写Dockerfile 文件
[root@VM-0-5-centos dockerfile]# cat myDockerfile-centos
FROM centos
MAINTAINER jiawei<154>
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 镜像名:版本 .
列出docker镜像的历史 docker history 镜像名/id
CMD 和 ENTRYPOINT 的区别
shell
CMD # 容器启时运行的命令, 只有最后一个会生效, 可被替代
ENTRYPOINT # 容器启时运行的命令, 可以追加命令
测试CMD
shell
# 编写 vim dockerfile-centos-test
FROM centos
CMD ["ls", "-a"]
# 构建镜像 docker build -f ./dockerfile-centos-test -t centostest .
# 启动容器
[root@VM-0-5-centos dockerfile]# docker run centostest
.
..
.dockerenv
bin
dev
etc
usr
var
# 运行并追加一个命令 -l ls -al
[root@VM-0-5-centos dockerfile]# docker run b2554c35551a -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
# 替换CMD需要写全命令, 这个命令会直接替换CMD
docker run b2554c35551a ls -al
测试ENTRYPONINT
shell
# 编写dockerfile
FROM centos
ENTRYPOINT ["ls", "-a"]
[root@VM-0-5-centos dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint .
[root@VM-0-5-centos dockerfile]# docker run a624f83fcdcc
.
..
.dockerenv
bin
dev
etc
usr
var
# 我们追加的命令是直接拼接在 ENTRYPOINT 命令后面的
[root@VM-0-5-centos dockerfile]# docker run a624f83fcdcc -l
total 56
drwxr-xr-x 1 root root 4096 Aug 30 07:27 .
drwxr-xr-x 1 root root 4096 Aug 30 07:27 ..
-rwxr-xr-x 1 root root 0 Aug 30 07:27 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Aug 30 07:27 dev
drwxr-xr-x 1 root root 4096 Aug 30 07:27 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 92 root root 0 Aug 30 07:27 proc
dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Aug 29 15:57 sys
drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
drwxr-xr-x 20 root root 4096 Aug 9 21:40 var
制作Tomcat镜像
shell
# vim Dockerfile
FROM centos
MAINTAINER jiawei<154@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.37-src.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37-src
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37-src
ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD echo "_____end_____"
CMD /usr/local/apache-tomcat-9.0.37-src/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.37-src/bin/catalina.out
# 生成镜像
docker build -t diytomcat .
# 生成容器
docker run -d -p 9090:8080 --name jiaweitomcat -v /root/jiawei/tomcat/test:/usr/local/apache-tomcat-9.0.37-src/webapps/test -v /root/jiawei/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.37-src/logs diytomcat
web.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
Tomcat 的挂载目录
shell
tomcat 官方镜像的挂载目录
静态文件目录: /usr/local/tomcat/webapps
日志目录: /usr/local/tomcat/logs
# 启动容器 , 新增项目直接在linux的 /root/www/webapps/ 下面建立文件就可直接访问
# http://42.194.193.13:9091/photo2/
docker run -d -p 9090:8080 --name tomcatApps -v /root/www/webapps:/usr/local/tomcat/webapps -v /root/www/webappslogs/:/usr/local/tomcat/logs tomcat
Nginx
shell
# 官方
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
# 自己挂载
静态文件目录: /usr/share/nginx/html
docker run -d -p 8007:80 --name gf-dock-nginx -v /root/www/gf-dock:/usr/share/nginx/html:ro nginx
Docker网络
理解Docker0
shell
# linux ip addr 查看 ip 地址
[root@VM-0-5-centos ~]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:ef:5a:40 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.5/20 brd 172.16.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:feef:5a40/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:11:b1:c1:12 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:11ff:feb1:c112/64 scope link
valid_lft forever preferred_lft forever
# docker run -d -P --name tomcat01 tomcat
# 查看容器内部网络地址 ip addr
# 启动容器会得到一个 eth0@if195 的ip地址 这个是docker分配的
# docker exec -it tomcat01 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
194: eth0@if195: <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 通 docker 容器内部的ip 172.17.0.2
[root@VM-0-5-centos ~]# 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.096 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.077 ms
原理
- 我们每启动一个容器, docker 就会给容器分配一个ip, docker默认带了一个网卡
docker0 - 桥接模式, 使用的技术是 veth-pair 技术
shell
# 再次 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:ef:5a:40 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.5/20 brd 172.16.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:feef:5a40/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:11:b1:c1:12 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:11ff:feb1:c112/64 scope link
valid_lft forever preferred_lft forever
195: veth1686462@if194: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether f6:f1:b0:0b:2e:65 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::f4f1:b0ff:fe0b:2e65/64 scope link
valid_lft forever preferred_lft forever
# 发现每启动一个容器就会多一对网卡, veth-pair
容器内: 194: eth0@if195
linux: 195: veth1686462@if194
发现容器带来的网卡都是一对一对的
veth-pair 就是一对虚拟设备的接口, 他们都是成对出现的, 一端连着协议, 一端彼此相连
正因为有这个特性, veth-pair 充当一个桥梁, 连接各种虚拟网络设备的
openStac, docker容器之间的连接, ovs的连接, 都是使用 veth-pair 技术
- 测试 tomcat 容器之间是否可以ping通.
shell
[root@VM-0-5-centos ~]# docker exec -it tomcat01 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.087 ms
# 结论: 容器和容器之间是可以互相ping通的, 他们是共用的一个路由器 docker0
# 所有容器在不指定网络的情况下, 都是使用的 docker0 路由器, docker会给我们的容器分配一个默认的可用ip
docker使用的就是linux的桥接, 宿主机是一个docker容器的网桥 docker0
--link
容器之间可否直接通过 容器名 来ping通
shell
[root@VM-0-5-centos ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
# 无法ping通
# 通过 --link 来指定容器,
docker run -it -d -P --name tomcat04 --link tomcat03 tomcat
# tomcat04可以ping通 tomcat03
docker exec -it tomcat04 ping tomcat03
PING tomcat03 (172.17.0.4) 56(84) bytes of data.
64 bytes from tomcat03 (172.17.0.4): icmp_seq=1 ttl=64 time=0.111 ms
64 bytes from tomcat03 (172.17.0.4): icmp_seq=2 ttl=64 time=0.079 ms
# 但是 tomcat03 无法ping通 tomcat04, 因为没有配置
docker exec -it tomcat03 ping tomcat04
ping: tomcat04: Name or service not known
# 查看 hosts 发现 tomcat04 是在本地配置了 tomcat03 的配置
# docker exec -it tomcat04 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 tomcat03 fe53c80fb01d
172.17.0.5 fb7dd47cedb0
--link 就是在 hosts 中增加了一个
172.17.0.4 tomcat03 fe53c80fb01d映射
自定义网络
查看 docker 所有网络
shell
# docker network ls
NETWORK ID NAME DRIVER SCOPE
5093a364842e bridge bridge local
dab2c8d584a1 host host local
7a9cd5c5dfb0 none null local
网络模式
bridge : 桥接 docker 默认
none : 不配置网络
host : 和宿主机共享网络
container: 容器网络连通 (用的少, 局限性很大)
测试
shell
# 我们直接启动的容器默认是带 --net bridge, 这就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0 ,不支持域名连接, 需要配置 --link
# 自己创建一个网络
--driver bridge # 使用网络模式
--subnet 192.168.0.0/16 # 配置子网 网段
--gateway 192.168.0.1 # 网关
[root@VM-0-5-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
f0875bec24336bb6146a61196f1deb87dec22622139200694b32be4cc4cacfbb
[root@VM-0-5-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5093a364842e bridge bridge local
dab2c8d584a1 host host local
f0875bec2433 mynet bridge local
7a9cd5c5dfb0 none null local
# 再次测试 ping 连接
[root@VM-0-5-centos ~]# docker exec -it tomcat-net-1 ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.058 ms
^C
--- 192.168.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.051/0.054/0.058/0.008 ms
# 不配置 --link 也能 ping 通了
[root@VM-0-5-centos ~]# docker exec -it tomcat-net-1 ping tomcat-net-2
PING tomcat-net-2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from tomcat-net-2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.112 ms
我们自定义的网络docker都已经帮我们维护好了对应的关系, 推荐使用自定义网络
好处:
redis - 不同集群使用不同的网络, 可以保证集群的安全和健康 - 192.160.0.0
mysql - 不同集群使用不同的网络, 可以保证集群的安全和健康 - 192.161.0.0
网络连通
docker network connect 网络 容器
docker network connect mynet tomcat1
shell
# docker network --help
-connect 将容器连接到网络
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
测试打通 tomcat1 - mynet
shell
# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
# 测试打通 tomcat1 - mynet
docker network connect mynet tomcat1
docker network inspect mynet
[
{
"Name": "mynet",
"Id": "f0875bec24336bb6146a61196f1deb87dec22622139200694b32be4cc4cacfbb",
"Created": "2020-08-31T23:01:05.377122843+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"ConfigOnly": false,
"Containers": {
"196b22895d67fc45d628d13ef04b3513ec49a0b92f8540313864077d350a4e4c": {
"Name": "tomcat1",
"EndpointID": "7760c72a1b5f99c7e9a0808ce0aee90772ee7c8cdcac1eba1debf171180a8fae",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"8bb8f74ed7f34f1b5a1c15765b1aa06de2a67483a5c4194a4c9e2311835eb3d2": {
"Name": "tomcat-net-2",
"EndpointID": "dc325d398d9660817cd2146da45118439ca347e2ab8011cb6938c8e6238701cf",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"9f9e3c2df9b306f1e950333c6091ee2b5a5fcbb9c360468f2463c4421fb1db46": {
"Name": "tomcat-net-1",
"EndpointID": "b91c4649e46c44f421cd51bdc34b7c13e62566230b8c868ee1247eba145dc8a3",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
打通之后就是将容器 tomcat1 放到了 mynet 网络下
一个容器两个 ip 地址, 就好像阿里云: 公网ip, 内网ip
shell
# 容器 tomcat1 可以连通了
[root@VM-0-5-centos ~]# docker exec -it tomcat1 ping tomcat-net-1
PING tomcat-net-1 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-1.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from tomcat-net-1.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.102 ms
# tomcat2 依旧是连不通, 需要 docker network connect mynet tomcat2 就可以了
[root@VM-0-5-centos ~]# docker exec -it tomcat2 ping tomcat-net-1
ping: tomcat-net-1: Name or service not known
部署Redis集群
shell1. 创建网卡 docker network create redis --subnet 172.38.0.0/16 2. 通过脚本创建六个redis配置 for port in $(seq 1 6); \ do \ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >/mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done 3. 通过脚本启动容器 for port in $(seq 1 6); \ do \ docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \ -v /mydata/redis/node-${port}/data:/data \ -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf done 4. 进入集群 docker exec -it redis-1 /bin/sh 5. 创建集群 redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1 6. 连接集群 redis-cli -c 7. 查看集群信息 cluster info cluster nodes
shell脚本
shell
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 脚本启动容器
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
# 手动启动容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 进入集群
docker exec -it redis-1 /bin/sh
# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
# 连接集群
-c 是连接集群, 没有 -c 是单机
redis-cli -c
# 查看集群信息
# cluster info
# cluster nodes
127.0.0.1:6379> cluster nodes
e1a1245165fcd7c030516f41a751b5f76740a61e 172.38.0.12:6379@16379 master - 0 1598967486000 2 connected 5461-10922
7ce789c1ab50946b5c9bd6d899dbd703e16064e8 172.38.0.15:6379@16379 slave a1e40af6cccba855672b4800d17c7447672516a3 0 1598967487554 5 connected
97bb731db30b8ed411038710c318841571b488b9 172.38.0.13:6379@16379 master,fail - 1598967256569 1598967254000 3 connected
17558c52416d5da377c2a3cc0fc7ac93170d9aad 172.38.0.14:6379@16379 master - 0 1598967487000 7 connected 10923-16383
126fb135b5384ec9f3c33cbc5c8fd5bc5129c406 172.38.0.16:6379@16379 slave e1a1245165fcd7c030516f41a751b5f76740a61e 0 1598967487855 6 connected
a1e40af6cccba855672b4800d17c7447672516a3 172.38.0.11:6379@16379 myself,master - 0 1598967486000 1 connected 0-5460
n/sh
创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
连接集群
-c 是连接集群, 没有 -c 是单机
redis-cli -c
查看集群信息
cluster info
cluster nodes
127.0.0.1:6379> cluster nodes
e1a1245165fcd7c030516f41a751b5f76740a61e 172.38.0.12:6379@16379 master - 0 1598967486000 2 connected 5461-10922
7ce789c1ab50946b5c9bd6d899dbd703e16064e8 172.38.0.15:6379@16379 slave a1e40af6cccba855672b4800d17c7447672516a3 0 1598967487554 5 connected
97bb731db30b8ed411038710c318841571b488b9 172.38.0.13:6379@16379 master,fail - 1598967256569 1598967254000 3 connected
17558c52416d5da377c2a3cc0fc7ac93170d9aad 172.38.0.14:6379@16379 master - 0 1598967487000 7 connected 10923-16383
126fb135b5384ec9f3c33cbc5c8fd5bc5129c406 172.38.0.16:6379@16379 slave e1a1245165fcd7c030516f41a751b5f76740a61e 0 1598967487855 6 connected
a1e40af6cccba855672b4800d17c7447672516a3 172.38.0.11:6379@16379 myself,master - 0 1598967486000 1 connected 0-5460