Как я могу подключиться к локальному узлу машины из контейнера Docker?

Я не делал этого с помощью RSpec, но у меня есть тест Test :: Unit, который делает что-то подобное для загрузки фотографии. Я установил загруженный файл в качестве экземпляра ActionDispatch :: Http :: UploadedFile следующим образом:

test "should create photo" do
  setup_file_upload
  assert_difference('Photo.count') do
    post :create, :photo => @photo.attributes
  end
  assert_redirected_to photo_path(assigns(:photo))
end


def setup_file_upload
  test_photo = ActionDispatch::Http::UploadedFile.new({
    :filename => 'test_photo_1.jpg',
    :type => 'image/jpeg',
    :tempfile => File.new("#{Rails.root}/test/fixtures/files/test_photo_1.jpg")
  })
  @photo = Photo.new(
    :title => 'Uploaded photo', 
    :description => 'Uploaded photo description', 
    :filename => test_photo, 
    :public => true)
end

Нечто похожее может работать и на вас.

1016
задан Kevin 3 March 2017 в 16:32
поделиться

2 ответа

Я решил его создающий пользователя в MySQL для IP контейнера:

$ sudo mysql
mysql> создают пользователя 'имя пользователя' '172.17.0.2' определенных 'паролем';
Запрос хорошо, 0 затронутых строк (0,00 секунды)

mysql> предоставляют все полномочия на database_name.* к 'имени пользователя' '172.17.0.2' с опцией предоставления;
Запрос хорошо, 0 затронутых строк (0,00 секунды)

$ sudo энергия/etc/mysql/mysql.conf.d/mysqld.cnf
связывают адресный = 172.17.0.1

$ sudo systemctl mysql.service

перезапуска Тогда на контейнере: jdbc:mysql:// 172.17.0.1 :3306/database_name

0
ответ дан Leandro 4 October 2019 в 07:58
поделиться

Для Linux, где Вы не можете изменить интерфейс, localhost сервис связывает с [1 117]

существует две проблемы, которые мы должны решить

  1. Получение IP хоста
  2. Предоставление доступа к нашему localhost сервису, для Докера

, первая проблема может быть решена с помощью qoomon's изображение хоста докера , как дано другими ответами.

необходимо будет добавить этот контейнер к той же мостовой схема как другой контейнер так, чтобы можно было получить доступ к нему. Откройте терминал в своем контейнере и удостоверьтесь, что можно проверить с помощью ping-запросов dockerhost.

bash-5.0# ping dockerhost
PING dockerhost (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.523 ms

Теперь, более трудная проблема, делая сервис доступным для докера.

Мы можем использовать telnet, чтобы проверить, можем ли мы получить доступ к порту на хосте (Вы, возможно, должны установить это).

проблема состоит в том, что наш контейнер только будет в состоянии к службам доступа, которые связывают со всеми интерфейсами, такими как SSH:

bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

, Но сервисы, связанные только с localhost, будет недоступно:

bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.20.0.2): Connection refused

надлежащее решение здесь состояло бы в том, чтобы связать сервис с мостовой схема докеров. Однако этот ответ предполагает, что для Вас не возможно изменить это. Таким образом, мы будем вместо этого использовать iptables.

Первый, мы должны найти название мостовой схема, которую докер использует с ifconfig. При использовании моста без имени это просто будет docker0. Однако при использовании именованной сети, у Вас будет мост, запускающийся с [1 111], что докер будет использовать вместо этого. Мой br-5cd80298d6f4.

, Как только у нас есть название этого моста, мы должны позволить направлять от этого моста до localhost. Это отключено по умолчанию из соображений безопасности:

sysctl -w net.ipv4.conf.<bridge_name>.route_localnet=1

Теперь для установки нашего iptables правило. Так как наш контейнер может только порты доступа на мостовой схема докера, мы собираемся притвориться, что наш сервис на самом деле связывается с портом в этой сети.

, Чтобы сделать это, мы передадим все запросы к [1 114] к [1 115]

iptables -t nat -A PREROUTING -p tcp -i <docker_bridge_name> --dport <service_port> -j DNAT --to-destination 127.0.0.1:<service_port>

, Например, для моего сервиса на порт 1025

iptables -t nat -A PREROUTING -p tcp -i br-5cd80298d6f4 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025

необходимо теперь быть в состоянии получить доступ сервису от контейнера:

bash-5.0# telnet dockerhost 1025
220 127.0.0.1 ESMTP Service Ready

2
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: