Осваиваю docker. Основной принцип я понял, берутся готовые образы с Docker HUB, новый контейнер на основе образа запускается командой "docker run", пока контейнер запущен, можно внесённые в него изменения сохранить, создав на основе изменённого контейнера новый образ командой "docker commit". Но я не могу понять, если мне нужно внести изменения не только в файловую систему контейнера, а, например, в сетевые сокеты, точки монтирования, переменные, то есть во все те параметры, которые я могу увидеть командой "docker container inspect"
Создать по новой контейнер и не мучаться. В реальности редко кто запускает контейнер навсегда и вручную. Минимум это docker compose, по конфигу. Он контейнеры по остановке удаляет и создаёт заново.
Ну хорошо, допустим я каждый раз буду создавать контейнер заново, как сделать, чтобы это происходило при старте системы? И опять же "docker run" задаёт параметры контейнера, но не все, некоторые параметры, определённые в образе не переопределяются.
Разные.
Вот допустим я могу при помощи опции -p в docker run определить проброс портов в контейнер, но не могу убрать порты, которые уже были определены в образе. Допустим я беру образ asux/rails, в нём уже определён порт 3000/tcp, как его убрать? То же самое касается переменных, определяемых опцией -e
Искатель, EXPOSE только указывает, что в контейнере кто то слушает на порту 3000, но сам порт при этом не пробрасывается по умолчанию на ружу. Только если специально указать параметром "-p"
Вот выдержка из документации
The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container
Можно конечно поменять конфигурацию rails, что бы он внутри контейнера слушал на другом порту, но обычно это особой роли не играет. И для этого можно создать свой Dockerfile, унаследованный от asux/rails в котором ты заменишь конфигурационный файл rails. И уже от своего образа будешь создавать контейнеры.
Но тебе все равно придется указать docker run -p 6666:2000. Иначе никто не сможет достучаться до сервиса.
Для внешнего наблюдателя неважно на каком порту слушает сервис внутри контейнера, важен порт на который проброшен порт 3000. И это указывается параметром -p 6666:3000 к примеру.