Docker常用配置
安装docker
# 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
# 1. 卸载镜像 sudo yum remove docker-ce docker-ce-cli containerd.io # 2. 删除目录 sudo rm -rf /var/lib/docker # 3. /var/lib/docker docker的默认工作路径
删除镜像
docker rmi 镜像id -f # 删除指定镜像 docker rmi 镜像id 镜像id -f # 删除多个镜像 docker rmi -f $(docker images -aq) # 删除所有镜像
容器命令
# --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)
查看日志
# 查看指定数量日志 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"
查看容器进程信息
# 查看docker容器进程信息 docker top 容器id
查看镜像源数据
docker inspect 容器id
进入正在运行的容器
# 进入容器 新开一个终端 docker exec -it 容器id /bin/bash # 进入容器原来的终端 docker attach 容器id
从容器内拷贝文件到主机上
# 从容器内拷贝文件到linux主机上 docker cp 容器id:容器内路径 目标主机路径
启动ES
# 启动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
# 下载加启动 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 镜像
# 镜像打 tag 标签 docker tag 镜像id/名 新名字 docker tag fce91102e17d tomcat01
commit镜像
docker commit 提交容器成为一个新的副本 # 容器生成新镜像 docker commit -m="提交描述信息" -a="作者" 容器id 自己起镜像名:版本 docker commit -m="新增app" -a="jiawei" 容器id tomcat:1.0
save 保存镜像
# 把镜像打包成 .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 加载镜像
# 加载镜像 -i .tar包路径 < .tar包路径 docker load</镜像路径/xxx.tar docker load</root/xxx.tar docker load -i /路径/xxx.tar docker load -i /root/tomcat.tar
import 加载镜像
# 使用 docker import /镜像路径/xx.tar 新镜像名 docker import /root/tomcat.tar tomcat01
Docker数据卷
容器之间的数据共享技术, Docker容器产生的数据同步到本地
卷技术 --> 目录挂载, 将容器内的目录挂载到服务器上
使用命令来挂载 -v
# 可以挂载多个目录 docker run -it -v 主机目录地址:容器内目录地址 # 测试 docker run -it -v /root/temp:/home centos /bin/bash linux主机的temp目录就和容器的home目录的操作是双向绑定了 删除容器并不会删除linux主机的数据
安装Mysql
启动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
具名和匿名挂载
# 匿名挂载
-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`
扩展
# -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 容器名
# 通过 --volumes-from 容器名/id 来同步docker01的数据卷 --volumes-from 容器名/id # 同步这个容器的数据卷 docker run -it --name docker02 --volumes-from docker01 jiawei-centos:1.0 多个容器通过 --volumes-from 绑定的容器之间是双向绑定的, 删除`数据卷容器`不会影响其他容器, 其他容器他们还是绑定的 # 就是把所有关联的容器都停止了, 才会结束 结论: 数据卷容器的生命周期会一直持续到没有容器使用为止
DockerFille
# 创建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指令
FROM # 基础镜像, 一起从这里开始构建 MAINTAINER # 镜像作者, 按照国际惯例一般是 姓名+邮箱 RUN # 镜像构建时运行的命令 ADD # 添加的东西, 会自动解压 WORKDIR # 镜像的工作目录 VOLUME # 卷的挂载目录 EXPOSE # 暴露端口 CMD # 容器启时运行的命令, 只有最后一个会生效, 可被替代 ENTRYPOINT # 容器启时运行的命令, 可以追加命令 ONBUILD # 构建一个被继承 DockerFile 这个时候就好运行 ONBUILD 指令, 触发指令 COPY # 复制, 类似ADD指令 ENV # 构建的时候设置环境变量
dockerHub 中99%的镜像都是通过它来构建的 FROM scratch
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
# 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 的区别
CMD # 容器启时运行的命令, 只有最后一个会生效, 可被替代 ENTRYPOINT # 容器启时运行的命令, 可以追加命令
测试CMD
# 编写 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
# 编写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镜像
# 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 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 的挂载目录
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
# 官方 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
# 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 技术
# 再次 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通.
[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通
[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 所有网络
# 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: 容器网络连通 (用的少, 局限性很大)
测试
# 我们直接启动的容器默认是带 --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
# 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
# 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
# 容器 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集群
1. 创建网卡
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脚本
# 创建网卡
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
更多推荐


所有评论(0)