Ответы пользователя по тегу Docker
  • Как запустить docker в Jenkins?

    @mxelgin Автор вопроса
    Решение:

    Собираем образ jenkins:2.462.3-jdk17 по инструкции
    https://www.jenkins.io/doc/book/installing/docker/
    FROM jenkins/jenkins:2.462.3-jdk17
    USER root
    RUN apt-get update && apt-get install -y lsb-release
    RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
      https://download.docker.com/linux/debian/gpg
    RUN echo "deb [arch=$(dpkg --print-architecture) \
      signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
      https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
    RUN apt-get update && apt-get install -y docker-ce-cli
    USER jenkins
    RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"


    Далее собираем контейнер jenkins-blueocean из образа, в моем случае сборка идет из Docker Registry
    services:
      jenkins:
        container_name: jenkins-blueocean
        image: 192.168.0.42:5000/jenkins:2.462.3-jdk17
        privileged: true  # Запуск с правами привилегированного контейнера
        ports:
          - "8080:8080"
          - "50000:50000"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock  # Подключаем Docker сокет для доступа к хосту
        networks:
          jenkins_network:  # Используем пользовательскую сеть
    
    networks:
      jenkins_network:  # Создание пользовательской сети
        driver: bridge


    Теперь наша задача проверить что Jenkins видит образы
    Заходим в контейнер, проверяем, соответственно ругается так как прав нет
    jenkins@f2b6f83f5892:/$ docker images
    permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied


    Так как у jenkins в сборе sudo нет все делаем под правами root
    Устанавливаем пакет управления доступом (ACL)
    root@f2b6f83f5892:/# apt-get install acl

    даем пользователю jenkins доступ на чтение и запись
    root@f2b6f83f5892:/# setfacl -m u:jenkins:rw /var/run/docker.sock


    Перезаходим под пользователя jenkins
    jenkins@f2b6f83f5892:/$ docker images

    Появится список образов docker. Вопрос решен Jenkins находится в контейнере и видит Docker
    Ответ написан
    Комментировать
  • Docker + postgres как подружить?

    @mxelgin
    ports:
          - "5433:5432"


    исправьте и подключайтесь на один порт 5432 чтоб не запутаться
    ports:
    - "5432:5432"
    Ответ написан
    Комментировать
  • Как из docker контейнера стучаться в другие сети?

    @mxelgin
    Чтобы из Docker-контейнера обращаться к другим сетям или сервисам, нужно учесть несколько моментов. Вот основные шаги и рекомендации:

    1. Подключение к внешним сетям
    Если вы хотите, чтобы ваш контейнер мог обращаться к внешним сетям (например, к другим контейнерам, которые находятся в разных сетях), убедитесь, что:

    Контейнер находится в той же сети, что и целевые сервисы.

    2. Создание сети в Docker Compose
    Можно создать пользовательскую сеть в docker-compose.yml, чтобы контейнеры могли видеть друг друга:
    version: '3'
    
    services:
      web:
        volumes:
          - ./web:/app
        env_file:
          - ./web/.env
        build: ./web
        ports:
          - '8000:8000'
        networks:
          - my_network
    
      other_service:
        image: some_image
        networks:
          - my_network
    
    networks:
      my_network:
        driver: bridge

    3. Обращение к сервисам
    Внутри контейнера вы можете обращаться к другим контейнерам по имени сервиса, указанному в docker-compose.yml. Например, если у вас есть другой сервис с именем other_service, вы можете обращаться к нему по адресу http://other_service:port.
    4. Обращение к внешним ресурсам
    Если вы хотите обращаться к ресурсам вне Docker (например, к API или к базе данных на внешнем сервере), просто используйте их IP-адрес или доменное имя. Например:

    environment:
      - API_URL=http://external.api.com

    5. Проверка сетевых настроек
    Если возникают проблемы с соединением, проверьте следующее:

    Убедитесь, что у контейнера есть доступ к интернету.
    Проверьте настройки брандмауэра на хосте.
    Убедитесь, что целевые сервисы доступны из контейнера.
    Пример
    Вот пример docker-compose.yml, который включает подключение к сети и другой сервис:

    version: '3'
    
    services:
      web:
        volumes:
          - ./web:/app
        env_file:
          - ./web/.env
        build: ./web
        ports:
          - '8000:8000'
        networks:
          - my_network
    
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: example
        networks:
          - my_network
    
    networks:
      my_network:
        driver: bridge

    В этом примере контейнер web может подключаться к контейнеру db по адресу db:3306.
    Ответ написан
    Комментировать
  • Как собрать общий конфиг для docker и asp net?

    @mxelgin Автор вопроса
    Вот мое решение
    public class DockerContext: DbContext
        {
            private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                if (!InDocker)
                {
    // Здесь переопределяем ConnectionString для миграций
                }
            }


    или так
    program.cs
    public static bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }
    public static void Main(string[] args)
    {
      var builder = WebApplication.CreateBuilder(args);
      builder.Services.AddDbContext<DockerContext>(options =>
                    options.UseSqlServer(builder.Configuration.GetConnectionString(InDocker ? "DockerContext" : "MigrationContext") ?? throw new InvalidOperationException("Connection string 'DockerContext' not found.")));
    }
    Ответ написан
    7 комментариев
  • Почему не могу выполнить миграции в докере?

    @mxelgin
    Не увидел как у вас .env подключается в докере?

    db:
    ......
    secrets:
    - db-password
    secrets:
    db-password:
    file: ./docker/secrets/.env
    Ответ написан
    Комментировать