我可以通过暴露的端口停止 docker 容器吗?
Can I stop a docker container by its exposed port?
我的计算机上有大约两到六个项目 docker,我有时会并行使用它们并且必须手动停止一些容器(mariadb,mongodb,php, nginx, apache) 每次我想使用另一个项目时手动。有没有办法通过它的端口停止这些容器,所以我可以简单地做 docker stop -p 3306
并将它添加到我的 Makefile stop
部分?如果不行,我该怎样去优化这个工作流程。
我正在使用 macOS 10.14.x 和 Docker 桌面 v18.09.2.
开发 mac
假设您可以 运行 bash
一种方法是编写一个小脚本:
#!/usr/bin/env bash
for id in $(docker ps -q)
do
if [[ $(docker port "${id}") == *""* ]]; then
echo "stopping container ${id}"
docker stop "${id}"
fi
done
docker ps -q
将列出 运行ning 容器的 ID。如果端口映射包含传入的参数,它会停止容器。
将脚本放在 PATH
中,您可以在任何地方执行它:
stopByPort.sh 3306
对于任何想在终端中使用它作为别名而不调用脚本或修改 PATH 的人来说,这里是我 .zprofile
中的 @b0gusb 脚本:
docker-stop() {
local port=${1:-none} # set a default otherwise it will stop all
for id in $(docker ps -q); do
if [[ $(docker port "${id}") == *"${port}"* ]]; then
echo "Stopping container ${id}"
docker stop "${id}"
fi
done
}
alias stop=docker-stop
更新:
我从上面制作了一个脚本,在我的 .zprofile
:
中像这样使用它
alias stop="bash ~/.zsh/docker-stop-by-port.sh"
docker-stop-by-port:
#!/usr/bin/env bash
port=
RED='3[0;91m'
GREEN='3[0;32m'
YELLOW='3[0;33m'
RESET='3[0m'
echo "" # empty first line
if [ -z $port ]; then
echo -e " ${YELLOW}Please specify a port to a running docker container!${RESET}"
exit 0
fi
port_is_number_regex='^[0-9]+$'
if ! [[ $port =~ $port_is_number_regex ]]; then
echo -e " ${RED}Port can only be of type number${RESET}" >&2
exit 1
fi
num_results=0
no_results=0
SECONDS=0
for id in $(docker ps -q); do
((num_results += 1))
if [[ $(docker port "${id}") == *"${port}"* ]]; then
echo -e " Stopping container ${GREEN}${id}${RESET}"
fin_id=$(docker stop "${id}")
if [ $fin_id == $id ]; then
echo -e " ${GREEN}Done${RESET} in ${SECONDS}s"
fi
else
((no_results += 1))
fi
done
if [ $num_results -eq $no_results ]; then
echo -e " No running container found with port ${YELLOW}${port}${RESET}"
fi
我的计算机上有大约两到六个项目 docker,我有时会并行使用它们并且必须手动停止一些容器(mariadb,mongodb,php, nginx, apache) 每次我想使用另一个项目时手动。有没有办法通过它的端口停止这些容器,所以我可以简单地做 docker stop -p 3306
并将它添加到我的 Makefile stop
部分?如果不行,我该怎样去优化这个工作流程。
我正在使用 macOS 10.14.x 和 Docker 桌面 v18.09.2.
开发 mac假设您可以 运行 bash
一种方法是编写一个小脚本:
#!/usr/bin/env bash
for id in $(docker ps -q)
do
if [[ $(docker port "${id}") == *""* ]]; then
echo "stopping container ${id}"
docker stop "${id}"
fi
done
docker ps -q
将列出 运行ning 容器的 ID。如果端口映射包含传入的参数,它会停止容器。
将脚本放在 PATH
中,您可以在任何地方执行它:
stopByPort.sh 3306
对于任何想在终端中使用它作为别名而不调用脚本或修改 PATH 的人来说,这里是我 .zprofile
中的 @b0gusb 脚本:
docker-stop() {
local port=${1:-none} # set a default otherwise it will stop all
for id in $(docker ps -q); do
if [[ $(docker port "${id}") == *"${port}"* ]]; then
echo "Stopping container ${id}"
docker stop "${id}"
fi
done
}
alias stop=docker-stop
更新:
我从上面制作了一个脚本,在我的 .zprofile
:
alias stop="bash ~/.zsh/docker-stop-by-port.sh"
docker-stop-by-port:
#!/usr/bin/env bash
port=
RED='3[0;91m'
GREEN='3[0;32m'
YELLOW='3[0;33m'
RESET='3[0m'
echo "" # empty first line
if [ -z $port ]; then
echo -e " ${YELLOW}Please specify a port to a running docker container!${RESET}"
exit 0
fi
port_is_number_regex='^[0-9]+$'
if ! [[ $port =~ $port_is_number_regex ]]; then
echo -e " ${RED}Port can only be of type number${RESET}" >&2
exit 1
fi
num_results=0
no_results=0
SECONDS=0
for id in $(docker ps -q); do
((num_results += 1))
if [[ $(docker port "${id}") == *"${port}"* ]]; then
echo -e " Stopping container ${GREEN}${id}${RESET}"
fin_id=$(docker stop "${id}")
if [ $fin_id == $id ]; then
echo -e " ${GREEN}Done${RESET} in ${SECONDS}s"
fi
else
((no_results += 1))
fi
done
if [ $num_results -eq $no_results ]; then
echo -e " No running container found with port ${YELLOW}${port}${RESET}"
fi