我可以通过裸露的端口停止Docker容器吗?

时间:2019-07-08 14:14:42

标签: docker workflow

我在计算机上有大约两个到六个带有docker的项目,我有时并行使用它们,并且每次我想使用另一个容器时,必须手动手动停止一些容器(mariadb,mongodb,php,nginx,apache)项目。有没有一种方法可以通过其端口停止这些容器,所以我可以简单地执行docker stop -p 3306并将其添加到我的Makefile stop部分中吗?如果没有,我应该采取什么方式来优化此工作流程。

我正在使用macOS 10.14.x和Docker桌面v18.09.2的Mac。

2 个答案:

答案 0 :(得分:1)

对于那些希望在终端中以别名方式使用它而不调用脚本或修改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-by-by-port

#!/usr/bin/env bash

port=$1

RED='\033[0;91m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RESET='\033[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

答案 1 :(得分:0)

假设您可以运行bash的一种方法是编写一个小的脚本:

#!/usr/bin/env bash

for id in $(docker ps -q)
do
    if [[ $(docker port "${id}") == *"${1}"* ]]; then
        echo "stopping container ${id}"
        docker stop "${id}"
    fi
done

docker ps -q将列出正在运行的容器的ID。如果端口映射包含传入的参数,则它将停止容器。 将脚本放在PATH中,您可以在任何地方执行该脚本:

stopByPort.sh 3306