6、Docker常用配置

文章目录

安装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

原理

  1. 我们每启动一个容器, docker 就会给容器分配一个ip, docker默认带了一个网卡 docker0
  2. 桥接模式, 使用的技术是 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 技术

  1. 测试 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

容器之间可否直接通过 容器名 来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集群
shell 复制代码
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脚本

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

复制代码
相关推荐
星谐4 小时前
AutoUploadLL:自动化上传工具开发实践
运维·自动化
NineData4 小时前
NineData将亮相2026德国汉诺威工业博览会
运维·数据库·后端
CXH7284 小时前
nginx——https
运维·nginx·https
SPC的存折4 小时前
4、Docker私有仓库
运维·docker·容器
开开心心_Every4 小时前
扫描软件,部分文档文字表格识别功能可免费
运维·服务器·pdf·电脑·excel·3dsmax·houdini
陆伟峰(云固件作者)5 小时前
Linux Mint 22.3:给初学者的第一份 Linux 说明书
linux·运维·服务器
无忧智库5 小时前
从数据孤岛到全球实时协同:某跨国企业 Data Fabric 供应链数据编织平台全解析(WORD)
运维·fabric
齐潇宇5 小时前
Docker概述与安装
linux·运维·docker·容器
Dragon水魅6 小时前
爬虫技术详解:从传统爬虫到浏览器自动化——以豆瓣读书笔记为例
运维·爬虫·自动化