- Cookbook
- top по контейнерам
docker run --net=host
- Запуск контейнера работающем в сети на хосте- История образа. Как понять из чего контейнер?
- Список всех тегов образа
- Установка прав доступа юзеру к тому в Dockerfile
- Удалить все остановленные контейнеры
- Как залить на
Docker Hub
- Создать том в контейнер
- Запуск jekyll !!!
- Разворачиваем контейнер в heroku
- Контроль контейнеров
- Consul
- Сети
Cookbook
Здесь перечислены большинство плюшек связаных с докером, всякие шорт-каты и т.п.
top по контейнерам
docker stats $(docker inspect -f $(docker ps -q))
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c8248799dbad identilogspout 0.28% 4.461MiB / 15.37GiB 0.03% 39.7kB / 3.91MB 6.12MB / 0B 12
c59d30a1bbc9 identiproxy 0.00% 2.934MiB / 15.37GiB 0.02% 6.08MB / 6.27MB 0B / 0B 2
1f0e968c415a identilogstash 0.52% 288.7MiB / 15.37GiB 1.83% 5.76MB / 7.03MB 49.1MB / 0B 41
2b7ba2b19ef9 identikibana 0.00% 55.07MiB / 15.37GiB 0.35% 109MB / 11.8MB 21.3MB / 4.1kB 11
f5139fa9439f identidock 0.00% 34.14MiB / 15.37GiB 0.22% 4.59MB / 3.72MB 659kB / 0B 3
d22c022a0a89 identielastic 0.98% 436MiB / 15.37GiB 2.77% 15.1MB / 110MB 44.2MB / 55.5MB 125
456757f85bb0 identidnmonster 0.00% 35.05MiB / 15.37GiB 0.22% 40.9kB / 2.58kB 0B / 0B 15
ad3158f13845 identiredis 0.18% 2.613MiB / 15.37GiB 0.02% 480kB / 881kB 1.92MB / 8.19kB 3
docker run --net=host
- Запуск контейнера работающем в сети на хосте
docker run --rm --net=host -d postgres:9.6
История образа. Как понять из чего контейнер?
TODO
Список всех тегов образа
docker images --no-trunc | grep $(docker inspect -f avis20/identidock:stable)
Установка прав доступа юзеру к тому в Dockerfile
FROM debian:wheezy
RUN useradd foo
RUN mkdir /data && touch /data/x
RUN chown -R foo:foo /data
VOLUME /data
Если сделать в начале VOLUME /data то не получиться!
Удалить все остановленные контейнеры
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e61ddf2b718 debian "bash" 3 seconds ago Exited (0) 1 second ago docker-cont
3fe6ef8c1e54 debian "bash" 8 seconds ago Up 7 seconds vigilant_napier
vagrant@ubuntu-xenial:~$
...
$ docker rm -v $(docker ps -aq -f status=exited)
7e61ddf2b718
...
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fe6ef8c1e54 debian "bash" 2 minutes ago Up 2 minutes vigilant_napier
echo "alias docker-clean='docker rm -v $(docker ps -aq -f status=exited)'" >> ~/.bashrc
Как залить на Docker Hub
1) Создаем учетку на hub.docker.com
Не до конца понял про docker ID при регистрации
2) Логинемся в консоли в аккаунт docker login
3) Создаем билд который хотим залить $ docker build ceaef8f4b6d4/cowsay .
4) Заливаем образ $ docker push ceaef8f4b6d4/cowsay
Создать том в контейнер
Способ №1 - docker dun -v /data
Создает маунт диры /data
внутри контейнера и хост машиной в неявном виде
$ docker run -it -v /data --name mybash debian bash
root@5ca6e13f7405:/# echo 111 > /data/222
...
$ docker inspect mybash | grep Mount -A10
"Mounts": [
{
"Type": "volume",
"Name": "b39ebb31f6c04e3aa185be6b18cfddb097b0c0bea56b8e770dc21aef3b71b88f",
"Source": "/var/lib/docker/volumes/b39ebb31f6c04e3aa185be6b18cfddb097b0c0bea56b8e770dc21aef3b71b88f/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
...
$ sudo ls -l /var/lib/docker/volumes/b39ebb31f6c04e3aa185be6b18cfddb097b0c0bea56b8e770dc21aef3b71b88f/_data
total 4
-rw-r--r-- 1 root root 4 Jul 11 21:29 222
После удаления контейнера, файлы тоже удаляються!
Способ №2 - Dockerfile - VOLUME
Тоже самое что и в docker run, только в файле и т.к. почти каждая строка сценария исполняется в отдельном слое контейнера, нужно учитывать последовательность доступов к маунтам
Способ №3 - Жеское мантирование
$ mkdir mybash_data
vagrant@ubuntu-xenial:~$ touch mybash_data/test
...
$ docker run -it -v /home/vagrant/mybash_data/:/data --name mybash debian bash
root@849c5743ed31:/# ls /data/
test
...
root@849c5743ed31:/# echo 111 > /data/dsa
...
vagrant@ubuntu-xenial:~$ ls ./mybash_data/
dsa test
Создается жеский маунт с хост машины внутрь контейнера. Не рекомендуется
Способ №4 - Контейнеры данных. Рекомендованный способ
$ docker run -it -v /data --name mybash debian bash
root@2e7cd520870f:/# echo 111 > /data/test
root@2e7cd520870f:/#
...
$ docker run -it -h new-cont --volumes-from mybash debian bash
root@new-cont:/# ls /data/
root@new-cont:/# ls /data/
test
...
Запуск jekyll !!!
docker run --rm -v $PWD/doc:/srv/jekyll -it -p 4000:4000 jekyll/builder jekyll serve -LR 4001
Запуск jenkins контейнера
docker create --name jenkins-data identijenk echo "Jenkins Data Container"
docker run -d --rm --name jenkins -p 8080:8080 --volumes-from jenkins-data -v /var/run/docker.sock:/var/run/docker.sock identijenk
Скрипт сборки
COMPOSE_ARGS=" -f jenkins.yml -p jenkins "
sudo docker-compose $COMPOSE_ARGS stop
sudo docker-compose $COMPOSE_ARGS rm --force -v
sudo docker-compose $COMPOSE_ARGS build --no-cache
sudo docker-compose $COMPOSE_ARGS up -d
sudo docker-compose $COMPOSE_ARGS run --no-deps --rm -e RUN=UNIT identidock
ERR=$?
if [ $ERR -eq 0 ]; then
IP=$(sudo docker inspect -f jenkins_identidock_1)
CODE=$(curl -sL -w "%{http_code}" $IP:9090/monster/bla -o /dev/null) || true
if [ $CODE -ne 200 ]; then
echo "Site returned " $CODE
ERR=1
else
echo "Test Passed"
HASH=$(git rev-parse --short HEAD)
sudo docker tag jenkins_identidock avis20/identidock:$HASH
sudo docker tag jenkins_identidock avis20/identidock:stable
echo "Pushing"
sudo docker login -u avis20 -p 1234567890docker!
sudo docker push avis20/identidock:$HASH
sudo docker push avis20/identidock:stable
fi
fi
sudo docker-compose $COMPOSE_ARGS stop
sudo docker-compose $COMPOSE_ARGS rm --force -v
return $ERR
Разворачиваем контейнер в heroku
Установка
sudo snap install --classic heroku
cmd history
heroku container:login
heroku create
heroku stack:set container --app obscure-tundra-63775
git push heroku master
catalyst.pl MyApp
git add -A
git ci "init root"
git push origin master
git push heroku master
heroku open --app obscure-tundra-63775
heroku logs --tail
git push heroku master
Контроль контейнеров
Consul
Шаг 1
Виртуалка №1
Vagrant.configure(2) do |config|
config.vm.box = "bento/ubuntu-16.04"
config.vm.synced_folder ".", "/home/vagrant/projects"
config.vm.network "private_network", ip: "3.3.3.2", auto_config: false
config.vm.provision 'shell', inline: "ifconfig eth1 3.3.3.2"
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
config.vm.provision "shell", inline: <<-SHELL
# Install docker and docker compose
sudo -i
apt-get update && apt-get install htop bash-completion
curl https://get.docker.com > /tmp/install.sh
chmod +x /tmp/install.sh
/tmp/install.sh
usermod -aG docker vagrant
service docker restart
SHELL
end
Виртуалка №2
Vagrant.configure(2) do |config|
config.vm.box = "bento/ubuntu-16.04"
config.vm.synced_folder ".", "/home/vagrant/projects"
config.vm.network "private_network", ip: "3.3.3.3", auto_config: false
config.vm.provision 'shell', inline: "ifconfig eth1 3.3.3.3"
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
config.vm.provision "shell", inline: <<-SHELL
# Install docker and docker compose
sudo -i
apt-get update && apt-get install htop bash-completion
curl https://get.docker.com > /tmp/install.sh
chmod +x /tmp/install.sh
/tmp/install.sh
usermod -aG docker vagrant
service docker restart
SHELL
end
После запуска нужно проверить ip виртуалок. Если (а это часто бывает) ip не проставился установить в ручную
sudo ifconfig eth1 3.3.3.2
sudo ifconfig eth1 3.3.3.3
Шаг 2
docker с консулом 1
HOSTA=3.3.3.2
docker run --rm -d --name consul -h consul-1 \
-p 8300:8300 -p 8301:8301 -p 8301:8301/udp \
-p 8302:8302 -p 8400:8400 -p 8500:8500 -p $HOSTA:53:8600/udp \
gliderlabs/consul agent -data-dir /data -server \
-client 0.0.0.0 -advertise $HOSTA -bootstrap-expect 2
docker с консулом 2
HOSTA=3.3.3.2
HOSTB=3.3.3.3
docker run --rm -d --name consul -h consul-2 \
-p 8300:8300 -p 8301:8301 -p 8301:8301/udp \
-p 8302:8302 -p 8400:8400 -p 8500:8500 -p $HOSTB:53:8600/udp \
gliderlabs/consul agent -data-dir /data -server \
-client 0.0.0.0 -advertise $HOSTB -join $HOSTA
Шаг 3
запуск и регистрация редиса
HOSTB=3.3.3.3
curl -XPUT http://$HOSTA:8500/v1/agent/service/register -d '{"name":"redis", "address":"'$HOSTB'", "port":6379}'
Проверка
docker run --rm redis:3 redis-cli -h redis.service.consul ping
Запуск dnmonster на consul-1 и добавление соответствующего сервиса:
docker run -d --name dnmonster amouat/dnmonster:1.0
...
DNM_IP=$(docker inspect -f dnmonster)
...
curl -XPUT http://$HOSTA:8500/v1/agent/service/register -d '{"name":"dnmonster", "address":"'$DNM_IP'", "port":8080}'
Сети
docker run -d --name redis1 redis:3
docker run -it redis redis-cli -h db ping
Режимы сетей
1) bridge - по умолчанию
Создает NAT подсеть