Статьи

Включить Docker Remote API на Docker Machine в Mac OS X

Демон Docker предоставляет API Remote REST. Этот API используется Клиентом для связи с движком. Этот API также может быть вызван другими инструментами, такими как curl или Chrome Postman REST Client .

Если вы создаете демоны Docker с помощью Docker Machine на OSX Mavericks, то заставить этот API работать немного сложнее. Этот блог расскажет, как включить Docker Remote API на машинах Docker, созданных в Mac OS X.

Подключение к безопасному порту Docker с помощью curl дает команду как:

1
2
3
4
$ curl https://$HOST:2376/images/json \
  --cert ~/.docker/cert.pem \
  --key ~/.docker/key.pem \
  --cacert ~/.docker/ca.pem

Пара проблем с этой командой:

  • Эта команда даже не работает для Docker Machine, поскольку сертификаты для каждого компьютера хранятся в .docker/machine/machines/<machine-name> .
  • Даже если эта команда изменена, чтобы соответствовать этому пути:
    1
    curl https://192.168.99.100:2376/images/json --cert $DOCKER_CERT_PATH/cert.pem --key $DOCKER_CERT_PATH/key.pem --cacert $DOCKER_CERT_PATH/ca.pem

    Это все еще дает следующую ошибку:

    1
    curl: (58) SSL: Can't load the certificate "/Users/arungupta/.docker/machine/machines/couchbase/cert.pem" and its private key: OSStatus -25299

    Виновником этого является обновленная утилита curl для пользователей OSX Mavericks . Таким образом, в новой версии CURL вместо API OpenSSL используется API безопасного транспорта Apple. Это означает, что сертификаты должны быть в формате P12.

Давайте исправим это!

  • Перейдите в каталог, где хранятся сертификаты для вашего компьютера. В моем случае это .docker/machine/machines/couchbase .
  • Сгенерируйте *.p12 формат для сертификата:
    1
    2
    3
    4
    5
    6
    7
    8
    openssl pkcs12 -export \
    -inkey key.pem \
    -in cert.pem \
    -CAfile ca.pem \
    -chain \
    -name client-side \
    -out cert.p12 \
    -password pass:mypass

    Подробнее здесь .

  • Теперь вызовите API REST как:
    1
    curl https://192.168.99.100:2376/images/json --cert $DOCKER_CERT_PATH/cert.p12 --pass mypass --key $DOCKER_CERT_PATH/key.pem --cacert $DOCKER_CERT_PATH/ca.pem

    Обратите внимание, --cert теперь указывает на сгенерированный сертификат --pass а пароль сертификата указывается sing --pass .

    Это вернет результат как:

    1
    [{"Id":"sha256:d38beda529d3274636d6cb1c9000afe4f00fbdcfa544140d6cc0f5d7f5b8434a","ParentId":"","RepoTags":["arungupta/couchbase:latest"],"RepoDigests":null,"Created":1450330075,"Size":374824677,"VirtualSize":374824677,"Labels":{}}]

    Хорошо, теперь это имеет смысл!

  • Попробуем запустить сервер Couchbase как:
    1
    2
    ~ > docker run -d -p 8091-8093:8091-8093 -p 11210:11210 arungupta/couchbase
    42d1414883affd0fbb272cb1378c2f6b5118acf3ed5cb60cbecdc42f95602e3e

    И вызовите другой API REST для просмотра более подробной информации об этом контейнере:

    1
    2
    ~ > curl https://192.168.99.100:2376/containers/json --cert $DOCKER_CERT_PATH/cert2.p12 --pass mypass --key $DOCKER_CERT_PATH/key.pem --cacert $DOCKER_CERT_PATH/ca.pem
    [{"Id":"42d1414883affd0fbb272cb1378c2f6b5118acf3ed5cb60cbecdc42f95602e3e","Names":["/admiring_pike"],"Image":"arungupta/couchbase","ImageID":"sha256:d38beda529d3274636d6cb1c9000afe4f00fbdcfa544140d6cc0f5d7f5b8434a","Command":"/entrypoint.sh /opt/couchbase/configure-cluster.sh","Created":1454850194,"Ports":[{"IP":"0.0.0.0","PrivatePort":8092,"PublicPort":8092,"Type":"tcp"},{"PrivatePort":11207,"Type":"tcp"},{"IP":"0.0.0.0","PrivatePort":11210,"PublicPort":11210,"Type":"tcp"},{"PrivatePort":18092,"Type":"tcp"},{"PrivatePort":18091,"Type":"tcp"},{"IP":"0.0.0.0","PrivatePort":8093,"PublicPort":8093,"Type":"tcp"},{"IP":"0.0.0.0","PrivatePort":8091,"PublicPort":8091,"Type":"tcp"},{"PrivatePort":11211,"Type":"tcp"}],"Labels":{},"Status":"Up 2 seconds","HostConfig":{"NetworkMode":"default"},"NetworkSettings":{"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"","EndpointID":"6feaf4c1c70feaf0ba240ce55fb58ce83ebb84c8098bef9171998e84f607fa0b","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}}}}]

Прочитайте полный API и сходите с ума сейчас!

Ссылка: Включите Docker Remote API на Docker Machine в Mac OS X от нашего партнера по JCG Аруна Гупта в блоге Miles to go 2.0… .