Проект «SnakeProject» Михаила КозловаРегистрация

Навигация
⇒FreeBSD and Nix⇒

⇐CISCO
⇐Voice(Asterisk\Cisco)
⇐Microsoft
⇐Powershell
⇐Python
⇐SQL\T-SQL
⇐1С
⇐Общая
⇐WEB Разработка
⇐ORACLE SQL \ JAVA
⇐Мото

Знакомство с Docker часть 4


 

Знакомство с Docker часть 4


Предыдущая часть:
http://snakeproject.ru/rubric/article.php?art=docker_3_01.2019


Dockerfile - по сути файл инструкций, которые выполняются с верху в низ
С помощью него можно создавать образы

В файле есть синтаксис, инструкция - значение
FROM - с каким образом будем работать, пишется в самом начале, обязательная
RUN - что будем делать, команды, каждый RUN по сути создает свой слой
CMD - команда в запущенном контейнере
# - комментарий
MAINTAINER - контакт разработчика


Создадим Dockerfile:
mkdir /data/hello

vi /data/hello/Dockerfile
#My new Dockerfile
FROM ubuntu:15.04
MAINTAINER user@domain.local
RUN sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
RUN apt update && apt upgrade
RUN apt-get update
RUN apt-get install -y nginx
CMD ["echo", "'test hello'"]


Перейдем в папку и создадим образ, -t - задаваемое имя образа, 1.1 - версия, . - указывает на данный каталог(/data/hello):
cd /data/hello

docker build -t hello:1.1 .

Кстати, чтоб не было ошибки - _amd64.deb 404 Not Found [IP: 91.189.88.162 80], сделана строка с sed

При отработке команды мы видим:
Successfully built 96c899b5c29e - это новый id образа

В каждом Step создается новый контейнер, который по окончанию удаляется:
...
Removing intermediate container a4b244212d8b
...

Посмотрим историю образа:
docker history 96c899b5c29e
IMAGE               CREATED             CREATED BY                                      SIZE
96c899b5c29e        About an hour ago   /bin/sh -c #(nop)  CMD ["echo" "'test hello'…   0B
1867207a28ca        About an hour ago   /bin/sh -c apt-get install -y nginx             51.9MB
f8a5833b54f5        About an hour ago   /bin/sh -c apt-get update                       21.8MB
1d7bd1a29c1c        About an hour ago   /bin/sh -c apt update && apt upgrade            21.8MB
b6bc234aa765        About an hour ago   /bin/sh -c sed -i -re 's/([a-z]{2}\.)?archiv…   1.96kB
dbd99557c395        About an hour ago   /bin/sh -c #(nop)  MAINTAINER user@domain.lo…   0B
d1b55fd07600        2 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B
<missing>           2 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.88kB
<missing>           2 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   701B
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:3f4708cf445dc1b53…   131MB


docker run hello:1.1
'test hello'

Как мы видим команда из CMD выполнилась при запуске
CMD может быть записана с помощью двух вариантов:
1. (Типа shell): CMD echo test_hello
2. (Типа exec, 1 - команда, 2 - аргумент): CMD ["echo", "test_hello"]

Предпочтительней использовать вместо CMD - ENTRYPOINT
При запуске контейнера или каждом входе в него будет исполняться команда, указанная в ENTRYPOINT

К примеру мы вместо CMD ["echo", "'test hello'"] указали ENTRYPOINT ["apache2ctl"]
При запуке контенера можно передать аргументы (пример: -D FOREGROUND), и команда выполнится:
docker run -d -p 80:80 web -D FOREGROUND


На самом докерхабе так-же можно посмотреть в репозитории Dockerfile
Перейдем к убунту - https://hub.docker.com/_/ubuntu

В разделе "Supported tags and respective Dockerfile links" мы увидим линки, там описан код из Dockerfile


Создаим машину на примере nginx:
vi /data/hello/Dockerfile
FROM nginx:alpine
RUN mkdir /www
RUN cp /usr/share/nginx/html/* /www
RUN chown -R nginx:nginx /www

 

Пересоберем образ:
docker build -t web_hello:1.2 .

Запускаем:
docker run -d -p 80:80 web_hello:1.2

docker ps
CONTAINER ID  IMAGE          COMMAND                 PORTS             
a69e39fa4e3a  web_hello:1.2  "nginx -g 'daemon of…"  0.0.0.0:80->80/tcp


Подключимся к контейнеру:
docker exec -it a69e39fa4e3a ./bin/sh


Подправим конфиг:
vi /etc/nginx/nginx.conf
http {
....
    server {
        listen                  80;
        root                    /www;
        index                   index.html index.htm;
        server_name             localhost;
    }
....
}


Перечитать конфиг nginx:
nginx -s reload


Проверяем:
http://ip_your_server:80/

 


Создадим приватный репозиторий в локальной сети


На основной машине


Установим сервис дистрибьюции:
yum -y install docker-distribution

vi /etc/docker-distribution/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000

rootdirectory - директория для хранилища вашего репозитория
5000 - порт подключения

Откроем фаерволл:
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload


Включим сервис дистрибьюции:
systemctl start docker-distribution
systemctl enable docker-distribution
systemctl status docker-distribution


Сменим имя:
uname -n
localhost.localdomain

hostnamectl set-hostname centos1

uname -n
centos1


Запустите эту команду на всех узлах:
cat > /etc/docker/daemon.json << EOF
{
"insecure-registries" : ["centos1:5000"]
}
EOF


Перезагрузим сервис:
systemctl restart docker

 

На удаленной машине

1. Зададим имя сервера для обращения по сети:
vi /etc/hosts
10.0.2.4  centos1


2. Скачаем какой-либо образ с докерхаба:
docker pull fedora

docker images fedora
REPOSITORY  TAG    IMAGE ID
fedora      latest 26ffec5b4a8a


3. Закачаем образ на сервер:
docker tag fedora:latest centos1:5000/testfedora:latest

docker push centos1:5000/testfedora:latest


4. Скачивание и запуск образа из приватного репозитория:
docker run -it centos1:5000/testfedora:latest

 

Переменные в Dockerfile


Указываются с помощью ENV

Пример указания:
ENV var1=ping var2=8.8.8.8

Пример использования:
CMD $var1 $var2

 

После ребилда и запука контейнера можно посмотреть логи команды по id контейнера:
docker logs e28a7420da55

 

Подключение каталога из ОС к Docker контейнеру

Синтаксис:
docker run -v myvolume:/var/whatever myimage

Пример:
mkdir /data/testvolume
echo 'testvolume' > /data/testvolume/testfile.txt

docker run -v /data/testvolume:/testvolume -d -p 80:80 web_hello:1.2


docker exec -it 82faf71f098c ./bin/sh

cat /testvolume/testfile.txt
testvolume

 


Тома в Docker


Так-же можно в Dockerfile создать точку монтирования, пример:
RUN mkdir /volname
VOLUME /volname


Еще пример работы с томами


Создадим volume с именем www_page:
docker volume create --name www_page


Просмотрим, тома внутри докера:
docker volume ls | grep www_page
local               www_page


Подробная информация:
docker volume inspect www_page
[
    {
        "CreatedAt": "2019-01-22T17:50:40+03:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/data/docker/volumes/www_page/_data",
        "Name": "www_page",
        "Options": {},
        "Scope": "local"
    }
]

 

Создадим index.html:
echo 'TestPage' > /data/docker/volumes/www_page/_data/index.html


Запустим контейнер с примонтированием тома - -v www_page:/data/www:
docker run -v www_page:/data/www -d -p 80:80 web_hello:1.2


Проверяем:
docker exec -it 0c6cc038d219 ./bin/sh


cat /data/www/index.html
TestPage

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

© Snakeproject.ru создан в 2013 году. При копировании материала с сайта - оставьте ссылку.


Яндекс.Метрика

Goon Каталог сайтов Рейтинг@Mail.ru