Amazon Web Services에서 Docker 사용하기

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

Docker Hub 개인 저장소 이미지 사용하기

이번에는 Docker Hub의 개인 저장소에 저장된 이미지를 사용하는 방법입니다. Docker Hub 가입과 개인 저장소 생성 방법은 ‘13장 Docker Hub 사용하기’, ‘13.3 Docker Hub 개인 저장소 생성하기’를 참조하기 바랍니다.

먼저 docker login 명령으로 Docker Hub에 로그인합니다. 지금부터 Docker Hub 사용자 계정은 exampleuser, 이메일 주소는 exampleuser@example.com이라 가정하겠습니다.

~$ sudo docker login
Username: exampleuser
Password:
Email: exampleuser@example.com
Login Succeeded

이렇게 로그인을 하면 현재 리눅스 계정의 홈 디렉터리(/home/<사용자 계정>)에 .dockercfg라는 파일이 생성됩니다.

~/.dockercfg

{"https://index.docker.io/v1/":{"auth":"ZKhabXBsTXWzZXL4dnRnOTU2M12=","email":"exampleuser@example.com"}}

.dockercfg 파일의 내용을 보면 인증키와 이메일 주소가 저장되어 있습니다.

이제 AWS에서 S3 버킷을 생성합니다. S3 페이지에서 위쪽 Create Bucket 버튼을 클릭합니다.


그림 10-19 S3 버킷 목록에서 버킷 생성

그림 10-20과 같이 버킷을 생성합니다.

  • Bucket Name: 생성할 버킷의 이름입니다. 이 이름은 모든 S3 리전 중에서 유일해야 합니다. S3에 접근할 수 있는 URL이 주어지기 때문입니다(examplebucket10은 이 책을 쓰는 시점에 제가 이미 사용하고 있으므로 같은 이름을 사용할 수 없습니다. 그림 10-20과는 다른 이름을 설정합니다.
  • Region: 버킷은 리전별로 생성됩니다. Tokyo를 선택합니다.

설정이 완료되었으면 Create 버튼을 클릭합니다. 설정한 버킷이 이미 사용되고 있다면 다른 이름을 입력합니다.


그림 10-20 S3 버킷 생성

생성된 버킷을 클릭합니다.


그림 10-21 S3 버킷 생성 완료

위쪽 Upload 버튼을 클릭합니다.


그림 10-22 S3 객체 목록

Add Files 버튼을 클릭합니다(Drag and drop files and folders to upload here 부분에 파일을 드래그 & 드롭으로 옮겨도 됩니다).


그림 10-23 S3 버킷에 파일 올리기

파일 열기 창이 표시됩니다. 저는 SFTP 클라이언트를 사용하여 Docker가 설치된 리눅스 서버에서 Windows 컴퓨터로 .dockercfg 파일을 가져왔습니다. 파일을 가져오지 않고 리눅스 서버에서 S3 버킷에 직접 파일을 올려도 됩니다.


그림 10-24 S3 버킷에 올릴 .dockercfg. 파일 선택

SFTP 클라이언트로 파일 가져오기
Windows에서는 WinSCP(http://www.winscp.net)를 사용하면 편리합니다. 사용 방법은 일반 FTP 프로그램과 동일하므로 따로 설명하지 않겠습니다.

Mac OS X에서는 터미널에서 sftp 명령을 실행하여 파일을 가져옵니다. 예를 들어 리눅스 사용자 계정은 exampleuser, 리눅스 서버의 IP 주소는 192.168.0.10이라고 하면 다음과 같습니다.

$ sftp exampleuser@192.168.0.10
exampleuser@192.168.0.10’s password: <비밀번호 입력>
Connected to 192.168.0.10.
sftp> get .dockercfg
Fetching /home/exampleuser/.dockercfg to .dockercfg     100%   99     0.1KB/s   00:00
/home/exampleuser/.dockdrcfg

만약 sudo docker login처럼 명령을 root 권한으로 실행했다면 .dockercfg 파일도 소유자와 그룹이 root일 것입니다. 이렇게 되면 일반 사용자 계정으로 파일을 복사할 수 없습니다. 따라서 Docker가 설치된 리눅스 서버에서 다음 명령을 입력하여 소유자와 그룹을 현재 사용자 계정으로 바꿉니다.

$ sudo chown $USER.$USER .dockercfg

.dockercfg 파일이 업로드 대기 목록에 추가되었습니다. Start Upload 버튼을 클릭합니다.


그림 10-25 S3 버킷 파일 업로드 대기 목록

S3 버킷에 파일이 업로드되었습니다.


그림 10-26 S3 객체 목록

이제 AWS IAM 페이지로 이동합니다. 그리고 왼쪽 메뉴에서 Roles를 클릭한 뒤 aws-elasticbeanstalk-ec2-role을 클릭합니다. 앞에서 Elastic Beanstalk 환경과 애플리케이션을 생성했다면 aws-elasticbeanstalk-ec2-role이 있을 것입니다.


그림 10-27 IAM 역할 목록

aws-elasticbeanstalk-ec2-role의 세부 설정 페이지로 이동했습니다. Attach Role Policy 버튼을 클릭합니다.


그림 10-28 IAM 역할 세부 설정

Select Policy Template에서 Amazon S3 Read Only Access의 Select 버튼을 클릭합니다. 이 권한이 있어야 Elastic Beanstalk에서 S3 버킷에 저장된 .dockercfg 파일을 읽을 수 있습니다.


그림 10-29 IAM 역할 권한 설정

S3 읽기 설정이 된 Policy Document가 출력됩니다. Apply Policy 버튼을 클릭합니다.


그림 10-30 IAM 역할에 S3 읽기 권한 추가

aws-elasticbeanstalk-ec2-role에 S3 읽기 권한이 추가되었습니다.


그림 10-31 IAM 역할에 S3 읽기 권한 추가 완료

이제 ‘13.3 Docker Hub 개인 저장소 생성하기’를 참조하여 example-private 이름으로 개인 저장소를 생성합니다. 그리고 저장소를 생성하였으면 Dockerfile로 이미지를 생성한 뒤 Docker Hub 개인 저장소에 이미지를 올려야 합니다. 먼저 example-private 디렉터리를 생성하고, Dockerfile을 작성합니다. 지금까지 계속 사용해왔던 Nginx 예제입니다.

~$ mkdir example-private
~$ cd example-private

~/example-private/Dockerfile

FROM ubuntu:14.04
MAINTAINER Foo Bar <exampleuser@example.com>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]

WORKDIR /etc/nginx

CMD ["nginx"]

EXPOSE 80
EXPOSE 443

docker build 명령으로 이미지를 생성합니다.

~/example-private$ sudo docker build --tag exampleuser/example-private:0.1 .

Docker Hub에 이미지를 올리려면 이미지 이름을 <Docker Hub 사용자 계정>/<이미지 이름>:<태그> 형식으로 생성해야 합니다.

개인 저장소를 example-private로 생성했으므로 다음 같이 docker push 명령으로 이미지를 올립니다.

~/example-private$ sudo docker push exampleuser/example-private:0.1

이미지를 올렸으면 다음 내용으로 Dockerrun.aws.json 파일을 작성합니다.

Dockerrun.aws.json

{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "examplebucket10",
    "Key": ".dockercfg"
  },
  "Image": {
    "Name": "exampleuser/example-private:0.1",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "80"
    }
  ]
}
  • AWSEBDockerrunVersion: Dockerrun 버전 값입니다. 1을 설정합니다.
  • Authentication: 인증 설정입니다.
    • Bucket: .dockercfg 파일이 저장된 S3 버킷 이름입니다. 반드시 여러분이 생성한 S3 버킷 이름을 설정해야 합니다.
    • Key: 인증 파일 이름입니다. .dockercfg를 설정합니다.
  • Image: 이미지 설정입니다.
    • Name: Docker 이미지 이름이며 <Docker Hub 사용자 계정>/<이미지 이름>:<태그> 형식입니다. 앞에서 이미지를 생성한대로 exampleuser/example-private:0.1로 설정합니다.
    • Update를 true로 설정하면 매번 이미지를 새로 받습니다.
  • Ports: Elastic Beanstalk의 EC2 인스턴스와 연결할 컨테이너의 포트 번호를 설정합니다.

Elastic Beanstalk 환경 페이지에서 Upload and Deploy 버튼을 클릭하고, Dockerrun.aws.json 파일을 그대로 업로드하면 Docker 컨테이너가 생성됩니다.


그림 10-32 Elastic Beanstalk에서 개인 저장소 이미지로 생성한 컨테이너에 접속


저작권 안내

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

Published

30 November 2014