Docker学习
文章目录
DevOps(开发运维)
- 应用更加快速的交付和部署
- 传统:一堆帮助文档,安装程序
- docker:打包镜像发布测试,一键运行
- 更加便捷的升级和扩缩容
- 使用docker之后,我们部署应用就和搭积木一样。
- 项目大巴为一个镜像,扩展,服务器A,服务器B
- 更加简单的系统运维
- 在容器化之后,我们的开发,测试环境都是高度一致的
- 更高效的计算资源利用
- docker是内核级的虚拟化,可以在一个物理机上运行和很多容器实例,服务器的性能能被压榨到极致
Docker安装
组成
- 镜像(image):
- docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
- 容器(container):
- docker利用容器技术,独立运行或者一组应用,都是通过镜像来创建的。
- 仓库(repository):
- 仓库就是存放镜像的地方
- 分为公有仓库和私有仓库
安装
# 卸载之前的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 需要的安装包
yum install -y yum-utils
# 设置镜像的仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#安装docker相关的 docker-ce 社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
#检查docker版本
docker version
# 查看当前docker镜像
docker images
# 卸载docker
yum remove docker-ce docker-ce-cli containerd.io
# 删除docker的运行环境
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://b7aniyzs.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
docker是怎么工作的
docker是一个client/server结构的系统,docker的守护进程运行在主机上,通过socker从客户端访问
DockerServer接收到deocker-client的指令,就会执行这个命令。
docker为什么比虚拟机快
- docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,vm需要的Guest OS
所以新建一个容器时,docker不需要像虚拟机一样重新加载一个操作系统的内核,避免引导。虚拟机是 加载Guest OS(分钟级别);
docker是利用宿主机的操作系统,省略了这个复制的过程(秒级)
Docker的常用命令
帮助命令
docker version #显示docker版本
docker info #docker的系统信息
docker 命令 --help #docker的所有命令,帮助文档:https://docs.docker.com/reference/
镜像命令
docker images #查看本地主机上的所有镜像
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
docker search #搜索镜像
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 搜索stars大于3000的images
# [root@localhost aubin]# docker search mysql --filter=STARS=3000
# NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# mysql MySQL is a widely used, open-source relation… 10696 [OK]
# mariadb MariaDB Server is a high performing open sou… 4020 [OK]
docker pull #下载镜像
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 如果不写tag,默认下载最新版
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
docker rmi -f IMAGE ID #可以根据镜像的名称或者id删除,-f为递归删除
容器命令
启动容器:
docker pull centos #下载centos
docker run[参数] image #新建容器并启动
#参数说明
--name="name" 容器得到名称
-d 后台方式启动
-it 使用交互方式运行,进入容器查看内容
[root@localhost aubin] docker run -it centos /bin/bash
[root@a813725079a9 /]
-p 指定容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P 随即指定端口
列出启动容器
docker ps #当前在运行的容器
-a #当前正在运行的容器以及之前运行的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
退出容器
exit #停止容器,并退出容器
ctrl+p+q #容器不停止,退出容器
删除容器
docker rm 容器id #删除指定的容器
docker rm -f $(docker ps -aq) #删除所有的容器
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前正在运行的容器
常用的其他命令
后台启动容器
docker run -d 镜像名
# 问题:docker ps,发现centos停止了,
# 原因:docker容器后台启动运行必须有一个前台进程,docker发现没有应用,就会自动停止
查看日志
docker logs 容器
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
查看容器中进程信息
docker top 容器id
查看镜像的元数据
docker inspcet 容器id
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
进入容器的命令
docker exec -it 容器id /bin/bash #进入容器后开启一个新的终端
docker attach 容器id #进入容器正在执行的终端
从容器中拷贝文件到主机上
docker cp 容器id:容器 内路径 目的主机路径
docker全部命令
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
可视化
docker图形化界面管理工具,提供一个后台面板供我们操作
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true protainer/portainer
Docker镜像
镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件。它包含运行某个软件所需要的内容,包括代码,运行库,环境变量和配置文件。
Docker镜像加载原理
UnionFS 联合文件系统
UnionsFS(联合文件系统):Unions文件系统是一种分层,轻量级并且高性能的文件系统,它支持文件系统的修改,作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一文件系统下,unions文件系统时docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面来看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层层的文件系统组成,这种层级的文件系统UnionsFS
bootfs(boot file system):主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层时bootfs,这一层与我们典型的linux和unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev,/proc,/bin等标准目录和文件,rootfs就是各种不同操作系统发行版
特点
docker镜像是只读的,当容器启动时,一个性的可写层被加载到镜像的顶部,这一层就是我们常说的容器层,容器之下的都是镜像层。
commit镜像
docker commit #提交容器成为一个新的副本
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
容器数据卷
什么是容器数据卷
如果数据都在容器当中,那么当容器被删除时,数据也会随之消失。这是不符合常理的
容器之间可以有一个数据共享技术,docker容器产生的数据,同步到本地。
使用数据卷
方式一:直接使用命令来挂载, -v
docker run -it -v /主机目录:/容器内目录 容器名称
具名挂载和匿名挂载
查看所有数据卷
docker volume ls
匿名挂载
docker run -d -P --name xxx -v 容器内路径 容器名称
具名挂载
docker run -d -P --name xxx -v 数据卷名称:/容器内路径 容器名称
拓展:
#通过 -v 容器内路径:ro rw 来改变读写权限
ro:readonly 只读,只能通过宿主机来操作,容器内部是无法操作的
rw:readwrite 可读可写
#一旦设置了这个权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name xxx -v 数据卷名称:/容器内路径:ro 容器名称
docker run -d -P --name xxx -v 数据卷名称:/容器内路径:ro 容器名称
Dockerfile
Dockerfile就是用来构建docker镜像的构建文件,命令脚本,通过这个脚本可以生成镜像
镜像是一层一层的,脚本一个个命名,每个命令都是一层
#创建dockerfile1
#指令 参数
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "----end----"
CMD /bin/bash
############################################
[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t fish/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume1","volume2"]
---> Running in 4069e6fe5e74
Removing intermediate container 4069e6fe5e74
---> dac16a6d20d9
Step 3/4 : CMD echo "----end----"
---> Running in ca24cd107d35
Removing intermediate container ca24cd107d35
---> 0f8dafc4505c
Step 4/4 : CMD /bin/bash
---> Running in 6d3af61e7905
Removing intermediate container 6d3af61e7905
---> 5d6ed52c3b3a
Successfully built 5d6ed52c3b3a
Successfully tagged fish/centos:1.0
数据卷容器
docker run -it --name xxx2 --volumes-from xxx1 容器名称
# 将xxx1的数据同步到xxx2上 ,实现容器间的数据共享,如果xxx1挂掉,xxx2仍然存在备份。
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到本地后,本地的数据是不会随着数据卷容器生命周期结束而消失的。
Dockerfile基础知识
- 每个保留关键字都是大写
- 执行从上到下顺序执行
#
表示注释- 每个指令都会创建提交一个新的镜像层,并提交
DockerFile指令说明
FROM #基础镜像
MAINTAINER #镜像是谁写的,姓名+邮箱(推荐)
RUN #镜像构建时需要运行的命令
ADD #步骤
WORKDIR #镜像的工作目录
VOLUME #数据卷挂载位置
EXPOSE #暴露端口
CMD #指定这个容器启动时需要执行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时需要执行的命令,可以追加命令
ONBUILD #当构建一个被继承Dockerfile时,就会运行ONBUILD指令,触发指令
COPY #雷士ADD,将文文件拷贝到镜像中
ENV #构建的时候设置环境变量
docker history 镜像id #查看镜像是如何构建的
CMD和ENTRYPOINT的区别
#CMD: 不可追加命令
[root@localhost dockerfile]# docker run -it cmdtest:1.0 -a
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-a": executable file not found in $PATH: unknown.
#ENTRYPOINT 可以追加命令
[root@localhost dockerfile]# docker run -it entrytest:1.0 -l
total 0
drwxr-xr-x. 1 root root 6 Apr 6 10:36 .
drwxr-xr-x. 1 root root 6 Apr 6 10:36 ..
-rwxr-xr-x. 1 root root 0 Apr 6 10:36 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Apr 6 10:36 dev
drwxr-xr-x. 1 root root 66 Apr 6 10:36 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 227 root root 0 Apr 6 10:36 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Apr 6 08:58 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
制作tomcat镜像
#dockerfile
FROM centos
MAINTAINER fish<19825957233@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.44.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_81
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.44
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.44
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /url/local/usr/local/apache-tomcat-9.0.44/bin/logs/catalina.out
#根据镜像文件构建镜像 镜像文件名为Dockerfile时,不必添加参数 -f 镜像文件名
docker build -t diytomcat .
#运行定制的tomcat 并将tomcat的webapps,logs和宿主机上的对应文件夹挂载
docker run -d -p 9090:8080 --name fishtomcat -v /home/fish/build/tomcat/test:/usr/local/apache-tomcat-9.0.44/webapps/test -v /home/fish/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.44/logs diytomcat
Docker网络
Usage: docker network COMMAND
Manage networks
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
Docker0的理解
我们每启动一个docker容器,docker就会给docker容器分配一个ip
只要我们安装了docker,就会有一个网卡docker0
不支持容器名连接访问
[root@localhost aubin]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f2:0c:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.193.129/24 brd 192.168.193.255 scope global noprefixroute dynamic ens33
valid_lft 1317sec preferred_lft 1317sec
inet6 fe80::76ac:bcf4:334e:f0fd/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:ee:d5:d5 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:ee:d5:d5 brd ff:ff:ff:ff:ff:ff
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:4c:34:8e:e4 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:4cff:fe34:8ee4/64 scope link
valid_lft forever preferred_lft forever
37: vethaf05402@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 76:6b:a4:cf:6b:e2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::746b:a4ff:fecf:6be2/64 scope link
valid_lft forever preferred_lft forever
#####################################
[root@localhost aubin]# docker exec -it diytomcat 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
36: eth0@if37: <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
从上可以看出每当我们创建一个容器,就会多出一对网卡
veth-pair技术
就是一对虚拟设备接口,它们都是成对出现的,一段连着协议,一段彼此相连
一般用这个来充当桥梁,连接各种虚拟网络设备
容器之间的相互通信
容器之间能不能直接ping通 --link(不推荐使用)
docker exec -it diytomcat ping diytomcat01
ping: diytomcat01: Name or service not known
# 不能直接ping通
# docker run -d -P --name diytomcat02 --link diytomcat01 diytomcat
622308d4f076eea901b1e3f59f716d7bce8716bdd43769990aae0636e61316de
# docker exec -it diytomcat02 ping diytomcat01
PING diytomcat01 (172.17.0.3) 56(84) bytes of data.
64 bytes from diytomcat01 (172.17.0.3): icmp_seq=1 ttl=64 time=0.132 ms
--- diytomcat01 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 0.119/0.124/0.132/0.005 ms
# 创建容器时 --link后可以直接ping通
#原理
#进入diytomcat02的容器的/etc/hosts文件中,我们可以发现我们将diytomcat01的ip地址配置再diytomcat02的配置中,
#也就是说当我们直接ping diytomcat01时,就自动转发到172.17.0.3这个ip地址
[root@784c94c04f0a etc]# cat 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.3 784c94c04f0a
自定义网络
Docker0特点
- 默认
- 域名,不能直接访问
查看所有的docker网络
# docker network ls
NETWORK ID NAME DRIVER SCOPE
96b8e3d5deab bridge bridge local
f0f35d8f95f0 host host local
000d60c48bd7 none null local
网络模式:
- bridge:桥接模式,docker默认
- none:不设置网络
- host:主机模式,和宿主机共享网络
- container:容器内网络联通(局限性很大)
测试:
# 直接启动命令 --net bridge,这个就是docker0
docker run -d -P --name tomcat01 --net bridge tomcat
# 自定义网络
docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge") #网络模式
--gateway strings IPv4 or IPv6 Gateway for the master subnet #网关
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment #子网地址
# 测试
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#将容器添加到我们的网络中
docker run -d -P --name tomcat-net-01 --net mynet diytomcat
#查看网络,可以看出已经将tomcat-net-01和tomcat-net-02加入到我们的网络中,这样属于该网络下的所有容器可以相互通信
docker network inspect mynet
################################
"Containers": {
"074194ba372bb948c919f44ca675cef3e913992c0c9b4b15ebb0ff7b9fc6afdf": {
"Name": "tomcat-net-02",
"EndpointID": "a38f5b7d1ff9f7c69a485748fd846aa2e0f962ecf2e6dd78119eea187d56e99f",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"e02fc2a6028fb0d592280e3d8f9f74e71275f2ca7014cf9c87022b1e0539a71e": {
"Name": "tomcat-net-01",
"EndpointID": "ed383cbd7625bcc2b5d7d593330189c37c371d87c9379be596305d3c01cb1594",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
}
###############################
自定义的网络,docker都已经帮我们维护好了对应的关系,推荐我们这这样使用
网络连通
将另一网络下的容器和指定的网络相连接
docker network connect mynet container
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
练习:部署Redis集群
#1.创建redis集群网络
docker network create redis --subnet 172.38.0.0/16
#2.编写脚本创建6个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
#脚本启动6个redis
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
#随便进入一个redis中
docker exec -it redis-1 /bin/sh #redis进入终端使用的是/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
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 254fd745c557966d19f0331b48139269d741a50c 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: 22a9301f3a5796c16cdd4a96f389fc0ef5efe554 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: d956958bf25a89888c8ba47ed59736ea717321c5 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: 352ec4e1f4f854a5f905e25a8752176a743a14c1 172.38.0.14:6379
replicates d956958bf25a89888c8ba47ed59736ea717321c5
S: 78fa165073334a195824532a495b7a08af93af18 172.38.0.15:6379
replicates 254fd745c557966d19f0331b48139269d741a50c
S: ea9f33808d27bfa562a4fd403995f475c2d056b8 172.38.0.16:6379
replicates 22a9301f3a5796c16cdd4a96f389fc0ef5efe554
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 254fd745c557966d19f0331b48139269d741a50c 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: ea9f33808d27bfa562a4fd403995f475c2d056b8 172.38.0.16:6379
slots: (0 slots) slave
replicates 22a9301f3a5796c16cdd4a96f389fc0ef5efe554
M: 22a9301f3a5796c16cdd4a96f389fc0ef5efe554 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 352ec4e1f4f854a5f905e25a8752176a743a14c1 172.38.0.14:6379
slots: (0 slots) slave
replicates d956958bf25a89888c8ba47ed59736ea717321c5
M: d956958bf25a89888c8ba47ed59736ea717321c5 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 78fa165073334a195824532a495b7a08af93af18 172.38.0.15:6379
slots: (0 slots) slave
replicates 254fd745c557966d19f0331b48139269d741a50c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slotscovered.
#进入redis客户端
redis-cli -c
#查看集群信息
cluster info
#查看节点信息
cluster nodes
本笔记来源于对b站up狂神说Docker的记录,仅用个人学习使用