docker 日常总结-实用宝典

问题

1. IPv4 forwarding disabled

docker WARNING: IPv4 forwarding is disabled. 解决方法

在宿主机上面执行:

#添加内容到/usr/lib/sysctl.d/00-system.conf
echo net.ipv4.ip_forward=1 >> /usr/lib/sysctl.d/00-system.conf
#重启network和docker服务
systemctl restart network && systemctl restart docker

2. Docker daemon socket权限不足

问题引出的原因

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/load?quiet=0: dial unix /var/run/docker.sock: connect: permission denied

原因

出现上面问题是因为:
Manage Docker as a non-root user
即:管理Docker的不是root用户

原文表述:
The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can only access it using sudo. The docker daemon always runs as the root user.
If you don’t want to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.
即:docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。

解决方案

  • 方案一:
    使用sudo获取管理员权限,运行docker命令
  • 方案二:
    添加docker group组,将用户添加进去
    ​$ sudo group add docker [sudo] password for ekmp: 的密码: sudo: group: command not found $ sudo groupadd docker #添加docker用户组 groupadd: group 'docker' already exists $ sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中 Adding user ekmp to group docker $ newgrp docker #更新用户组 $ docker ps #测试当前用户是否可以正常使用docker命令 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ​

3. docker启动容器后就闪退

docker运行容器后,会启动不了,闪退Exited (0)

docker ps -a | grep cuda
31980f1f5ec7 python3.6 "/bin/bash" 55 seconds ago Exited (0) 54 seconds ago cudapy
882c44a87408 python3.6:latest "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago magical_knuth

原因

Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出
2、容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出
3、这个是 docker 的机制问题

解决方案

#在运行容器指令,同时加一个tail指令,这样docker容器后台发现前台进程运行,就不会退出,一直运行了。示例指令如下:
#docker run -d --name mysql_s02 ... /bin/bash -c "tail -f /dev/null"
#运行后,再看#docker ps ,正常运行了。(注: 此方案暂不可行,表面上是正常了,但连接访问mysql仍不能,说明没有正常启动)

#查看docker容器日志,查看取得相应的错误信息
docker logs --since 30m 容器id

#脚本中最后一个进程一定要用前台运行方式即在进程最后不加&(&表示后台运行),否则容器会退出。
#可在脚本后加 /bin/bash ,如果还不行,就换为 tail -f /dev/null (实时查看/dev/null)


方案1:
网上有很多介绍,就是起一个死循环进程,让他不停的循环下去,前台永远有进程执行,那么容器就不会退出了,以centos为例
shell>docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
缺点: 命令太冗长了,还占用一个终端

方案2:
shell>docker run -dit centos /bin/bash
添加-it 参数交互运行
添加-d 参数后台运行
这样就能启动一个一直停留在后台运行的Centos了。

shell

command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]

k8s中yaml配置文件

#方式一:k8s中yaml配置文件
spec:
containers:
- name: container-5lx1h9
image: meadml/cuda10.0-cudnn7-devel-ubuntu16.04-python3.6
command:
- /bin/sh
- '-c'
- while true;do echo hello;sleep 1;done
ports:
- name: tcp-22
containerPort: 22
protocol: TCP

#方式二:k8s中yaml配置文件KubeSphere
启动命令-运行中这样写:参数内容不用填写
/bin/sh,-c,while true;do echo hello;sleep 1;done

Docker 基础

➜  ~ docker --help
#用法
Usage: docker [OPTIONS] COMMAND
#自动运行中的容器
A self-sufficient runtime for containers
#选项
Options:
--config string Location of client config files (default "/Users/honglei/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
-D, --debug Enable debug mode #启用调试模式
-H, --host list Daemon socket(s) to connect to #连接的主机列表守护进程socket
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")#设置日志级别
--tls Use TLS; implied by --tlsverify #使用TLS
--tlscacert string Trust certs signed only by this CA (default "/Users/honglei/.docker/ca.pem")#信任证书
--tlscert string Path to TLS certificate file (default "/Users/honglei/.docker/cert.pem")#TLS证书文件路径
--tlskey string Path to TLS key file (default "/Users/honglei/.docker/key.pem")#TLS密钥文件路径
--tlsverify Use TLS and verify the remote#使用TLS并且远程验证
-v, --version Print version information and quit#打印版本信息并退出

Management Commands: #管理命令
builder Manage builds #管理构建
config Manage Docker configs #管理Docker配置信息
container Manage containers # 管理容器
context Manage contexts # 管理上下文
image Manage images #管理镜像
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
scan* Docker Scan (Docker Inc., v0.3.4)
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes

Commands: #命令
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

Run 'docker COMMAND --help' for more information on a command.

Docker 镜像管理

docker pull
docker tag
docker rmi
docker export
docker import

docker tag

#docker tag 用于给镜像打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag nginx:alpine nginx:shl
#版本打一个标签,如果想回滚版本,可使用指定标签的镜像来创建容器
docker run nginx:shl

docker save

docker save
#镜像导出
docker save -o cmpweb.tar cmpweb:v2
#把容器导出到镜像中。

docker load

#本地镜像导入
docker load -i cmpweb.tar

docker cp

docker cp
从主机复制到容器sudo docker cp host_path containerID:container_path
从容器复制到主机sudo docker cp containerID:container_path host_path
docker cp localtime d3c315c6197e:/etc/localtime
docker cp dist/ e04c2ff4a1da:/usr/share/nginx/html/
#copy文件夹中的所有文件到指定目录中
docker cp dist/. e04c2ff4a1da:/usr/share/nginx/html/

docker commit

docker commit命令-提交一个新的image
commit 主要用于通过差异性,创建一个新的image
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)

Commit an existing container 提交一个存在的容器
docker commit 464bd7d954ee 31.16.17.79/szy/tomcat7:latest

docker run

docker run --privileged=true -v /Users/ws/Downloads/ROOT:/ -p 8082:8082 hub.c.163.com/honglei666/ecdc-discovery:latest
# 以后台守护进程的方式启动
docker run -d tomcat:7
# 启动tomcat:7镜像
docker run -p 8080:8080 tomcat:7
#若端口被占用,可以指定容器和主机的映射端口
docker run -p 8081:8080 tomcat:8.5
# 停止一个容器
docker stop b840db1d182b
# 进入一个容器
docker attach d48b21a7e439
# 进入正在运行容器并以命令行交互
docker exec -it e9410ee182bd /bin/sh
# 以交互的方式运行
docker run -i -t -p 8081:8080 tomcat:7 /bin/bash
#--restart=always
docker run -p 8080:8080 tomcat:7 --restart=always

docker run —rm 临时运行Container

# --rm 只是临时运行,中要退出容器,就会自动删除Automatically remove the container when it exits
docker run --name nginx --rm nginx:alpine

数据卷的使用

-v p_path1物理机目录:c_path2容器目录:rw权限(默认是可读可写)

docker run -v p_path1:c_path2 -p 8082:8082 tomcat:latest
docker run -v c_path2 -p 8082:8082 tomcat:latest
#可以挂载多个数据卷
docker run -it --rm --name shl -v /xx -v /yy -v /xx centos:latest
#通过docker inspect ContainerID 可以查看Mounts的路径"Source": "/var/lib/docker/volumes...中查看
docker inspect 8b74caa7df04
#在这个mounts的路径的目录下,和容器内的目录是互通的。

docker exec

关于-i、-t参数

可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取。使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致整个容器退出。

关于-d参数

在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。 程序在后台运行。如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成 才返回。

docker run -t #给一个终端,但是不可以交互
docker run -i #可以交互
docker run -t -i #给一个可交互的终端
#使用该命令进入一个已经在运行的容器
docker exec -it 775c7c9ee1e1 /bin/bash
docker exec -it 775c7c9ee1e1 /bin/sh
docker exec -it 775c7c9ee1e1 bash

查看进不去的容器内容,

#命令举例
docker exec 9f1bc8ae846b ls /
docker exec 9f1bc8ae846b cat /etc/shells

查看这个容器运行的是什么程序 ​​docker history nginx:latest​​,容器会随着程序的结束而结束。如果容器中没有指定运行什么程序时,默认会运行镜像最上面一层CMD里所指定的。比如:

➜  ~ docker history mysql:8.0.17
IMAGE CREATED CREATED BY SIZE COMMENT
b8fd9553f1f0 15 months ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 15 months ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 15 months ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 15 months ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B

docker attach

Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。

但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。

例如 :docker attach containId

#attach Attach local standard input, output, and error streams to a running container
# 进入一个容器
docker attach d48b21a7e439

docker logs

docker logs 容器名 查看日志

#查看容器日志
docker logs 3638337dbf41
#实时查看容器日志 -f
docker logs -f 3638337dbf41

docker ps

查看正在运行的容器

#查看正在运行|活跃的容器
docker ps
#查看所有容器(包含活跃和非活跃的)
docker ps -a

docker rm

删除镜像,直接删除ID或者name,如果正在运行的,需要加-f

docker rm 3f -f

docker rmi 删除所有镜像

#杀死所有running状态的容器
docker kill $(docker ps -q)
#删除所有已经停止的容器
docker rm $(docker ps -a -q)
#删除所有\'untagged/dangling\' ()状态的镜像
docker rmi $(docker images -q -f dangling=true)
#删除所有镜像:
docker rmi $(docker images -q)
#可能有删不干净的,加上 -f
docker rmi $(docker images -q) -f

docker inspect

#使用docker inspect来查看该容器的详细信息。
docker inspect 51b07350d245
#如果要显示该容器第一个进行的PID可以使用如下方式
docker inspect -f {{.State.Pid}} 7790ee12737c

docker stats 监控容器资源消耗

docker stats监控容器资源消耗

在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的。幸运的是 docker 自己就提供了这样的命令:docker stats。

默认输出

docker stats 命令用来显示容器使用的系统资源。不带任何选项执行 docker stats 命令:

默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c。下面是输出的主要内容:

[CONTAINER]:以短格式显示容器的 ID。

[CPU %]:CPU 的使用情况。

[MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。

[MEM %]:以百分比的形式显示内存使用情况。

[NET I/O]:网络 I/O 数据。

[BLOCK I/O]:磁盘 I/O 数据。

[PIDS]:PID 号。

只返回当前的状态

如果不想持续的监控容器使用资源的情况,可以通过 --no-stream 选项只输出当前的状态:

docker stats --no-stream

如果我们只想查看个别容器的资源使用情况,可以为 docker stats 命令显式的指定目标容器的名称或者是 ID

docker stats --no-stream registry 1493
#或者,使用容器的名称替代默认输出中的容器 ID
docker stats $(docker ps --format={{.Names}})
# --format 选项自定义输出的内容和格式,只输出了 Name, CPUPerc 和 Memusage 三列
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
#下面是自定义的格式中可以使用的所有占位符:
.Container 根据用户指定的名称显示容器的名称或 ID。
.Name 容器名称。
.ID 容器 ID。
.CPUPerc CPU 使用率。
.MemUsage 内存使用量。
.NetIO 网络 I/O。
.BlockIO 磁盘 I/O。
.MemPerc 内存使用率。
.PIDs PID 号。
#除了以 table 格式输出结果,还可以通过 format 选项输出 json 格式的结果:
docker stats --no-stream --format \
"{\"container\":\"{{ .Container }}\",\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"cpu\":\"{{ .CPUPerc }}\"}"

Mac中docker文件存储位置

Mac中docker文件存储位置(Mac终端Screen命令使用指南)

docker容器内文件存储不同操作系统下不一样

Linux是在目录:/var/lib/docker

Mac是在目录/Users/honglei/Library/Containers/com.docker.docker/Data/vms/0/tty

Mac下启动docker本质是先启动了个虚拟机然后再启动里面的docker,配置可以在偏好里修改

screen操作

screen /Users/honglei/Library/Containers/com.docker.docker/Data/vms/0/tty 进入Mac下docker虚拟机

进入之后一片空白 然后按 enter!

当你的docker version是18.06.0-ce-mac70 (26399)采用上面的指令,如果不是这个version请使用

screen ~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

screen 是GUN组织开发的一块 连接本地或远程的命令行终端工具,可以在多个终端之间切换!

ctrl+a+k关闭一个 screen

如果只是暂时退出 ctrl+a+d,再次进入按 screen -dr 否则使用

screen /Users/honglei/Library/Containers/com.docker.docker/Data/vms/0/tty 进入是一篇乱码!

screen /Users/honglei/Library/Containers/com.docker.docker/Data/vms/0/tty
screen /Users/honglei/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

(1)创建会话
使用命令“screen -S RunWork”来创建一个screen会话,命令执行之后,就会得到一个新的shell窗口,为了便于标示可以用快捷键Ctrl-a A(就是按下Ctrl+a键,然后按下shift+a),这样窗口上光标会提示给窗口重命名。输入名称“RunWorkWindow”之后,回车就完成了对该窗口的重命名。这里的重命名是为了避免混淆同一会话中的不同窗口,可以用Ctrl-a w快捷键来查看当前的窗口名称
(2) 运行作业与会话detach以及会话恢复
Ctrl-a d :将当前会话detach,这样,即使网络断掉或者关掉ssh的客户端,作业仍然会在服务器上运行;
screen -ls :查看当前有哪些会话以及它们各自的状态;
screen -r SessionID :恢复一个已经detach的会话(SessionID就是screen -ls命令结果中的每个session前面的数字),会话被恢复之后,可以看到该会话在命令行的输入结果和输出信息。
(3) screen -x 窗口名 :更换窗口
退出screen的方法:Control + a 再 k

docker network list

docker network --help #显示所有相关命令提示

docker network command --help # 查看具体命令的详细参数和用法

#列出所有网络
docker network list
#查看网络详情
docker network inspect 3d0d51414e41
#创建bridge网络
docker network create --driver bridge my-network
#启动两个container,同时加入my-network:
docker run -dit --name alpine1 --network my-network alpine
docker run -dit --name alpine2 --network my-network alpine

–link

#link的精简事例
#启动一个mysql容器,设置下用户名和密码
docker run -dit --restart=always --name=db -v /db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=redhat -e MYSQL_DATABASE=shl mysql:latest
#创建一个wordpress并且由于使用link连接db容器(默认会根据db容器设置的变量来设置自己,所以会自动连接到shl数据库上)
docker run -dit --restart=always --name=web -v /web:/var/www/html -p 80:80 --link db:mysql wordpress
#--link db:mysql 冒号后面是别名

通过容器间的选项–link指定容器名称进行不同容器间的通信(–link container_name或者将container_name取一个别名)

–link=test1 意思就是我在test2 这个容器link了test1,这样在test2 容器中去 ping test1的时候, 就不需要还输入 ip。 直接通过test1 这个名字就可以了。

docker run -d --name=test2 --link=test1 centos:latest
#通过名字访问,在test2上链接test1上的数据库,即test1:3306就连接上了。不关心test1的ip是多少。

替代–link来达到容器间的通信:docker network

创建一个网络名为my_net且driver为bridge的网络:(默认创建的就是bridge)

docker network create my_net

利用–network启动容器提供服务:

#通过network的driver bridge实现了容器间的访问
#两个容器在同一个网络my_net内,而nginx里面ping的mysql是容器名(这里管理的是容器级别)
#通过选项--network-alias将取名的my_net起了一个别名
docker run -d --name=mysql --network my_net --network-alias mysql mysql:latest
docker run -d --name=nginx --network my_net --network-alias nginx -p 80:80 nginx:latest

完整事例:

#启动mysql01的容器,然后再启动nginx02容器。mysql01容器和nginx02容器连接起来,然后在nginx02中通过mysql01访问mysql01。
docker run --name mysql01 mysql:latest
docker run --name nginx02 --link mysql01:mysql nginx:latest
#两个服务定义在同一个组合文件里,效果和docker run命令完全一样
version: '2'
services:
nginx02:
image: nginx:latest
depends_on:
- mysql01
links:
- mysql01
mysql01:
image: mysql:latest
#我就碰到这么一个情况:有好几个组合文件,每个域用一个文件,每个文件都定义了一些紧密相关的服务,比如博客、后台服务和数据库。然后我还有一个前端的网站服务#器,这样就可以通过英特网来访问我的网站,并把收到的请求代理到组合文件中定义的各种服务里去处理。
#Docker平台的组合功能提供了一个叫“外部链接”(“external_links”)的设置选项,能用来接连那些在不同组合文件中定义的容器
version: '2'
services:
test2:
image: something
external_links:
- domainA_test1_1
#这里,“test1”服务在组合“domainA”中定义。只要这个服务是第一个运行且是当前唯一一个运行的服务,Docker的组合功能会自动在容器名字后面加上“_1”。
#然而,从这里开始就有点复杂了。原因就是Docker在默认状态下会为每个docker组合建立一个独立的网络。同一个组合中定义的容器都连接到同一个网络,网络之间不能#相互访问,所以一定要想点办法。
#方法1:让需要连接的容器也加入外部网络
#这种方法要求在定义连接的组合文件里加两个部分:在test2服务定义里加入外部网络“domainA_default”,使这个容器成为该网络的一部分;在组合文件本身的网络定#义中再加入“domainA_default”网络,并定义为外部。
version: '2'
services:
test2:
image: something
external_links:
- domainA_test1_1
networks:
- default
- domainA_default
networks:
domainA_default
external: true
#可以看到,“domainA_default”是docker自动为组合“domainA”创建的外部网络,我用了两个额外的部分把test2服务连接到这个默认网络上去。
#在test2里,可以用默认的DNS名“domainA_test1_1”来访问test1容器。
#我们可以用这个命令查看所有的docker网络:
docker network ls
#方法2:为所有要互联的容器设定桥接连网模式(bridge networking mode)
#第一个方法能让私有网络互联。但如果需要从已互联的容器内部向外部发起网络连接,就可能会遇到问题。
#因此,还有另一种方法,就是为所有想要互联的容器开启桥接连网模式:
version: '2'
services:
test2:
image: something
network_mode: bridge
external_links:
- domainA_test1_1
version: '2'
services:
test1:
image: something
network_mode: bridge
#哪种方法好取决于具体情况。个人来说我比较喜欢第一种方法,因为它用的是私有网络,而不会把容器桥接到主机的网络上去。

external_links

内容,见上方。

限制容器资源

memload一个对CPU做测试的工具。bigmem一个对内存做测试的工作。

#消耗1024M
memload 1024
#通过上面的docker stats监控容器资源消耗-见上方。

#对容器CPU做限制,让其运行在1号CPU上,对内存做限制
docker run -it --rm --name shl -m 200M --cpuset-cpus=1 centos:latest
#然后进入容器,进行核对
#进入容器
docker attach shl
#运行命令,将dev下面的zero 重定向到null中,其中zero是取之不尽,null是永远塞不满,所以这是个死循环永远执行下去。
cat /dev/zero > /dev/null &
#使用ps命令检测,分别运行在哪颗CPU上呢?
ps mo pid,comm,psr 'pgrep cat'
#或者使用 pid查询
ps mo pid,comm,psr 778
ps mo pid,comm,psr $(pgrep httpd)

常见docker清理方法

docker system df 类似于Linux上的df命令,用于查看Docker的磁盘使用情况

docker system prune 可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。

docker system prune -a 清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚.。我没用过,因为会清理 没有开启的 Docker

容器的编排工具

compose swarm mesos openshift kubernetes [自动化管理部署容器的一些工具]

x509|daemon.json

linxu

# 编辑 daemon.json|/etc/docker/daemon.json|C:\ProgramData\docker\config\daemon.json
"insecure-registries": [
"0.0.0.0/0",
"reg.ecdata.dev:5000"
]

mac

"insecure-registries": [
"0.0.0.0/0",
"reg.ecdata.dev:5000"
]