一、概述
1.1. 学习路径
- Docker概述
- Docker安装
- Docker命令
- 镜像命令
- 容器命令
- 操作命令
- ...
- Docker镜像
- 容器数据卷
- DockerFile
- Docker网络原理
- IDEA整合Docker
- Docker Compose
- Docker Swarm
- CI\CD Jenkins
1.2. Docker核心
Docker的核心思想:打包装箱,每个箱子都是互相隔离的。
Docker容器技术:是一种虚拟化技术。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
沙箱:Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket来连接。
Docker的服务端接受到Docker客户端的指令,就会执行这个命令。
Docker比VM快的原因:
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,VM需要的是Guest OS。
使用Docker的流程:
java——jar(环境)——打包项目带上环境(镜像)——(Docker仓库:商店)——下载发布的镜像——直接运行。
Docker相关网站:
Docker官网:https://www.docker.com/
官方文档:https://docs.docker.com/
Docker仓库:https://hub.docker.com/
Docker相关名词解释:
Docker镜像:好比是一个模板,可以通过这个模板来创建容器服务。
Docker容器:Docker利用容器技术,能够运行一个或者一组应用,容器通过镜像来创建。
Docker仓库:存放镜像的地方。仓库分为共有仓库和私有仓库。
二、Docker安装
安装在了阿里云服务器上,所以服务器的相关资源要准备好。
官方安装说明文档:https://docs.docker.com/engine/install/centos/
要安装Docker需要CentOS 7:
To install Docker Engine, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.
查看系统内核:
[root@izbp1h1sg6pkdch578k3w2z ~]# uname -r
3.10.0-514.26.2.el7.x86_64
系统版本:
[root@izbp1h1sg6pkdch578k3w2z ~]# uname -r
3.10.0-514.26.2.el7.x86_64
[root@izbp1h1sg6pkdch578k3w2z ~]# 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"
在安装新版本前,要卸载老的版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
执行结果:
[root@izbp1h1sg6pkdch578k3w2z ~]# sudo yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
Loaded plugins: fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
No Match for argument: docker
No Match for argument: docker-client
No Match for argument: docker-client-latest
No Match for argument: docker-common
No Match for argument: docker-latest
No Match for argument: docker-latest-logrotate
No Match for argument: docker-logrotate
No Match for argument: docker-engine
No Packages marked for removal
安装需要的包:
sudo yum install -y yum-utils
设置镜像的仓库:
# 这个地址是官方文档给的,默认的镜像是国外的,会非常慢
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软件包索引:
yum makecache fast
安装Docker引擎:
sudo yum install docker-ce docker-ce-cli containerd.io
这里docker-ce是社区版的,docker-ee是企业版的。
启动Docker:
systemctl start docker
判断Docker是否成功安装:
docker version
运行hello-world:
docker run hello-world
说明:
[root@izbp1h1sg6pkdch578k3w2z ~]# docker run hello-world
# 本地没有找到hello-world镜像
Unable to find image 'hello-world:latest' locally
# 远程拉取镜像(pull),拉去官方library下的hello-world
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
# 签名信息,代表拉取OK
Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest
# 弹出这句话说明安装成功
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
查看下载的hello-world镜像:
docker images
卸载Docker:
# 卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
# 删除目录
sudo rm -rf /var/lib/docker
Docker的默认工作路径:/var/lib/docker
阿里云镜像加速:
登录阿里云服务器
-
打开容器镜像服务
-
-
打开镜像加速器
-
-
配置
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://muvits2o.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
三、Docker的常用命令
官方命令文档:https://docs.docker.com/reference/
3.1 帮助命令
# 显示Docker的版本信息
docker version
# 显示Docker的系统信息,包括镜像和容器的数量
docker info
# 帮助命令
docker 命令 --help
3.2. 镜像命令
docker images
- 查看所有本地主机上的镜像
# 查看所有本地主机上的镜像
docker images
[root@izbp1h1sg6pkdch578k3w2z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
--all , -a # 列出所有的镜像
--digests Show digests
--filter , -f Filter output based on conditions provided
--format Pretty-print images using a Go template
--no-trunc Don’t truncate output
--quiet , -q # 只显示镜像的ID
docker search
- 搜索镜像
这里搜索的mysql和在docker hub网页上搜索mysql的结果差不多:
可选项:
docker search -- help
[root@izbp1h1sg6pkdch578k3w2z ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-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
docker pull
- 下载镜像
[root@izbp1h1sg6pkdch578k3w2z ~]# docker pull mysql
Using default tag: latest # tag如果为空,默认下载的是最新版本的
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete # 分层下载,docker image的核心:联合文件系统
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
也就是说,以下两个命令是等价的:
docker pull mysql
docker pull docker.io/library/mysql:latest
指定版本下载:
[root@izbp1h1sg6pkdch578k3w2z ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bb79b6b2107f: Already exists # 已经下载过的就不重复下载了
49e22f6fb9f7: Already exists
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists
f15d42f48bd9: Pull complete
098ceecc0c8d: Pull complete
b6fead9737bc: Pull complete
351d223d3d76: Pull complete
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
查看下载的镜像:
docker rmi
- 删除镜像
删除可以指定镜像名称、镜像ID删除:
# 删除指定镜像
docker rmi -f 要删除的镜像ID
# 删除多个镜像
docker rmi -f 要删除的镜像ID1 要删除的镜像ID2 要删除的镜像ID3
# 删除全部镜像
docker rmi -f $(docker images -aq)
删除指定镜像:
再查看镜像,5.7版本的就被删掉了:
删除所有镜像:
再查看镜像:
3.3. 容器命令
- 有了镜像才可以创建容器,所以下载一个CentOS镜像来测试学习:
docker pull centos
[root@izbp1h1sg6pkdch578k3w2z ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@izbp1h1sg6pkdch578k3w2z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 2 months ago 215MB
docker run
- 启动并运行容器
[root@izbp1h1sg6pkdch578k3w2z ~]# docker run -it centos /bin/bash
# -it:进入容器,交互运行
# 敲完命令后root旁边的名称变了
[root@313f004887e2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# ls用来查看容器内的CentOS,这是一个基础版本,很多命令都是不完善的
# 后台启动容器
docker run -d 镜像名
# 使用这个命令有一个问题,就是运行完这个命令,再使用docker ps查看当前启动的容器,发现这个容器没有在启动。
# 这是因为docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
退出:
- 容器停止,从容器中退回到主机:
[root@313f004887e2 /]# exit
exit
[root@izbp1h1sg6pkdch578k3w2z ~]#
- 容器不停止,退出:
- Ctrl+P+Q
docker ps
- 查看正在运行的容器
# 查看正在运行的容器
[root@izbp1h1sg6pkdch578k3w2z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izbp1h1sg6pkdch578k3w2z ~]#
# 查看运行过的容器
[root@izbp1h1sg6pkdch578k3w2z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313f004887e2 centos "/bin/bash" 5 minutes ago Exited (0) 2 minutes ago lucid_euler
00a27b2c1031 bf756fb1ae65 "/hello" 5 hours ago Exited (0) 5 hours ago gracious_zhukovsky
[root@izbp1h1sg6pkdch578k3w2z ~]#
# 可选参数
docker ps # 当前正在运行的容器
docker ps -a # 列出当前正在运行的容器+历史运行过的容器
docker ps -n=? # 显示最近创建过的?个容器
docker ps -q # 只显示容器的编号
docker rm
- 删除容器
# 删除指定容器,不能删除正在运行的容器,如果要强制删除,使用rm -f
docker rm 容器ID
# 删除所有的容器
docker rm -f $(docker ps -aq)
# 使用管道删除所有的容器
docker ps -a|xargs docker rm
启动和停止容器:
# 启动容器
docker start 容器ID
# 重启容器
docker reatrt 容器ID
# 停止当前运行的容器
docker stop 容器ID
# 强制停止当前容器
docker kill 容器ID
3.4. 常见其他命令
查看日志:
docker logs -tf --tail 10 容器名
# 10是参数,显示最近10条日志,如果容器还在运行,那么会持续打印
查看容器中进程信息:
docker top 容器ID
[root@izbp1h1sg6pkdch578k3w2z ~]# docker top 9252b12a6602
UID PID PPID C STIME TTY TIME CMD
root 6411 6379 0 16:43 ? 00:00:00 /bin/bash
[root@izbp1h1sg6pkdch578k3w2z ~]#
查看镜像的元数据:
docker inspect 容器ID
[root@izbp1h1sg6pkdch578k3w2z ~]# docker inspect 9252b12a6602
[
{
"Id": "9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97",
"Created": "2020-11-02T08:43:43.721119773Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 6411,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-11-02T08:43:44.090485585Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/hostname",
"HostsPath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/hosts",
"LogPath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97-json.log",
"Name": "/strange_bose",
"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,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"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",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"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/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a-init/diff:/var/lib/docker/overlay2/6a46a96a239b06d0b6380fb7518c179f7bad2c2c65885eaa86dd7373d66b3e80/diff",
"MergedDir": "/var/lib/docker/overlay2/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a/merged",
"UpperDir": "/var/lib/docker/overlay2/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a/diff",
"WorkDir": "/var/lib/docker/overlay2/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "9252b12a6602",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"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": "6e5aaf69cc376ab504a4a467affff18a5b9a523749193f81fba57b54cf959c6e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/6e5aaf69cc37",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "1d425e094d0342b53c951454b74f4625bb5c215e71e4071d6bfe55cdf15f0d35",
"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": "31fb0281bc366eb473643efd1e191636af07f9244742e6942a7818c8b6761a50",
"EndpointID": "1d425e094d0342b53c951454b74f4625bb5c215e71e4071d6bfe55cdf15f0d35",
"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
}
}
}
}
]
[root@izbp1h1sg6pkdch578k3w2z ~]#
进入当前正在运行的容器:
# 容器通常都是使用后台方式运行的,需要进入容器修改一些配置
# 方式一
容器ID /bin/bash
[root@izbp1h1sg6pkdch578k3w2z ~]# docker exec -it 9252b12a6602 /bin/bash
[root@9252b12a6602 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@9252b12a6602 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:43 pts/0 00:00:00 /bin/bash
root 14 0 0 08:50 pts/1 00:00:00 /bin/bash
root 28 14 0 08:50 pts/1 00:00:00 ps -ef
# 方式二
docker attach 容器id
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的
从容器内拷贝文件到主机上:
docker cp 容器ID:容器内路径 目的主机路径
# 过程:进入docker容器内,在容器内新建一个文件,将这个文件拷贝到主机上
# 当前的拷贝是一个手动的过程,之后可以使用 -v 卷的技术,可以实现自动同步
3.5. 命令小结
练习1:部署Nginx
-
搜索Nginx
-
-
下载镜像
-
-
查看一下当前的镜像
-
-
启动
docker run -d --name nginx01 -p 3344:80 nginx # -d 代表后台运行 # --name 给容器命名 # -p 暴露端口 格式:【-p 宿主机端口:容器端口】
-
-
查看容器
-
-
本机自测
-
在防火墙都关闭的情况下,在公网可以用云服务器的ip:3344来访问Nginx。
练习2:装一个Tomcat
# 官方提供的命令
docker run -it --rm tomcat:9.0
# 带--rm命令选项,这种方法一般用作测试,等价于在容器退出后,执行docker rm -v,也就是退出后立即删除该容器使用
# 使用这个命令就不用先pull了
- 正常步骤下载tomcat
-
- 启动tomcat
-
- 使用公网访问的时候会有404问题,但是使用官方提供的命令,测试是没问题的,这个是因为阿里云镜像的原因,阿里云默认是最小的镜像,所有的不必要的都剔除了,所以在启动这个容器的时候,里面的linux命令是缺少的,webapps也是空目录,所以访问的时候就是404。
- 解决办法:可以把webaaps.dist目录下的文件拷贝到webapps下,或者把webapps.dist改名为webapps。
3.6. Docker可视化
portainer:
Docker的图形化界面管理工具,提供一个后台面板供操作。
-
下载启动
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
公网访问方式:云服务器的ip+端口
内网访问方式:curl localhost:端口
阿里云关闭防火墙
如果防火墙关闭,无法访问,配置一下开放端口:https://developer.aliyun.com/article/87135
-
公网访问
-
- 在这个界面输入密码,创建用户。
- 选择local的这个
-
- 可以看到docker的一些信息
-
-