Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
1) уточните как «можно автоматизировать через штатную систему инициализации дистрибутива»? Самому это интересно. Да и что за дистрибутивы? Специальные типа CoreOS?
As of Docker 1.2, restart policies are the built-in Docker mechanism for restarting containers when they exit. If set, restart policies will be used when the Docker daemon starts up, as typically happens after a system boot. Restart policies will ensure that linked containers are started in the correct order.
#!/bin/bash
CONTAINER_NAME=$name
ifconfig eth1 >/dev/null 2>&1
if [[ $$? -eq 0 ]]; then
PUBILC_IF=eth0
PRIVATE_IF=eth1
else
PUBILC_IF=eth0
PRIVATE_IF=eth0
fi
case "$announce_as" in
public) ANNOUNCE_IP="`ifconfig $$PUBILC_IF | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\\2/p'`"
;;
private) ANNOUNCE_IP="`ifconfig $$PRIVATE_IF | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\\2/p'`"
;;
*) ANNOUNCE_IP=""
;;
esac
docker inspect $$CONTAINER_NAME|grep State >/dev/null 2>&1
if [ $$? -eq 0 ]; then
docker rm $$CONTAINER_NAME || { echo "cannot remove container $$CONTAINER_NAME"; exit 1; }
fi
docker pull $image
exec docker run \
-i --rm \
--name $$CONTAINER_NAME \
--hostname "`hostname`-$name" \
$args \
$image
#!/bin/bash
ETCD="http://192.168.1.1:4001"
DOMAIN="net/ihdev/prod/s/$name/`hostname`"
ifconfig eth1 >/dev/null 2>&1
if [[ $$? -eq 0 ]]; then
PUBILC_IF=eth0
PRIVATE_IF=eth1
else
PUBILC_IF=eth0
PRIVATE_IF=eth0
fi
case "$announce_as" in
public) ANNOUNCE_IP="`ifconfig $$PUBILC_IF | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\\2/p'`"
;;
private) ANNOUNCE_IP="`ifconfig $$PRIVATE_IF | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\\2/p'`"
;;
*) ANNOUNCE_IP=""
;;
esac
enable -f /usr/lib/sleep.bash sleep
trap "{ curl -L "$$ETCD/v2/keys/skydns/$$DOMAIN" -XDELETE ; exit 0; }" SIGINT SIGTERM
while true; do
if [[ "$announce_as" == "container" ]]; then
ANNOUNCE_IP="`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $name`"
fi
curl -L "$$ETCD/v2/keys/skydns/$$DOMAIN" -XPUT -d value="{\\"host\\": \\"$$ANNOUNCE_IP\\", \\"port\\": $port}" -d ttl=60 >/dev/null 2>&1
sleep 45
done
docker ps адреса не показывает. Единственное, что я сходу нашел — это docker inspect cont_name. docker inspect cont_name | grep IPAddr, пока не начитал достаточное количество документации и статей. Узнал, что есть docker attach cont_name. man docker нет!$ sudo docker run -it imageName /bin/bash
$ sudo docker attach containerId
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' containerId
-it — это не поведение по умолчанию, что прискорбно для начинающего.$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
$ sudo docker run --rm ubuntu:14.04 /bin/echo 'Hello world'
$docker exec -it containerId /bin/bash
nse() {
if [ $# -lt 2 ] ; then
echo "usage: nse container command args..."
else
container=$1
shift
sudo nsenter --pid --uts --mount --ipc --net --target $(docker inspect --format="{{ .State.Pid }}" $container) "$@"
fi
}
docker run -d --name db some_db
docker run -d --name web --link db:db some_web_app
some_db.dev.docker. Даже в случае перезапуска контейнера с базой приложение достаточно быстро узнает новый IP.If you restart the source container, the linked containers /etc/hosts files will be automatically updated with the source container's new IP address, allowing linked communication to continue.
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
ENTRYPOINT ['python', 'app.py']
CMD ['--help']
docker run my_app будет выполнена команда python app.py --helpdocker run my_app --some-param будет выполнена команда python app.py --some-param.CMD ['python', 'init_db.py']
ENTRYPOINT ['python', 'app.py']
$ docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8
addn-hosts=/docker-container-hosts
interface=docker0
#!/bin/bash
# виртуальный домен для контейнеров
DOMAIN=containers.example.com
# addn-hosts файл для dnsmasq
CONTAINER_HOSTS=/docker-container-hosts
echo "# Auto-generated by $0" > $CONTAINER_HOSTS
for CONTAINER in тут список имен ваших контейнеров; do
IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER)
[ $IP ] && echo "$IP $CONTAINER.$DOMAIN" >> $CONTAINER_HOSTS
done
# просим dnsmasq перечитать CONTAINER_HOSTS
pkill -x -HUP dnsmasq
for CONTAINER in `docker ps -q`; do
IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER)
NAME=$(docker inspect --format '{{ .Config.Hostname }}' $CONTAINER)
[ $IP ] && echo "$IP $NAME.$DOMAIN" >> $CONTAINER_HOSTS
done
sudo ifconfig eth0:1 10.0.0.1 netmask 255.255.255.0 up
auto eth0:1
iface eth0:1 inet static
address 10.0.0.1
netmask 255.255.255.0
broadcast 10.0.0.255
sudo docker run -d --name="docker-oracle" -p 10.0.0.1:1521:1521/tcp -p 10.0.0.1:22:22/tcp docker:5000/linux_64-oracle_11
10.0.0.1 docker-oracle
Docker, SkyDNS и SkyDock — быстро и удобно