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

复制代码
相关推荐
XIAOHEZIcode21 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化