wonder
정보보안 스터디 - 10주차 5일 - Docker 레지스트리 본문
docker를 사용하는 가장 큰이유는 과정 단축입니다.
centos의 필요한 디렉토리와 파일만 설치하는 것도 장점이지만
컨테이너 안의 설치할내용(apt-get install nginx python), 설정내용(conf) 등 과정도 만만치 않기 때문에
과정을 단축하여 이미지를 만들고 공유하면 개발자들은 과정 단축이 됩니다.
☞ 원본 이미지 위에 원하는 과정을 추가해서 이미지빌드, 구동하는 방법
1. Dockerfile 사용
첫번째로는 Dockerfile로 하는 방법이 있습니다.
가장 많이 사용하는 방법입니다.
vi Dockerfile2
FROM centos:centos7 RUN apt-get update && apt-get -y upgrade RUN apt-get install nginx COPY ./public-html/ /usr/local/apache2/htdocs/ ONBUILD ADD test.tar /var/www/html CMD ["nginx", "-g", "daemon off;"] |
FROM은 도커 허브에서 파일을 다운받아옵니다. |
RUN은 apt-get install 설치 또는 명령어를 실행시킵니다. 이미지 빌드할 때 실행됩니다. RUN은 여러번 사용가능합니다. |
그에 반해 ENTRYPOINT와 CMD는 이미지를 구동시킬 때 실행됩니다. ENTRYPOINT는 고정입니다. CMD는 인자를 변경시킬 수 있습니다. 한번만 사용 가능합니다. 예를 들어서 top 명령어의 경우 top -d 10 이라면 고정된 프로세스페이지가 10초마다 한번씩 갱신이 됩니다. ENTRYPOINT ["top"] CMD ["-d", "10"] 이라고 한다면 toptest이미지 구동을 시킬 때 entrypoint는 10초가 고정되어 변경이 불가능하지만 CMD의 경우 docker container run toptest -d 4 으로 변경이 가능합니다. |
ONBUILD는 dockerfile을 사용해서 빌드할 때는 작동하지 않지만 이 이미지를 사용해서 다음 이미지를 빌드할 때는 작동합니다. |
COPY로도 단순복사 작업이며 ADD은 압축을 풀 수 있고, 외부링크에서 파일을 가져와서 옮길 수 있습니다. |
EXPOSE 80/udp 포트를 사용하겠다고 알립니다. 80번의 기본값은 tcp입니다. |
USER 유저에 접속합니다. 예를 들어 RUN useradd user1 RUN ["whoami"] 만 했다면 root가 뜨겠지만 USER user1 RUN ["whoami"] 은 user1에 접속합니다. |
WORKDIR /first WORKDIR second = cd /first/second 리눅스상에서 cd라고 생각하면 쉽습니다. 경로로 이동해서 활동을 합니다. |
docker build -t build1 . -f Dockerfile2
현재 디렉토리를 지정해주고 기본파일인 Dockerfile과 이름이 다르다면 -f로 파일이름을 지정해줍니다.
명령어 실행 방법은 3가지로 나뉩니다.
쉘 형식
CMD nginx -g 'daemon off;'
exec 형식
CMD ["nginx", "-g", "daemon off;"]
json배열로 지정 합니다.
entrypoint 형식
ENTRYPOINT nginx -g 'daemon off;'
ENTRYPOINT ["nginx", "-g", "daemon off;"]
2. 압축파일 사용
다른 방법으로는 아카이빙 압축파일을 사용해서 이미지 빌드를 해도 됩니다.
tar cbvf Docker.tar.bz Dockerfile file1 도커 파일 설정과 추가할 파일을 포함해서 tar압축합니다. |
tar tvf Docker.tar.bz |
docker build -t build2 - < Docker.tar.bz |
3. 볼륨 연결
실행할 때 볼륨으로 연결해서 사용해도 파일 공유가 되기 때문에 가능합니다.
mkdir /test && touch /test/file1 |
docker run --name build3 -v /test:/usr/~ centos |
docker exec -it build3 cat /usr/~ 로 명령어 또는 쉘을 실행하여 확인합니다. |
"$PWD" 로 볼륨할 경우 루트 디렉토리입니다.
☞ multistage 배포환경
컨테이너를 만들어 개발 환경에서 개발을 하고
남은 도구들(php, java, 컴파일러 등)이 남아있다면 개발된 애플리케이션을 포함하기 때문에 용량이 쓸데없이 클 것입니다.
그렇다고 일일이 남아있는 도구를 찾아서 삭제한다면 그것 또한 시간을 잡아먹는 될 것이구요.
그렇기 때문에 애초에 컨테이너를 두군데 만들어 multistage를 만드는 것입니다.
도구 전용인 개발환경, 깔끔하게 배포할 수 있는 환경인 배포환경을 구분합니다.
multistage일 경우 Dockerfile
(singlestage 일경우) (+) |
FROM busybox WORKDIR /opt/greet/bin |
COPY --from=builder /go/src/github.com/test/hello/ . 개발 환경의 결과물(hello)을 프로덕션 환경으로 복사 |
ENTRYPOINT ["./hello"] |
docker images로 이미지를 비교했을 때
용량이 매우 작아진 것을 확인할 수 있습니다.
☞ 레지스트리 저장소 구축
일반적으로 docker 허브를 기본적으로 많이 쓰지만 일반적으로 웹에 올려놓은 정보에 대해서 보안에 취약 할 수 있으니
따로 외부 저장소에 저장해두고 가져다가 쓸 수 있습니다.
같은 네트워크 대역을 쓰는 클라이언트가 Docker 공유 서버에 접속해서 받을 수도 있습니다.
registry 입니다.
일단 registry 를 도커허브에서 받아와준 후 구동까지 시켜 리슨 상태로 만들어줍니다.
docker run --name registrytest -d -p 5000:5000 registry
netstat -ntpl | grep 5000
5000번이 리슨되어있는 것을 확인할 수 있습니다.
registry에 올려면 태그를 설정해줘야합니다.
설정하지 않고 그냥 하면 도커 허브에 올리기 때문입니다.
docker pull docker.io/hello-world |
docker tag docker.io/hello-world localhost:5000/hello-world 로 태그를 바꿔줍니다. |
docker image push localhost:5000/hello-world |
docker rmi localhost:5000/hello-world |
docker run --name test1 localhost:5000/hello-world |
localhost:5000로 표현하는 것보다 DNS를 사용해서 레지스트리 저장소임을 밝혀주는 게 좋을 것 같으니
docker1, 2 모두 가상 호스트를 설정해줍니다.
vi /etc/hosts > 192.168.2.20 myregistry.com
☞ 보안 강화
정보를 그냥 주고 받으면 암호화하지 않아 보안에 취약할 수 있습니다.
그래서 방법이 두가지가 있습니다.
1. 암호화
alpine/openssl 이미지를 이용해 개인키 myregistry.com.key와 인증서(public key) myregistry.com.crt 파일을 생성합니다.
개인키, 공개키를 두고 pull할 때 암호화를 거쳐 전달받습니다.
리눅스본체로 키를 받아와야하기 때문에 볼륨으로 키 디렉토리를 마운트시키면 생성됩니다.
registry를 구동시켜 키를 넣고 리슨 상태이면
hello-world 테스트 이미지를 가져와 태그를 설정하고 레지스트리에 등록합니다.
기존 이미지는 삭제하고 registry에서 다시 구동해오면 암호화로 됩니다.
scp를 통해 docker1 클라이언트에도 인증서를 보내고 레지스트리에서 받아 테스트합니다.
2. 로그인설정
docker에서 교환할 때 로그인이 필요하게 설정
htpasswd 설정 파일이 필요합니다.
htpasswd 설정 파일을 만들고 registry를 구동시켜 파일을 넣습니다.
docker login myregistry.com(192.168.2.20)
클라이언트에서 로그인 후 이미지 구동합니다.
docker history ~
이미지 실행 시 어떤 명령어 사용 확인
'Security > 리눅스' 카테고리의 다른 글
정보보안 스터디 - 10주차 7일 - Ansible (0) | 2022.12.21 |
---|---|
정보보안 스터디 - 10주차 6일 - Docker-compose 컨테이너 관리 (0) | 2022.12.20 |
정보보안 스터디 - 10주차 2일 - docker 이미지 생성 (0) | 2022.12.16 |
정보보안 스터디 - 10주차 1일 - Docker 네트워크 구성 (0) | 2022.12.16 |
정보보안 스터디 - 9주차 7일 - Docker 사용법 (0) | 2022.12.14 |