Заметки про Docker

1 мин

За время работы с Docker собралось немного мелочей, которые я и хочу здесь собрать.

Сборка образа

docker build -t $SERVICE_NAME:$SERVICE_VERSION .

Multi-stage Dockerfile

Docker с версии 17.05 умеет multi-stage Dockerfile. Это порой значительно уменьшает размер конечного образа. Пример:

FROM golang AS builder
ADD . /go/src/my-service/
RUN cd /go/src/my-service/ && go get .
RUN go install my-service

FROM alpine
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
COPY --from=builder /go/bin/my-service /bin/my-service
ENTRYPOINT /bin/my-service

Публикация образа в registry

docker tag $SERVICE_NAME:$SERVICE_VERSION registry.example.com/$SERVICE_NAME:$SERVICE_VERSION
docker push registry.example.com/$SERVICE_NAME:$SERVICE_VERSION

Nexus начиная с версии 3 поддерживает хранение docker-реестра. Из приятных фишечек - авторизация и о, роботы, возможность удалять образы!

Удалить все контейнеры со статусом “Exited”

docker rm -f $(docker ps -a -q --filter "status=exited")

IP хоста в контейнере

Начиная с версии Docker 18.03 внутри контейнера появился host.docker.internal - доменное имя, которое указывет на хост. До версии 20.10.0 это работало только для Windows и Mac, но там стало работать и для Linux.

В версии 20.10.0 это перестало работать по умолчанию, теперь, чтобы контейнер мог достучаться до хоста, нужно добавить ключ

--add-host=host.docker.internal:host-gateway

Для Сompose и Nomad все точно так же работает через extra_hosts