Docker学习笔记

狂神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指令

指令格式用途示例
FROMFROM image:tag设置要制作的镜像基于哪个镜像FROM centos:7
MAINTAINERMAINTAINER name镜像作者的信息,比如名字或邮箱地址,会被LABEL maintainer='" 取代MAINTAINER zhangsan
LABELLABEL key=value key=value …给镜像添加信息。使用docker inspect可查看镜像的相关信息LABEL multi.label1=“value1” \ multi.label2=“value2”
RUNRUN shell 或者 RUN[“可执行命令”,“参数1”,“参数2”]容器构建时需要运行的命令RUN yum install -y vim 或者 RUN[“yum”,“install”,“vim”]
EXPOSEEXPOSE port声明容器对外暴露的服务端口EXPOSE 80 443
WORKDIRWORKDIR 路径容器创建后,终端默认登录进来的工作目录WORKDIR /home/admin
USERUSER 用户指定该镜像以什么用户去执行 默认为rootUSER admin
ENVENV key value设置环境变量,环境变量可被后面的指令使用,并在容器运行时保持。ENV JAVA_HOME /usr/local/java/openJDK11
VOLUMEVOLUME [“mountpoint”…]配置容器数据卷挂载VOLUME [“/logs”,“/uploadPath”]
ADDADD[“源文件”, … ”目标目录”]将宿主机目录下的文件拷贝进镜像并且会自动处理URL和解压tar包 ,等于copy+解压ADD spring-boot-demo.jar demo.jar
COPYCOPY ["源文件”, … ”目标目录”]将源文件从宿主机拷贝到容器内COPY target/demo.jar demo.jar
CMDCMD [“executable”, “param1”, “param2”]在执行docker run时候执行,可以有多个cmd指令但是只有最后一个生效, docker run的参数会覆盖 cmd的参数,一般可变参数用cmd支持两种格式shell: yum isntall -y vim 或 exec: [“可执行文件”,“参数”]CMD /bin/bash; CMD echo “success”
ENTRIPOINTENTRYPOINT [“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。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值