狂神B站Docker教程:https://www.bilibili.com/video/BV1og4y1q7M4
Docker是一种开源的容器化技术,可以打包应用及依赖包到可移植的镜像中,发布到任何流行的Linux或Windows的机器上。容器完全使用沙箱机制,相互之间不会有任何接口。
容器技术与虚拟机的区别
容器技术模拟的不是一个完整的操作系统。
虚拟机与Docker的区别:
- 虚拟机,虚拟出一套硬件,运行完整的操作系统,然后在这个系统上安装运行软件,十分笨重(资源占用多)
- Docker的内容直接运行在本地主机上,使用的是本机的内核,容器间互相隔离,每个容器都有自己的文件系统,互不影响。
Docker中的名称概念
- 镜像(image):
Docker中镜像相当于Java中的类,是一个模板,可以通过这个模板创建容器,通过镜像可以创建多个容器(最终服务运行就在容器中) - 容器(container):
Docker中容器相当于Java中的对象,由镜像创建。可以看做是一个简单的Linux系统 - 仓库(repository):
仓库是存放镜像的地方。
安装Docker
环境准备 :CentOS7 操作系统(可以使用虚拟机或购买云产品)
环境查看
# 查看系统内核版本
[root@bogon ~]# uname -r
3.10.0-1160.76.1.el7.x86_64
# 系统版本
[root@bogon ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装docker
官方安装文档:https://docs.docker.com/engine/install/centos/
# 1、卸载旧版本的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装yum工具
yum install -y yum-utils
#3、设置docker镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云的镜像仓库(国内)
yum makecache fast #建立元数据缓存
#4、安装docker
yum install docker-ce docker-ce-cli containerd.io
#5、启动docker
systemctl start docker
#6、验证docker安装成功
docker version
#7、启动hello-world
docker run hello-world
#8、卸载docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
配置阿里云镜像加速请参考:【狂神说Java】Docker最新超详细版教程第7集
Docker常用命令
官方命令文档:https://docs.docker.com/reference/
镜像命令
docker images:展示本地主机中的所有镜像
[root@bogon docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 9c7a54a9a43c 16 hours ago 13.3kB
#REPOSITORY 源仓库里镜像的名称
#TAG 镜像的版本
#IMAGE ID 镜像的id
#CREATED 镜像创建时间
#可选项
-a, --all #展示本地主机中的所有镜像的信息
-q, --quiet #仅展示本地主机中的所有镜像的id
docker search:搜索可下载的依赖
[root@bogon docker]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14096 [OK]
mariadb MariaDB Server is a high performing open sou… 5385 [OK]
#可选项
--filter STARS=3000 过滤收藏至少为3000的项
[root@bogon docker]# docker search mysql --filter stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14096 [OK]
mariadb MariaDB Server is a high performing open sou… 5385 [OK]
docker pull:下载镜像
#docker pull 镜像名 [:版本号]
[root@bogon docker]# docker pull mysql
Using default tag: latest #默认是最新版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
#指定版本下载
[root@bogon docker]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
** docker rmi**:删除镜像
删除1个或多个镜像:docker rmi -f 镜像id ...
删除所有镜像:docker rmi -f $(docker images -qa)
容器命令
新建容器并启动:docker run [可选参数] image
docker run [可选参数] image
#参数说明
--name="" #容器名称,给容器取名
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口 #常用方式
-p 容器端口
容器端口
-P #随机指定端口
#测试启动并进入容器
[root@bogon docker]# docker run -it centos /bin/bash
[root@c91317e04697 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#容器停止并退出
[root@c91317e04697 /]# exit
exit
[root@bogon docker]#
#容器退出不停止
Ctrl + P + Q
列出所有运行的容器:docker ps
# docker ps [可选参数]
# 不带参数,显示当前正在运行的容器
-a # 显示当前正在运行的容器+历史运行过的容器
-n=? # 显示最近创建的容器(?数量)
-q # 只显示容器的编号
[root@bogon /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@bogon /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c91317e04697 centos "/bin/bash" 3 minutes ago Exited (127) 2 minutes ago romantic_montalcini
b4d0775beb4b 9c7a54a9a43c "/hello" 6 hours ago Exited (0) 6 hours ago trusting_mendeleev
容器删除:docker rm
删除1个或多个容器:docker rm 容器id ... #不能删除正在运行的容器,可使用rm -f强制删除
删除所有容器:docker rm -f $(docker ps -aq)
删除所有容器:docker ps -aq |xargs docker rm
容器启动和停止
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强制停止容器
Commit镜像
docker commit -m="描述信息" -a="作者" 容器id/容器名 自定义镜像名:[tag(版本)]
测试:
常用的其他命令
后台启动容器的坑
docker run -d 镜像名
[root@bogon /]# docker run -d mysql
f8ff799695de3c2d649523df66f765aeec4224eacd30196541d81682d21fd485
[root@bogon /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8ff799695de mysql "docker-entrypoint.s…" 7 seconds ago Exited (1) 7 seconds ago gallant_khayyam
#发现mysql自动退出了
原因:
# Docker容器后台运行,就必须有一个前台进程.
# 容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
查看日志
docker logs -f -t 容器id
#日志可选项
-ft #显示日志内容
--tail number #要显示的日志条数
查看容器中进程信息
# docker top 容器id
[root@bogon /]# docker top b59373bf16d6
UID PID PPID C STIME TTY TIME CMD
root 13513 13490 90 01:21 ? 00:00:13 /bin/bash -c while true;do echo 1;done;
查看容器的元数据
# 命令
docker inspect 容器id
[root@bogon /]# docker inspect b59373bf16d6
[
{
"Id": "b59373bf16d6254b31568c0ad0b246fa43684b06654c8daf5f2eca9ae197e842",
"Created": "2023-05-05T17:21:01.73522448Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true;do echo 1;done;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 13513,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-05T17:21:02.091236698Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/b59373bf16d6254b31568c0ad0b246fa43684b06654c8daf5f2eca9ae197e842/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/b59373bf16d6254b31568c0ad0b246fa43684b06654c8daf5f2eca9ae197e842/hostname",
"HostsPath": "/var/lib/docker/containers/b59373bf16d6254b31568c0ad0b246fa43684b06654c8daf5f2eca9ae197e842/hosts",
"LogPath": "/var/lib/docker/containers/b59373bf16d6254b31568c0ad0b246fa43684b06654c8daf5f2eca9ae197e842/b59373bf16d6254b31568c0ad0b246fa43684b06654c8daf5f2eca9ae197e842-json.log",
"Name": "/sweet_pasteur",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
37,
224
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/e9920098f0591a1f8015be0f706cb8f0789395489f2621781b29e5e442432fd2-init/diff:/var/lib/docker/overlay2/e4bc1a532431d72cdc1f231dc82d355b1407f21bb80a3f7fda4ae7bb861c4bfe/diff",
"MergedDir": "/var/lib/docker/overlay2/e9920098f0591a1f8015be0f706cb8f0789395489f2621781b29e5e442432fd2/merged",
"UpperDir": "/var/lib/docker/overlay2/e9920098f0591a1f8015be0f706cb8f0789395489f2621781b29e5e442432fd2/diff",
"WorkDir": "/var/lib/docker/overlay2/e9920098f0591a1f8015be0f706cb8f0789395489f2621781b29e5e442432fd2/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "b59373bf16d6",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash",
"-c",
"while true;do echo 1;done;"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "6f7a3f6007973f373ab7f710c3efaab57bdf2970446e2b3ee0877dceba6a356f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/6f7a3f600797",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "1ec6e76682dea2b5828edd921e9cf3d2c42b006502fe9725372180a202f9927a",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "b4929b16794eba58ee59a361b7d5584cb41ef4031dfe52ac53b8c9c408fc7395",
"EndpointID": "1ec6e76682dea2b5828edd921e9cf3d2c42b006502fe9725372180a202f9927a",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
进入正在运行的容器
方式一:docker exec -it 容器id #开启一个新的终端,可以操作(常用)
方式二:docker attach 容器id #打开正在执行的终端,不会启动新的进程。
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 主机路径
Docker镜像加载原理
本节内容参考(更详细内容在链接中):https://blog.youkuaiyun.com/weixin_45880055/article/details/118057568
Union文件系统是一种分层、轻量级的、高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
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,/etc 等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos 等等。
容器数据卷
容器数据卷就是将容器的数据持久化和同步到主机上,并且可以使容器间共享数据。
方式一:创建容器时指定路径挂载卷
方式一:创建容器时指定路径挂载卷
docker run -itd -p 主机端口:容器端口 -v 主机路径:容器路径 镜像名
测试:
容器内:webapps没有内容,将webapps.dist中的内容复制到webapps中
主机上:/home/tomcat中一开始没有内容,容器中将webapps.dist中的内容复制到webapps中后,/home/tomcat中与容器中内容一致
在主机上的挂载目录下修改,容器中也修改,这是一个双向的过程。
匿名和具名挂载
#指定路径挂载
docker run -itd -p 主机端口:容器端口 -v 主机路径:容器路径 镜像名
#匿名挂载(-v 容器路径)
docker run -itd -P -v /etc/nginx nginx
#具名挂载(-v 卷名:容器路径)
docker run -itd -P -v nginx-data:/etc/nginx nginx
#查看所有volume(卷)的情况:发现匿名挂载(卷名随机生成),具名挂载(卷名为定义的名称)
docker volume ls
#展示的值
DRIVER VOLUME NAME
local nginx-data
local 9f38292179faa178afcce54d80be99d4ddd68c91d2a68870bcece72d2b7ed061
#查看卷的具体信息
docker volume inspect 卷名
所有容器在没有指定路径情况下,挂载卷都在/var/lib/docker/volumes/xxx/_data下
扩展:
#-v 容器内路径:ro rw改变读写权限
ro readonly 只读
rw readwrite 可读可写
docker run -itd -P -v nginx-data:/etc/nginx:ro nginx
docker run -itd -P -v nginx-data:/etc/nginx:rw nginx
#ro 只要看到ro说明这个路径只能有主机路径来操作,容器内部是无法操作的。
容器间数据同步
# --volumes-from 以启用的容器id/容器name
docker run -itd -P -v /etc/nginx --name nginx01 nginx
docker run -itd -P --name nginx02 --volumes-from nginx01 nginx
数据同步是双向拷贝的过程,不会因为其中一个容器被删除,其他容器无法访问的情况发生
DockerFile
DockerFile介绍
dockerfile是用来构建Docker镜像的脚步文件!
构建步骤:
1、编写一个dockerfile文件
2、docker build 文件名 (构建成一个镜像)
3、docker run 运行构建的镜像
4、docker push 发布镜像
基础知识:
1、每个关键字(指令)必须是大写的
2、执行从上到下顺序执行
3、#表示注释
4、每个指令都会创建提交一个新的镜像层
DockerFile指令
指令 | 格式 | 用途 | 示例 |
---|---|---|---|
FROM | FROM image:tag | 设置要制作的镜像基于哪个镜像 | FROM centos:7 |
MAINTAINER | MAINTAINER name | 镜像作者的信息,比如名字或邮箱地址,会被LABEL maintainer='" 取代 | MAINTAINER zhangsan |
LABEL | LABEL key=value key=value … | 给镜像添加信息。使用docker inspect可查看镜像的相关信息 | LABEL multi.label1=“value1” \ multi.label2=“value2” |
RUN | RUN shell 或者 RUN[“可执行命令”,“参数1”,“参数2”] | 容器构建时需要运行的命令 | RUN yum install -y vim 或者 RUN[“yum”,“install”,“vim”] |
EXPOSE | EXPOSE port | 声明容器对外暴露的服务端口 | EXPOSE 80 443 |
WORKDIR | WORKDIR 路径 | 容器创建后,终端默认登录进来的工作目录 | WORKDIR /home/admin |
USER | USER 用户 | 指定该镜像以什么用户去执行 默认为root | USER admin |
ENV | ENV key value | 设置环境变量,环境变量可被后面的指令使用,并在容器运行时保持。 | ENV JAVA_HOME /usr/local/java/openJDK11 |
VOLUME | VOLUME [“mountpoint”…] | 配置容器数据卷挂载 | VOLUME [“/logs”,“/uploadPath”] |
ADD | ADD[“源文件”, … ”目标目录”] | 将宿主机目录下的文件拷贝进镜像并且会自动处理URL和解压tar包 ,等于copy+解压 | ADD spring-boot-demo.jar demo.jar |
COPY | COPY ["源文件”, … ”目标目录”] | 将源文件从宿主机拷贝到容器内 | COPY target/demo.jar demo.jar |
CMD | CMD [“executable”, “param1”, “param2”] | 在执行docker run时候执行,可以有多个cmd指令但是只有最后一个生效, docker run的参数会覆盖 cmd的参数,一般可变参数用cmd支持两种格式shell: yum isntall -y vim 或 exec: [“可执行文件”,“参数”] | CMD /bin/bash; CMD echo “success” |
ENTRIPOINT | ENTRYPOINT [“executable”, “param1”, “param2”] | 也是用来指定容器启动时要执行的命令,类似cmd 但是不会被 run 后的参数命令覆盖,固定参数一般用ENTRY_POINT, 当CMD和ENTRYPOINT联用时,cmd多用于给ENTRYPOINT传参 | ENTRYPOINT [“sh”,“-c”,“java -jar -Xms256M -Xmx512M /app.jar”] |
官网centos的dockerfile文件
从docker hub中下载的镜像大多数都是基于scratch的。
创建一个自己的centos
#1、编写dockerfile文件(建议不要用最新的centos做基础镜像,因为已停止维护,可能yum无法下载安装)
[root@bogon dockerfile]# vim dockerfile-centos
[root@bogon dockerfile]# cat dockerfile-centos
FROM centos:7
MAINTAINER qzh<3032332486@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install ncurses
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
#2、通过这个文件构建自己的centos镜像
# docker build -f dockerfile文件路径 -t 镜像名:tag .
docker build -f dockerfile-centos -t mycentos:1.0 .
=> => writing image sha256:749b7b6b836ff60c4c343d882029f7d07cb7a7ce509dde2dba584b8b31b409fe 0.0s
=> => naming to docker.io/library/mycentos:1.0
#3、运行创建的镜像
较原版的centos,添加vim、clear、net-tools工具,工作目录由根目录变为/usr/local
通过docker history 查看构建过程
mycentos:
mysql:
Docker网络
参考网址:Docker网络详解–高过蓝天的云
查看当前Docker所有的网络模式
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8b3badb4d475 bridge bridge local
a4e32c4a1c37 host host local
b903c662434b none null local
自定义网络
#docker启动,默认使用的是bridge模式
docker run -d -P -name tomcat1 tomcat
docker run -d -P --net bridge --name tomcat1 tomcat
#自定义网络
[root@bogon ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
dd8c5ce2205429a17621640d18213d87d89ea6c2354c2419ff748944614f89b5
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8b3badb4d475 bridge bridge local
a4e32c4a1c37 host host local
dd8c5ce22054 mynet bridge local
b903c662434b none null local
[root@bogon ~]# docker run -d -P --name tomcat-net1 --net mynet tomcat
5f472d9aefe5a568ba743370839e1b2b37b97c3ab3cdcdc4b2ca885a1c9bcf8d
[root@bogon ~]# docker run -d -P --name tomcat-net2 --net mynet tomcat
d3f30dcb1ba0ed5092c8908eb3d331af688fdf4146e9d1011ad31e4e407f589e
[root@bogon ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "dd8c5ce2205429a17621640d18213d87d89ea6c2354c2419ff748944614f89b5",
"Created": "2023-05-10T10:44:56.28767015+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"5f472d9aefe5a568ba743370839e1b2b37b97c3ab3cdcdc4b2ca885a1c9bcf8d": {
"Name": "tomcat-net1",
"EndpointID": "d0a7e0fd45b0d6c28a9e918441b6a0b713fa29d03c2dd456e4df8310fbba0cd4",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"d3f30dcb1ba0ed5092c8908eb3d331af688fdf4146e9d1011ad31e4e407f589e": {
"Name": "tomcat-net2",
"EndpointID": "48302493f62813f408d62748c2827d456cb064e2566e180012672e1d1aae1c42",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
自定义的网络可以通过IP或容器名ping通。
自定义网络的好处:不同集群使用不同的网络,保证集群是安全和健康的。
网络连通
网段不同的两个容器想要连通,需要把其中一个容器加入到另一个容器的网段中,使用docker network connect命令。
docker network connect mynet tomcat01
#连通后,tomcat01放到了mynet网络下,一个容器两个IP。