Docker Remote API 사용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

Docker Remote API Python 라이브러리로 HTTPS 통신하기

기본적으로 Docker 데몬은 ID와 패스워드를 이용한 로그인 기능이 없습니다. 그래서 Docker는 인증서를 이용한 HTTPS 통신을 제공합니다. 클라이언트 측에서는 인증서를 가지고 있어야 서버와 통신할 수 있습니다.

인증서 생성하기

OpenSSL을 사용하여 서버 인증서와 클라이언트 인증서를 생성합니다.

먼저 /etc/hosts 파일을 편집하여 테스트용 도메인을 추가합니다. 이 파일은 root 권한으로 수정해야 합니다.

/etc/hosts

127.0.0.1       localhost
127.0.1.1       ubuntu
127.0.0.1       docker.example.com

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

127.0.0.1docker.example.com으로 설정합니다. 실제로 구입한 도메인을 사용해도 되고, 구입하지 않았더라도 사용할 수 있습니다. 이 책에서는 docker.example.com을 기준으로 설명하겠습니다.

인증서 파일을 생성할 차례입니다. 다음 명령들은 dockerbook/Chapter14/cert.sh 파일에 /Chapter14/cert.sh정리해놓았습니다. cert.sh 파일을 그대로 실행해도 됩니다. 단 비밀번호는 직접 입력해야 합니다.

CA(Certificate Authority) 인증서 파일을 생성합니다. 비밀번호 설정 부분이 나오면 사용할 비밀번호를 입력합니다. 그리고 ca.pem 파일을 생성할 때는 ca-key.pem 파일에 설정한 비밀번호를 입력합니다.

  • Country Name: 국가 코드입니다. KO를 입력합니다.
  • State or Province Name: 주 또는 도입니다. 자신의 상황에 맞게 입력합니다.
  • Locality Name: 도시입니다. 자신의 상황에 맞게 입력합니다.
  • Organization Name: 회사 이름을 입력합니다.
  • Organizational Unit Name: 조직 이름을 입력합니다.
  • Common Name: Docker 데몬을 실행하는 서버의 도메인입니다. 이 부분을 정확하게 입력하지 않으면 인증서를 생성해도 정상적으로 접속할 수 없습니다. /etc/hosts 파일에 설정한대로 docker.example.com를 입력합니다.
  • Email Address: 이메일 주소입니다.
$ echo 01 > ca.srl
$ openssl genrsa -des3 -out ca-key.pem 2048
Generating RSA private key, 2048 bit long modulus
...............................................................................+++
..................+++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:<사용할 비밀번호 입력>
Verifying - Enter pass phrase for ca-key.pem:<사용할 비밀번호 입력>
$ openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem
Enter pass phrase for ca-key.pem:<ca-key.pem의 비밀번호 입력>
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KO
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Company
Organizational Unit Name (eg, section) []:Example Company
Common Name (e.g. server FQDN or YOUR name) []:docker.example.com
Email Address []:exampleuser@example.com

서버 키, 인증서 서명 요청(Certificate signing request) 파일을 생성합니다. 비밀번호 설정 부분이 나오면 사용할 비밀번호를 입력합니다. 그리고 server.csr 파일을 생성할 때는 server-key.pem 파일에 설정한 비밀번호를 입력합니다.

  • ‘/CN=docker.example.com’ 부분은 반드시 앞에서 Common Name에 설정한 도메인을 입력합니다.
$ openssl genrsa -des3 -out server-key.pem 2048
Generating RSA private key, 2048 bit long modulus
...............................................+++
..............+++
e is 65537 (0x10001)
Enter pass phrase for server-key.pem:<사용할 비밀번호 입력>
Verifying - Enter pass phrase for server-key.pem:<사용할 비밀번호 입력>
$ openssl req -subj '/CN=docker.example.com' -new -key server-key.pem \
-out server.csr
Enter pass phrase for server-key.pem:<server-key.pem의 비밀번호 입력>

서버 인증서 파일을 생성합니다. 비밀번호 입력 부분에는 ca-key.pem 파일에 설정한 비밀번호를 입력합니다.

$ openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -out server-cert.pem
Signature ok
subject=/CN=docker.example.com
Getting CA Private Key
Enter pass phrase for ca-key.pem:<ca-key.pem의 비밀번호 입력>

 

 

 

 

 

클라이언트 키, 인증서 서명 요청 파일을 생성합니다. 비밀번호 설정 부분이 나오면 사용할 비밀번호를 입력합니다. 그리고 client.csr 파일을 생성할 때는 key.pem 파일에 설정한 비밀번호를 입력합니다.

$ openssl genrsa -des3 -out key.pem 2048
Generating RSA private key, 2048 bit long modulus
................................................................................+++
.................................................................+++
e is 65537 (0x10001)
Enter pass phrase for key.pem:<사용할 비밀번호 입력>
Verifying - Enter pass phrase for key.pem:<사용할 비밀번호 입력>
$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr
Enter pass phrase for key.pem:<key.pem의 비밀번호 입력>

인증서 파일을 사용하여 접속을 허용하도록 설정 파일을 생성하고, 클라이언트 인증서 파일을 생성합니다. 비밀번호 입력 부분에는 ca-key.pem 파일에 설정한 비밀번호를 입력합니다.

$ echo extendedKeyUsage = clientAuth > extfile.cnf
$ openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem \
    -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:<ca-key.pem의 비밀번호 입력>

서버용 server-key.pem 파일, 클라이언트용 key.pem 파일의 비밀번호를 제거합니다. 비밀번호 입력 부분이 나오면 기존에 설정한 비밀번호를 입력합니다.

$ openssl rsa -in server-key.pem -out server-key.pem
Enter pass phrase for server-key.pem:<server-key.pem의 비밀번호 입력>
writing RSA key
$ openssl rsa -in key.pem -out key.pem
Enter pass phrase for key.pem:<key.pem의 비밀번호 입력>
writing RSA key

인증서 생성이 끝났습니다. 이제 인증서를 이용하여 Docker 데몬을 실행합니다.

$ sudo service docker stop
$ sudo docker -d --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem \
    --tlskey=server-key.pem -H tcp://0.0.0.0:2376
  • -d: Docker를 데몬으로 실행합니다.
  • --tlsverify: 인증서로 접속을 제어합니다.
  • --tlscacert: 앞에서 생성한 ca.pem 파일을 설정합니다.
  • --tlscert: 앞에서 생성한 server-cert.pem 파일을 설정합니다.
  • --tlskey: 앞에서 생성한 server-key.pem 파일을 설정합니다.
  • -H: 접속을 받을 IP 주소와 포트 번호입니다. tcp://0.0.0.0:2376를 설정합니다. 인증서를 이용한 데몬의 기본 포트 번호는 2376입니다.

명령을 실행하면 Docker 데몬이 foreground로 실행됩니다. 따라서 테스트를 위해 새 터미널을 실행합니다.

현재 리눅스 계정의 홈 디렉터리(/home/<사용자 계정>)에 .docker 디렉터리를 생성하고, 그 아래에 ca.pem, cert.pem, key.pem 파일을 복사합니다.

$ mkdir ~/.docker
$ cp ca.pem ~/.docker/ca.pem
$ cp cert.pem ~/.docker/cert.pem
$ cp key.pem ~/.docker/key.pem

다른 컴퓨터에서 Docker 데몬에 접속하려면 .docker 디렉터리만 복사해서 사용하면 됩니다.

이제 Docker 데몬에 접속하여 명령을 실행해보겠습니다.

$ sudo docker --tlsverify -H docker.example.com:2376 info
Containers: 1
Images: 3
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 5
Execution Driver: native-0.2
Kernel Version: 3.13.0-24-generic
Operating System: Ubuntu 14.04 LTS
WARNING: No swap limit support

docker --tlsverify -H <Docker 데몬 도메인>:2376 형식입니다. -H 옵션에는 앞에서 인증서를 생성할 때 입력했던 도메인을 설정합니다. 이 도메인이 맞지 않으면 Docker 명령을 실행할 수 없습니다. 또한, .docker 디렉터리에 인증서 파일이 없거나 맞지 않으면 Docker 명령을 실행할 수 없습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014