docker - aleksei-khitev/knowledge_base GitHub Wiki

Docker

Docker Compose

Строение Dockerfile

# Имя образа из docker hub
FROM jboss/base-jdk:11
# переменная среды окружение и значение через пробел
ENV WILDFLY_VERSION 20.0.0.Final
ENV JBOSS_HOME /opt/jboss/wildfly
# команда, которую нужно выполнить при сборке. Может быть несколько
RUN cd /opt/jboss && curl https://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz | tar zx && mv /opt/jboss/wildfly-$WILDFLY_VERSION /opt/jboss/wildfly 
# Какие порты открываем наружу?
EXPOSE 8080
EXPOSE 8787
# Копирование чего либо в образ.
# Файлы должны быть в том же каталоге или подкаталоге, что и конфиг. По абсолютному пути куда то еще не попасть - ошибка
COPY log4j.properties /tmp/some_app_conf/log4j.properties

ENV APP_CONF=/tmp/some_app_conf

Строение docker-compose

version: '2'
services:
  # имена сервисов могут быть произвольными
  nginx:
    # Имя образа из docker hub
    image: nginx
    # Подключаемые файлы и папки. Можно использовать переменные среды. Имена могут отличаться.
    volumes:
        - $PROJECT_CONF_ROOT/some_project-conf/local/docker/nginx/nginx_snapshot.conf:/etc/nginx/nginx.conf:ro
    # Команда, которая должна быть выполнена по завершении загрузки
    command: nginx -g "daemon off;"
    container_name: proxy
    # Без этого параметра, контейнер не будет доступен по localhost другим контейнерам. К примеру, http://localhost:80
    network_mode: host
    # Открытые порты. Если не путаю, слева наружный порт, справа- внутренний.
    ports:
        - "80:80"
  bg:
    image: openjdk:8-jre-slim
    network_mode: host
    # Дождаться загрузки другого сервиса
    depends_on:
        - nginx
    # Задание переменной среды.
    environment:
        - APP_CONF=/tmp/some-another-conf/local
    volumes:
        # ...
    working_dir: # ...
    command: # ...
    container_name: bg
    ports:
      - "59669:59669"  
  workers:
    image: openjdk:8-jre-slim
    network_mode: host
    depends_on:
        - nginx
        - bg
    environment:
        # ...
    volumes:
        # ...
    command: # ...
    container_name: workers
    ports:
      - "5005:5005"
  gat:
    # Так определяется использование образа Docker. Где образ и какой файл
    build:
      context: .
      dockerfile: Dockerfile-j11-wildfly15.0.0.Final
    network_mode: host
    depends_on:
        - nginx
        - bg
        - workers
    environment:
        # ...
    volumes:
        # ...
    command: /opt/wildfly/bin/standalone.sh --debug 8787 -b 0.0.0.0 -bmanagement 0.0.0.0
    container_name: gat

Замена "network_mode: host" в Windows

В Windows network_mode: host не поддерживается.
Для того, чтобы контейнеры видели друг друга, нужно создать общую сеть.

version: '3.8'
services:
  nginx:
    ...
    networks:
      - main_network
...
networks:
    main_network:

Обращение к контейнеру по имени от хоста

Чтобы хост мог обращаться к контейнерам по имени, нужно добавить их в hosts
Для Windows, он лежит в C:\Windows\System32\drivers\etc. К примеру

127.0.0.1 it-rganizer-backend

Разрешение конфликта с hosts хоста за счет внутреннего DNS Docker-а

Чтобы контейнер использовал DNS docker-а, а не hosts хоста, нужно использовать резолвер 127.0.0.11
К примеру, в nginx это можно сделать так:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        ...
        location ~ \.jar$ {
            resolver 127.0.0.11;
            proxy_pass   http://it-organizer-backend:8080;
        }

Открытие порта для хоста

Если использовать EXPOSE, то порт будет открыт для других контейнеров
Если в docker-config использовать ports, то порт будет открыт и для хоста

Увидеть информацию о контейнерах

docker ps -a

Compose

build

sudo docker-compose build --no-cache

start

sudo docker-compose up -d

Запуск с пересборкой

sudo docker-compose -f docker-compose-snapshot.yml up -d --force-recreate --build

stop

sudo docker-compose down

Shell inside container

sudo docker exec -t -i container_name /bin/bash

Просмотр логов контейнера

sudo docker logs gat

Просмотр логов в режиме follow (как tail -f)

sudo docker logs --follow gat

Назад к Tech Skills

⚠️ **GitHub.com Fallback** ⚠️