메뉴 닫기

docker에 대하여

–docker 란

docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.

컨테이너란 설치나 실행을 좀더 쉽게 이용하기위해 필요한 온갖 정보와 자료를 한군데(플랫폼)에 모아둔것을 의미합니다.

따라서 도커의 컨테이너 기술은 플랫폼에서 운영할 애플리케이션을 얼마나 효율적으로 운영할수 있는가…인거죠.

LXC(LinuX Containers)로 만든 컨테이너는 고유의 파일시스템, 프로세스, 네트워크 공간을 가집니다. 

마치 가상머신처럼 독립적이고 격리된 공간인거죠. 컨테이너는 호스트의 커널을 공유하는 가상공간입니다.

그러다보니 별도로 각종 장치를위한 드라이버가 필요없습니다. 이때문에 가상머신이 아닌 컨테이너로 불립니다.

 

–docker 특징

오픈 소스 컨테이너 가 상화 플랫폼입니다.
– 기존 가 상화 플랫폼 처럼 개별 머신을 가 상화 한 구조 가 아닌 LXC 기반의 가 상화 플랫폼입니다.
– LXC 는 리눅스 컨테이너 기술로 격리를 통해 별도의 운영체제 처럼 이용이 가 능합니다.
– 호스트 OS 의 커널을 공유하며, 하이퍼바이저 기반의 가 상화 대비 자원의 대한 손실 이 없습니다.
– 기존 가 상화 플랫폼 보다 가 볍고, 이식성이 뛰어 납니다.
– 서비스가 해킹되더라도 격리되어있어 원래의 서버에 영향을 미치지 않는 구조입니다.

(docker와 하이퍼바이저 비교그림)

출처 : http://ssola22.tistory.com/12

 

–docker 설치방법

설치 환경

# cat /etc/redhat-release
CentOS release 6.9 (Final)

 

1) EPEL 설치

# rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

설치후  yum update -y 를 통해 최신화 시켜줍니다.

 

2) Docker 설치

docker를 설치해줍니다.

# yum -y install docker-io

 

설치된 docker를 실행시켜봅니다.

service docker start, service docker start 으로 시작을 할수있습니다.

# service docker start

Starting cgconfig service:                                 [  OK  ]

Starting docker:                                                  [  OK  ]

 

3) ubuntu OS설치 및 nginx 설치

ubunut 이미지 확인

# docker search ubuntu

docker는 docker hub 를 통해 이미지를 공유하도록 구축 되어있습니다. search 명령어로 이미지를 찾아볼수가있습니다.

ubuntu 이미지 다운받기

# docker pull ubuntu:latest

위와같은 명령어로 ubuntu  다운받습니다.

뒷부분의 latest 명령어로 최신버전을 가져옵니다.

다운받은 이미지 확인

# docker images

다운받은 이미지 실행

# docker run -i -t –name smile ubuntu /bin/bash

실행중인 이미지 확인

# docker ps -a

현재 실행중이였던 이미지가 보입니다.(현재는 중지된 상태)

NAMES 란에 있는 명칭과 CONTAINER ID 의 명칭으로 실행시킬수있습니다.

STATUS 를 확인해보면 실행되었을때와 실행이안되었을때가 구분이 갈것입니다.

위와같은 명령어로 구동중인 ubuntu 에서 명령어를 통해 구동이되는지 여부를 알수있습니다.

nginx 이미지 생성하기

# vi /root/example/Dockerfile 을 생성하여 아래의 내용을 기입합니다.

# vi /root/example/Dockerfile

FROM ubuntu:14.04
MAINTAINER Foo Bar <foo@bar.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

위내용은 우분투 14.04기반으로 nginx를 설치한 이미지를 생성하는 예제입니다.

위파일이 생성되었다면 아래의 명령어로 이미지를 생성합니다.

# docker build –tag smile:0.1 .  (파일이 위치한 경로에서 실행)

또는

# docker build –tag smile:0.1 /root/example/

 

해당명령어는 위파일을 생성한곳에서 명령어를 실행합니다.

정상적으로 구동되었다면 smile 이라는 구문으로 이미지가 생성된것이 보일것입니다.

# docker run –name smile-nginx -d -p 80:80 -v /root/data:/data smile:0.1

위와같이 nginx 가 구동되는것을 확인할수있습니다.

실제로 웹페이지에서 확인시 nginx가 구동되는점을 확인할수있습니다.

–docker 기본 인증 사용하기

docker 레지스트에는 로그인 기능이없습니다. 그리하여 nginx의 기본인증을 이용하여야합니다.

# vi /etc/hosts

hosts파일을 열어서 아래와같이 수정해줍니다.

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
<레지스트리 서버 IP 주소> registry.smile.com

레지스트 주소를 registry.smile.com으로 설정합니다. 

이제 SSL 사설 인증서(Self Signed)를 생성하겠습니다. 

다음 명령을 입력하여 개인 키 파일을 생성합니다.

# openssl genrsa -out server.key 2048

인증서 서명 요청(Certificate signing request) 파일을 생성합니다.

# openssl req -new -key server.key -out server.csr
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]:<Enter>
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:smile
Organizational Unit Name (eg, section) []:smile
Common Name (e.g. server FQDN or YOUR name) []:registry.smile.com
Email Address []:smileuser@smile.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:<Enter>
An optional company name []:<Enter>

서버 인증서 파일을 생성합니다.

# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

이제 server.crt 인증서 파일을 시스템에 설치를 해주어야 합니다. (Centos 기준)

# cp server.crt /etc/pki/ca-trust/source/anchors/
# update-ca-trust enable
# update-ca-trust extract

/etc/hosts에 도메인을 추가하고, 인증서 파일을 설치했으면 Docker 서비스를 재시작합니다. Docker 서비스를 재시작해야 추가된 도메인과 설치된 인증서가 적용됩니다.

# service docker restart

Docker 레지스트리에 접속할 다른 시스템에도 server.crt 인증서 파일을 복사하여 같은 방식으로 설치를 하고 Docker 서비스를 재시작합니다. 

이제 사용자 계정과 비밀번호를 저장할 .htpasswd 파일을 생성해야 합니다. 먼저 다음 패키지를 설치합니다.

# yum install httpd-tools

htpasswd 명령으로 .htpasswd 파일을 생성하고 smileuser라는 예제 사용자를 추가합니다. 비밀번호 입력 부분에는 사용할 비빌번호를 입력합니다.

# htpasswd -c .htpasswd smileuser
New password:<패스워드 입력>
Re-type new password:<패스워드 입력>
Adding password for user smileuser

Nginx 이미지를 따로 생성하지 않고 공식 이미지를 그대로 사용하겠습니다. 다음 내용을 nginx.conf 파일로 저장합니다.

nginx.conf

worker_processes 1;

events {
worker_connections 1024;
}

http {
       server {
               listen 443;
               server_name registry.smile.com;

               ssl on;
               ssl_certificate /etc/server.crt;
               ssl_certificate_key /etc/server.key;

              proxy_set_header Host $http_host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header Authorization “”;

             client_max_body_size 0;

             chunked_transfer_encoding on;

             location / {
             proxy_pass http://docker-registry:5000;
             proxy_set_header Host $host;
             proxy_read_timeout 900;

            auth_basic “Restricted”;
            auth_basic_user_file .htpasswd;
            }
      }
}

다음 명령을 실행하여 Docker 레지스트리 컨테이너를 먼저 생성합니다. 컨테이너의 이름은 nginx.conf 파일에서 설정한 대로 docker-registry로 지정합니다.

# docker run -d –name docker-registry \
       -v /tmp/registry:/tmp/registry \
       registry:0.8.1

Nginx 공식 이미지 1.7.5 버전으로 컨테이너를 생성하고 docker-registry 컨테이너와 연결합니다.

# docker run -d –name nginx-registry \
     -v ~/nginx.conf:/etc/nginx/nginx.conf \
     -v ~/.htpasswd:/etc/nginx/.htpasswd \
     -v ~/server.key:/etc/server.key \
     -v ~/server.crt:/etc/server.crt \
     –link docker-registry:docker-registry \
     -p 443:443 \
     nginx:1.7.5

docker login 명령으로 https://registry.smile.com에 로그인합니다. Username과 Password에는 htpasswd 명령으로 생성한 사용자와 비밀번호를 입력합니다. 이메일은 입력하지 않아도 됩니다.

# docker login https://registry.smile.com
Username: smileuser
Password: <비밀번호 입력>
Email:
Login Succeeded

docker login <Docker 레지스트리 URL> 형식입니다.

 

docker 로그인시 다음과같은 error가 발생될수도 있습니다.

Error response from daemon: Get https://registry.smile.com/v2/: dial tcp xxx.xxx.xxx.xxx:443: getsockopt: connection refused

원인은 현재 Private Docker Registry 가 자꾸 다른버전으로 접속 시도를 하는 것입니다.

해결 방안

docker toolbox가 설치되어있다면 docker machine을 이용하여 간단하게 작업이 가능합니다.
위 문제점에서 해결해야할 방안은 boot2docker.iso 파일 버전을 맞춰 주는 겁니다.

docker -v 명령어와 docker info 를 통해 docker server version 을 확인하여 버전이 다른부분을 확인하였습니다.

버전에맞는 boot2docker를 다운받은뒤 

docker-machine을 멈추고 

# docker-machine stop

default 이미지의 위치를 확인후 덮어씌워줍니다.

이제 다시 로그인 시도를 해보면 정상적으로 로그인되는점을 확인할 수 있습니다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x