docker-compose budowanie środowiska

W poprzednim artykule pokazałem jak uruchomić swój pierwszy kontener na przykładzie MySQL’a. Tym razem chciałbym się skupić na tym jak za pomocą docker-compose automatycznie budować środowisko.  W ogólnym zarysie docker-compose tworzy kontenery wykorzystując docker build z opcjami. Podstawowym miejscem konfiguracji jest plik docker-compose.yml. W 2016 roku pojawiła się druga wersja (v2) składni pliku docker-compose.yml. Różni się ona w poszczególnych miejscach pomiędzy sobą co postaram się zaprezentować.

Instalacja docker-compose

Pobieramy binarke z docker-compose

$ sudo su -
# curl -L "https://github.com/docker/compose/releases/download/1.8.0/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose

Następnie dodajemy atrybut wykonywalności

# chmod +x /usr/local/bin/docker-compose

Testujemy poprawność instalacji

docker-compose --version

Plik konfiguracyjny (version 1)

Konfiguracja budowanego środowiska powinna znaleźć się w pliku docker-compose.yml jednak nic nie stoi na przeszkodzie by plik ten miał inną nazwę, będziemy musieli jedynie pamiętać o każdorazowaym poinformowaniu docker-compose o innym pliku. Jak już wspomniałem na początku, na dzień dzisiejszy istnieją dwie wersje pliku konfiguracyjnego – v1 i v2. W pierwszej części pokaże jak zbudować środowisko najczęściej wykorzystywane czyli apache2 + mysql + phpMyAdmin. O tym jak samodzielnie stworzyć kontener już pisałem wcześniej, więc osoby zainteresowane odsyłam do artykułu Docker – pierwszy kontener z MySQL i Docker – własny obraz za pomocą dockerfile

Na potrzeby przykładu struktura katalogów w moim przypadku wygląda następująco:

$ tree --dirsfirst
.
├── apache2
│   ├── html
│   │   └── index.html
│   ├── apache2-foreground
│   └── Dockerfile
├── mysql
│   └── data
└── docker-compose.yml

Jak widać na powyższym listingu katalog apache2 zawiera plik Dockerfile, plik ten posłuży do specyficznego zbudowania obrazu na potrzeby naszego środowiska. W tym konkretnym przypadku będzie to apache2 i php7.

listing apache2/Dockerfile

FROM debian:jessie

RUN apt-get update && \
    apt-get install -y --force-yes --no-install-recommends ca-certificates wget &&\
    wget https://www.dotdeb.org/dotdeb.gpg &&\
    apt-key add dotdeb.gpg 

RUN echo "deb http://packages.dotdeb.org jessie all\n" > /etc/apt/sources.list.d/php.list && \
    echo "deb-src http://packages.dotdeb.org jessie all" >> /etc/apt/sources.list.d/php.list

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y --force-yes --no-install-recommends apache2 php7.0 php7.0-mysql php7.0-xml php7.0-gd php7.0-mbstring

ENV APACHE_CONFDIR /etc/apache2
ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars
RUN set -ex \
    && . "$APACHE_ENVVARS" \
    && ln -sfT /dev/stderr "$APACHE_LOG_DIR/error.log" \
    && ln -sfT /dev/stdout "$APACHE_LOG_DIR/access.log" \
    && ln -sfT /dev/stdout "$APACHE_LOG_DIR/other_vhosts_access.log"

EXPOSE 80

COPY apache2-foreground /usr/local/bin/
WORKDIR /var/www/html
CMD ["apache2-foreground"]

listing docker-compose.yml

web:
  build: web/
  links:
    - db:mysql
  ports:
    - 9980:80
  volumes:
    - ./apache2/html:/var/www/html
db:
  image: mysql
  environment:
    - MYSQL_ROOT_PASSWORD=myPassword
  volumes:
    - ./mysql/data:/var/lib/mysql
pma:
  image: phpmyadmin/phpmyadmin
  ports:
    - 9981:80
  links:
    - db:db

Uwaga !
Przede wszystkim muszę zaznaczyć, że używamu tu formatu YAML. Wymaga on od nas stosowania wcięć za pomocą jednej lub większej ilości spacji. Używanie tabulatora powoduje ciężkie do znalezienia błędy. Zachęcam do zapoznania się z dokumentacją do formatu yaml. (wikipedia)

Patrząc na plik docker-compose.yml widzimy 3 sekcje (web, db, pma). Każda z nich odpowiada za jeden kontener w naszym środowisku. W sekcji web, widzimy linijkę build: apache2/ – oznacza to, że kontener zostanie zbudowany z obrazu którego definicja zawiera się w pliku apache2/Dockerfile. Jest to bardzo przydatne bo pozwala przenieść konfiguracje z jednego hosta na inny bez potrzeby sledzenia z których obrazów korzystamy. Istotną czynnością z punktu widzenia tworznia obrazów jest linkowanie. Pamiętamy, że aby połączyć jeden kontener z drugim używaliśmy instrukcji –link. Tutaj również robimy to samo, ale używając sekcji links determinujemy w pewien sposów kolejność tworzenia kontenerów. W naszym przypadku jako pierwszy powstanie kontener db od którego zależa obrazy web i pma.

Aby zbudować brakujące obrazy wydajemy z terminala komende:

$ docker-compose build

Jeśli wszystko się udało możemy przejść do właściwego uruchamiania środowiska, w tym celu wpisujemy:

$ docker-compose up -d

Jeżeli nie było żadnych błędów sprawdzamy czy nasze kontenery się uruchomiły.

$ docker ps
30968c0663bf        devblog_web             "apache2-foreground"     12 seconds ago      Up 10 seconds       0.0.0.0:9980->80/tcp   devblog_web_1
5e734f3e8b79        phpmyadmin/phpmyadmin   "/run.sh phpmyadmin"     12 seconds ago      Up 10 seconds       0.0.0.0:9981->80/tcp   devblog_pma_1
ce716eccce6b        mysql                   "docker-entrypoint.sh"   13 seconds ago      Up 12 seconds       3306/tcp               devblog_db_1

Dla pewności sprawdzamy adres http://localhost:9980 – czyli nasze Hello World z pliku apache2/html i http://localhost:9981 – czyli nasz phpMyAdmin.

 

Dodaj komentarz

avatar
wpDiscuz