Ответ Раду хороший, но в зависимости от используемого варианта вы можете использовать pushd и popd, что позволяет сохранять и восстанавливать каталоги. Что-то вроде: alias startTomcat="pushd ~/apache-tomcat-7.0.34/bin; ./startup.sh; popd"
16.04 представляет новые проблемы. Я сделал все шаги, как показано на «Running Docker» за брандмауэром ufw, но я не мог получить докер и UFW для работы с 16.04. Другими словами, независимо от того, что я сделал, все порты докеров стали глобально доступными в Интернете. Пока я не нашел это: Как установить Docker 1.12+, чтобы НЕ мешать IPTABLES / FirewallD
Мне пришлось создать файл /etc/docker/daemon.json и поместить следующее в:
{
"iptables": false
}
Затем я выпустил sudo service docker stop, затем sudo service docker start FINALLY docker просто выполняет соответствующие правила в UFW.
Дополнительные данные: Запуск Docker за брандмауэром ufw
Если вы используете систему initd systemd (Ubuntu 15.10 и новее), отредактируйте /etc/docker/daemon.json (возможно, потребуется создать ее, если она не существует), убедитесь, что она имеет iptables: [!d0 ]
{ "iptables" : false }
EDIT: это может привести к потере соединения с Интернетом изнутри контейнеров
Если у вас включен UFW, убедитесь, что вы можете получить доступ к Интернету из внутри контейнеров. если нет - вы должны определить DEFAULT_FORWARD_POLICY как ACCEPT на /etc/default/ufw и применить трюк, описанный здесь: https://stackoverflow.com/a/17498195/507564
Использование /etc/docker/daemon.json с контентом
{
"iptables": false
}
может звучать как решение, но оно работает только до следующей перезагрузки. После этого вы можете заметить, что ни один из ваших контейнеров не имеет доступа к Интернету, поэтому вы не можете, например, пинговать любой сайт. Это может быть нежелательное поведение.
То же самое относится к привязке контейнера к определенному IP. Возможно, вы не захотите этого делать. , но он работает только до следующей перезагрузки и того, как вы создаете этот контейнер, поэтому есть решение:
После создания файла /etc/docker/daemon.json вызовите:
sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload
, поэтому вы устанавливаете политику приоритета по умолчанию в UFW для принятия и используете:
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
Если вы собираетесь использовать компоновку docker, тогда приведенная выше команда IP должна быть заменена на IP-адрес создания сетевой докеры создает при запуске с помощью docker-compose up.
Я описал проблему и решение более подробно в этой статье
Надеюсь, что это поможет!
Быстрое обходное решение при запуске Docker и выполнении сопоставления портов. Вы всегда можете сделать
docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...
, чтобы предотвратить доступ к докере извне.
Используйте --network = host при запуске контейнера, поэтому докер будет отображать порт в изолированную сеть только для хоста вместо сети моста по умолчанию. Я не вижу законных способов блокировки мостовой сети. В качестве альтернативы вы можете использовать собственную пользовательскую сеть с изоляцией.
sudo apt-get update
sudo apt-get install ufw
sudo ufw allow 22
Добавьте свои правила ufw и включите ufw sudo ufw, чтобы ваше изображение Docker нужно было начать с --cap-add = NET_ADMIN Чтобы включить опцию «NET_ADMIN» Docker:
Контейнер 1.Stop:
докер останавливает ваш контейнер; 2. Идентификатор контейнера:
докер проверяет ваш контейнер; 3.Modify hostconfig.json (default docker path: / var / lib / docker, вы можете изменить свои)
vim /var/lib/docker/containers/containerid/hostconfig.json
4.Поиск «CapAdd» и изменить значение null на [«NET_ADMIN»];
...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Restart docker в хост-машине;
перезагрузка службы докеров; 6. Запустите свойконтинер,
докер запустит ваш контейнер,