Docker学习

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为什么比虚拟机快

img
  • 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的记录,仅用个人学习使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值