반응형

 

Private Registry는 개인 저장소라고도 하며 Docker hub에서 제공하는 registry 이미지를 사용 해 컨테이너에서 이미지를 로컬 저장하는 방식 입니다.  하지만 GUI 환경을 지원하지 않는데, Docker hub에 GUI로 볼 수 있는 웹이 배포되어 있습니다. 웹 설정은 가장 마지막에 다루겠습니다.

 

그리고 Pricate Registry를 다룰때엔 반드시 최소한 볼륨을 이용해 데이터를 보존 하거나, 스토리지 또는 데이터 백업등을 통하여 데이터를 관리 해야 합니다.

Private Registry는 registry 컨테이너가 삭제되면 모든 데이터가 삭제 됩니다.

 

  • 1. Docker Private Registry 환경 구축

# Docker hub 공식 저장소에서 registry 이미지 다운로드
docker image pull registry

# docker container run -d -p []:[port] --name [컨테이너명] registry
docker container run -d -p 5000:5000 --name registry registry

부팅 시 자동 시작은 --restart=always 옵션을 사용하시면 됩니다.

 

  • 2. Docker Private Registry 실행 테스트

실제로 Private Registry가 재대로 작동하는지 확인하기 위해 아래와 같이 간단한 centos+nginx 실행 코드를 Dockerfile에 넣고 빌드 해주세요. 저는 registry_nginx 라는 이미지 명으로 빌드 하였습니다.

FROM centos:7

RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo

RUN yum -y install nginx curl

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

 

이후 로컬호스트 5000번에서 작동하는 docker-nginx 이미지라는것을 좀 더 명확히 하기 위해 tag 설정을 하였습니다. (tag 설정 참고 : https://nirsa.tistory.com/49)

  • docker image tag [기존 이미지명] [사용자명]/[생성할 이미지명]
  • docker image tag registry_nginx localhost:5000/docker-nginx

 

이제 이미지를 private registry에 업로드하고, 기존에 있던 registry_nginx 와 localhost:5000/docker-nginx 이미지는 삭제 하였습니다.

  • docker image push [사용자명]/[이미지명]
  • docker image push localhost:5000/docker-nginx

 

이미지를 업로드 했고, 기존에 있던 이미지를 모두 삭제 하였으니 확인하기 위한 준비는 끝났습니다. 이제 다운로드를 해보면 정상적으로 이미지를 가져오고, 컨테이너 실행해도 nginx가 정상적으로 작동 합니다.

 

  • 3. Docker Private Registry 이미지 리스트확인

이미지 리스트는 아래와 같이 확인 가능 합니다.

  • curl -X GET http://localhost:5000/v2/_catalog

 

  • curl -X GET http://localhost:5000/v2/docker-nginx/tags/list

 

  • 4. Docker Private Registry 웹페이지 구축

docker hub에 해외 유저가 만든 Private Registry를 웹페이지로 구축한 이미지가 공유 되어 있습니다.

아래 코드를 입력 후 실행하면 정상적으로 될테지만, 현재 동작중인 container run를 입력하는 부분에서 동작중인 Private Registry 컨테이너 이름을 쓸 때 조심 해야 합니다. Priavate Registry 컨테이너가 깨질 수 있습니다.

docker pull hyper/docker-registry-web

# docker run -it -p 8080:8080 --name [hyper/registry-web 이미지가 사용할 컨테이너명] --list [현재 동작중인 registry 컨테이너명] -e REGISTRY_URL=http://[현재 동작중인 registry 컨테이너명]:[현재 동작중인 registry 포트]/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web
docker run -it -p 8080:8080 --name registry-web --link registry -e REGISTRY_URL=http://registry:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web 

 

 

반응형
반응형

 

Docker Automated Build를 이용한 Dockerfile로부터 이미지 자동 Build 입니다. (관리툴인 GitHub과 Bitbucket를 이용한 방법이 있는데, 이 글에서는 GitHub을 사용 합니다)

 

  • 1. Docker Hub Repository 생성

http://hub.docker.com 에 접속하여 로그인 후 상단의 Repositories → Create Repository 클릭 합니다.

 

Repository의 이름을 적어주고 이번 글에서는 Public으로 진행하기에 체크, Build Settings가 써있는곳에 고양이 모양이 있는것이 GitHub인데 누르고 로그인하여 연결 해줍니다.  (GitHub 계정이 없다면 생성해야 합니다.) 

연결이 완료 됬다면 Create 를 눌러서 생성 해줍니다.

Builds를 누른 후 Link to GitHub을 클릭 합니다. (위에서 연결 안했다면 연결 시켜 주세요)

 

처음엔 아래 사진에 맨 위에서 보이는 SOURCE REPOSITORY 부분만 나올텐데, 마우스로 클릭하면 GitHub에 연결할때 사용한 정보들이 나오니 모두 클릭 후 아래와 같이 해줍니다. 

 

* 가장 하단의 Build Context는 Dockerfile이 위치한 경로를 적어주시면 됩니다.

 

  • 2. Dockerfile Upload

Dockerfile이 있는 리눅스에서 아래와 같이 커맨드를 입력해 줍니다. (Dockerfile의 코드는 이미지로 빌드할 아무 코드나  미리 작성 해주세요)

* 아래 명령어가 약간 햇갈린다면 github로 로그인 했을 때 아래와 같은 코드를 작성하라는 문구가 있으니 참고하여 작성하시면 되고, 중간에 gibhub의 계정과 암호를 입력하는 부분은 github 계정 정보 그대로 입력하시면 됩니다.

echo "# 사용자명" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/[git계정명]/[사용자명].git
git push -u origin master

 

  • 3. Docker Image 빌드 확인

이제 docker image pull [docker hub 사용자명]/[생성할 이미지명] 을 입력하면 별도의 빌드 필요 없이 자동으로 이미지가 생성 됩니다.

 

* denied: requested access to the resource is denied 에러 발생시 참고 : https://nirsa.tistory.com/53

반응형
반응형

 

"unable to find [user] : no matching entries in passwd file" 에러는 Dockerfile을 build를 할 때 발생 합니다.

 

  • 발생 원인

위의 사진의 경우 빨간색으로 테두리된 사용자 계정(nirsa)이 /etc/passwd 파일에 존재하지 않음

(즉, 사용자 계정이 생성되지 않음)

(Dockerfile 에서 USER 명령을 사용하여 RUN,CMD,ENTRYPOINT 명령을 특정 사용자로 실행하려 했을 경우 발생할 수 있음)

 

  • 해결 방법

해결 방법은 비교적 간단한데, 문제가 되는 사용자 계정을 생성해주면 됩니다.

Dockerfile에서 상단에 RUN useradd nirsa 등으로 사용자 계정을 생성 후 빌드를 시도 합니다.

 

반응형
반응형

 

1편 (RUN, CMD, ENTRYPOINT) : https://nirsa.tistory.com/66?category=868315

2편 (ONBUILD, STOPSIGNAL, HEALTHCHECK) : https://nirsa.tistory.com/68?category=868315

3편 (COPY, ADD, ENV, ARG, WORKDIR) : https://nirsa.tistory.com/69?category=868315

 

  • 10. USER

USER 명령은 RUN, CMD, ENTRYPOINT와 같은 명령을 실행하기 위한 특정 사용자를 지정해야 하는 상황에서 사용 됩니다. 아래와 같이 유저명:그륩명 또는 UID:GID 와 같이 사용 되고, 그륩명과 GID는 생략이 가능 합니다.

USER <user>[:<group>]
# 또는
USER <UID>[:<GID>]

 

단, 사용 시 주의점이 있는데 USER 명령을 사용하기 위한 사용자 계정이 존재 해야 합니다. (USER 명령은 계정을 생성하는것이 아니라, 특정 사용자 계정을 사용하기 위한 명령 입니다.)

아래와 같이 useradd [사용자명] 을 미리 입력하여 계정을 생성하고, 리눅스의 id 명령어로 확인 하겠습니다.

FROM centos:7

RUN useradd nirsa
RUN id

USER nirsa
RUN id

위의 결과를 보면 Step 3 에서는 root 계정으로 실행 되었고, Step4에서 USER nirsa로 특정 사용자를 지정해준 후 Step 5에서 실행된 RUN 명령은 nirsa 계정으로 실행된것을 알 수 있습니다.

 

  • 11. LABEL

LABEL 명령은 이미지의 버전 정보, 작성자, 코멘트와 같이 이미지 상세 정보를 작성해두기 위한 명령 입니다.

아래와 같이 사용이 가능 하고 docker image inspect --format="{{ .Config.Lables }}" [이미지명] 으로 확인할 수 있습니다.

LABEL title="webserver"
LABEL version="2.0"

 

  • 12. EXPOSE

EXPOSE 명령은 해당 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기중 이라는것을 알려줍니다, 일반적으로 dockerfile을 작성하는 사람과 컨테이너를 직접 실행할 사람 사이에서 공개할 포트를 알려주기 위해 문서 유형으로 작성할 때 사용 됩니다.

이 명령 자체가 작성된 포트를 실행하여 listening 상태로 올려주거나 하지는 않기 때문에, 실제로 포트를 열기 위해선 container run 에서 -p 옵션을 사용해야 합니다. 

# EXPOSE 포트번호[/protocol]

EXPOSE 80/tcp
EXPOSE 80/udp

위와 같이 선언이 되지만 프로토콜을 지정하지 않으면 기본값은 TCP 입니다.

 

  • 13. VOLUME

컨테이너 안에 있는 데이터는 컨테이너를 삭제하면 모든 데이터가 같이 삭제(휘발성 데이터) 되기 때문에 데이터를 보존하기 위해 VOLUME을 사용 하고, VOLUME 명령은 설정한 컨테이너의 데이터를 호스트 OS에 저장하거나, 컨테이너들간의 데이터를 공유가 가능합니다. 

# Dockfile
VOLUME ["컨테이너 디렉터리1", "컨테이너 디렉터리2"]

Dockerfile 에서 위와 같이 생성한 볼륨은 호스트OS의 /var/lib/docker/volumes에 생성되며, Docker 에서 자동 생성한 hash값으로 디렉토리가 생깁니다.

 

아래 Dockerfile 을 생성하고 build 후 컨테이너를 실행하여 실제로 호스트OS와 컨테이너가 해당 디렉토리를 공유중인지 확인 하겠습니다. (컨테이너의 /data 디렉토리엔 아무런 파일도 없어서 touch volume_test 로 파일을 하나 생성해 주었습니다)

FROM centos:7
VOLUME ["/var/log/", "/data/"]

호스트OS에 Docker에서 생성한 hash값이 정상적으로 보입니다. 이 Hash값은 docker container inspect --format="{{ .Mounts }}" [컨테이너명] 에서 확인할 수 있습니다.

 

아래 이미지를 보면 호스트OS 경로 /var/lib/docker/volumes/09afae~~~ 에 /data 가 마운트 되었고, /var/lib/docker/volumes/add64501~~~ 에 /var/log가 마운트 되었다고 출력 됩니다. 

/data가 마운트 되었다는 디렉토리로 이동하여 확인하면 아까 생성한 /data/volume_test 파일이 정상적으로 보입니다.

 

해당 컨테이너를 삭제해도 아래와 같이 데이터가 보존되어 있는걸 확인할 수 있습니다.

 

container run을 이용하여 호스트 OS의 경로를 변경할 수 있습니다.

# docker run -it -v [호스트OS 경로]:[컨테이너 경로] [이미지명] /bin/bash
docker run -it -v /root/docker/log/:/var/log/ centos /bin/bash
반응형

+ Recent posts