[Docker] Private Docker Registry
1. Local Private Docker Registry
1) 로컬 환경 Docker Registry 구축
도커의 공식 레지스트리인 Docker Hub에는 Ubuntu나 CentOS 같은 Linux 배포판의 기본 기능을 제공하는 공식 베이스 이미지나 여러 뜻있는 사람들이 작성한 다양한 용도의 이미지가 많이 배포되어있다. 이러한 도커 레지스트리를 프라이빗 네트워크에서 구축하기 위해서는 Docker Store에 공개되어 있는 공식 이미지인 'registry'를 사용한다. (hub.docker.com/_/registry)
레지스트리 버전 0은 Python, 2는 Go 언어로 구축되어 있으며 특별한 요구사항이 없을 경우 버전 2계열을 권장한다. 이 'registry'이미지를 이용하여 프라이빗 네트워크 환경에 도커 레지스트리를 구축할 수 있다.
// 도커 레지스트리 검색
docker search registry
// registry 이미지 다운로드
docker image pull registry
// registry 이미지 확인
docker image ls
// registry 이미지 컨테이너 시작
docker container run -d -p 5000:5000 --name registry registry
// registry 컨테이너 확인
docker container ls
2) 도커 이미지 생성 및 빌드
설정파일들은 매번 작성하기 번거롭기 때문에 srcs 폴더에 따로 저장하여 관리하도록 한다. 로컬에서 사전에 준비해야하는 파일은 총 6개이다.
- 동작 확인을 위한 파일 : phpinfo.php
- sql 일괄처리 파일 : test.sql
- 모든 명령을 처리할 쉘스크립트 : test.sh
- Dockerfile : DockerfileTest
nginx 설정파일의 경우, 사전에 만든 컨테이너에서 srcs 폴더에 복사하여 수정해준다.
- 사전에 만든 컨테이너 Dockerfile
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y nginx
WORKDIR /etc/nginx
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80
- 컨테이너에서 nginx 설정 파일을 호스트로 이동
// 컨테이너에서 호스트로
docker cp [컨테이너명]:/etc/nginx/site-available/default /srcs/nginx
// 호스트에서 컨테이너로
docker cp /srcs/nginx [컨테이너명]:/etc/nginx/site-available
- phpinfo.php
<?php phpinfo(); ?>
- test.sql
CREATE DATABASE IF EXISTS TEST;
DROP TABLE IF EXISTS User;
CREATE TABLE User (
id VARCHAR(20) NOT NULL UNIQUE COMMENT "id",
pass VARCHAR(20) NOT NULL COMMENT "password",
name VARCHAR(20) NOT NULL COMMENT "name",
sex CHAR(1) NULL COMMENT "sex",
tel VARCHAR(20) NULL DEFAULT "010-0000-0000" COMMENT "phone",
address VARCHAR(90) NULL COMMENT "address"
);
INSERT INTO User VALUES ('id','pass','name','M','010-1111-1111','address');
- test.sh
#!/bin/bash
# 파일 이동
mv /tmp/phpinfo.php /var/www/html
mv /tmp/test.php /var/www/html
mv /tmp/test.sql /var/www/html
# mysql
service mysql start
mysql -u root --skip-password < /var/www/html/test.sql
echo "CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';" | mysql -u root --skip-password
echo "GRANT ALL PRIVILEGES ON TEST.* TO 'test'@'localhost' IDENTIFIED BY 'test';" | mysql -u root --skip-password
echo "FLUSH PRIVILEGES;"
# 권한 설정
chown -R 775 /var/www/html
# 방화벽 허용
ufw allow 'Nginx HTTP'
# 서비스 시작
service php7.4-fpm start
service nginx start
service mysql restart
bash
- default
listen 8080 default_server;
listen [::]:8080 default_server;
...
index index.html index.htm index.nginx-debian.html index.php;
...
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
- DockerfileTest
# 베이스 이미지
FROM ubuntu:latest
# 사용자 지정
LABEL maintainer "ozofweird<ozofweird@gmail.com>"
LABEL title="dockertest"
LABEL version="1.0"
LABEL description="dockertest"
# 타임존 설정
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 명령 실행
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get install -y vim
RUN apt-get install -y nginx
RUN apt-get install -y mariadb-server
RUN apt-get install -y php-fpm && apt-get install -y php-mysql
# 포트 지정
EXPOSE 8080
# 작업 디렉토리 지정
# WORKDIR /etc/nginx
# 호스트 파일 복사
COPY /srcs/nginx/default ./etc/nginx/sites-available
COPY /srcs/phpinfo.php ./tmp
COPY /srcs/test.php ./tmp
COPY /srcs/test.sql ./tmp
COPY /srcs/test.sh ./tmp
# 쉘 스크립트 실행
CMD bash /tmp/test.sh
- 실행 (srcs의 상위 폴더에서 빌드)
docker build -t test:0.0 -f srcs/DockerfileTest .
※ 한글을 사용하기 위해서는 mariadb 별도의 설정 파일 수정 필요하다.
3) 도커 이미지 업로드
로컬의 이미지를 localhost:5000에 동작하는 레지스트리에 특정 이름으로 업로드할 경우 태그를 설정하면된다.
docker image tag [로컬 이미지명] [업로드할 레지스트리 주소:포트]/[이미지명]
docker image tag test:0.0 localhost:5000/regtest
이 후 'push/rm'명령으로 프라이빗 레지스트리에 업로드/삭제할 수 있다.
docker image push [업로드할 레지스트리 주소:포트]/[이미지명]
docker image push localhost:5000/regtest
docker image rm [업로드할 레지스트리 주소:포트]/[이미지명]
docker image rm localhost:5000/regtest
4) 도커 이미지 다운로드
프라이빗 레지스트리상에 있는 이미지를 로컬환경으로 다운로드하기 위해서는 'pull' 명령을 수행한다.
docker image pull [업로드할 레지스트리 주소:포트]/[이미지명]
2. Cloud Private Docker Registry
1) Google Container Registry
도커 이미지는 인프라 구성 요소, 개발 환경, 실행 모듈 등을 포함하기에 용량이 크다. 따라서 개발용 클라이언트 PC나 온프레미스 환경에서 관리하기에 비용과 시간이 많이 소비된다. 하지만 Google Container Registry를 사용하면 독자적으로 이미지를 관리할 수 있다. 이를 사용하기 위해서는 API 사용을 허가해야한다.
2) 도커 이미지 업로드/다운로드
// 태그 설정
docker image tag [로컬 이미지명] [구글 컨테이너 레지스트리 호스트명]/[프로젝트ID]/[이미지명]
docker image tag test:0.0 asia.gcr.io/project-docker/regtest
// 업로드
gcloud docker -- push [구글 컨테이너 레지스트리 호스트명]/[프로젝트ID]/[이미지명]
gcloud docker -- push asia.gcr.io/project-docker/regtest
// 다운로드
gcloud docker -- pull [구글 컨테이너 레지스트리 호스트명]/[프로젝트ID]/[이미지명]
gcloud docker -- pull asia.gcr.io/project-docker/regtest
※ 라즈베리 파이에도 도커 이미지를 통해 동작시킬 수 있다.
[참고] 완벽한 IT 인프라 구축을 위한 Docker (2판)