반응형

📝Docker 사용 이유

다양한 서비스환경 (서로 다른 OS, JDK버전 등)으로 인해 서비스 제품을 만들 때 많은 제약이 있다.

  1. 각 OS버전 및 JDK에 맞는 버전으로 다양한 서비스 제품을 만들기
    • 다양하게 만들고 테스트까지 진행해야하기 때문에 많은 공수가 필요합니다. 또한 버전 업이 될 경우 테스트 및 버전까지 곱하기로 늘어나게 됩니다
  2. 서비스 제품이 동작하는 OS 또는 JDK버전 서버에만 설치하기 (RedHat8.2버전과 JDK 11버전만 호환되니 그에 맞게 환경을 만들어야 합니다.)
    • 다양한 환경에 제품을 판매할 수 없기 때문에 영업적 손실이 있을 수 있습니다
    • 또한 서버 한 곳에 다양한 서비스까지 올라가는 경우 충돌이 날 가능성도 높습니다. (일반적으로 따로 따로 두지만 서버 비용 등 어쩔 수 없는 경우)


이러한 문제점들을 해결하기 위해 나온게 도커입니다.

 

 

📝Docker Layer, Container

 

 

  • OS위에 도커를 설치한 뒤 도커를 통해 여러개의 독자적인 OS[여러가지 서비스]를 띄울 수 있습니다 이렇게 독자적인 OS를 띄운 걸 컨테이너라고 합니다.
  • 컨테이너들은 독자적이기 때문에 서로에게 영향을 주지 않습니다 (App A, App B, App C ....를 의미합니다.)

 

📝Docker Image

  • 이미지는 간단히 자바에서는 클래스라고 생각하시면 됩니다. 클래스로 여러가지 객체를 만들 듯 미지 하나를 올려두면 AppA, AppB.... 컨테이너를 여러개를 찍어낼 수 있습니다
    • 이미지를 다운 받고 컨테이너를 만들고 컨테이너에 접속해 내가 필요한 작업을 한 뒤 이미지화를 해서 나만의 이미지를 생성할 수 있습니다

 

📝Docker Hub

  • 도커허브는 Maven Repository처럼 이미지들의 저장소라고 생각하시면 됩니다 (GitHub + Maven Repository 같은 역할을 한다고 생각하시면 됩니다.)

 

📝Docker 명령어

───── 컨테이너 ────

// 컨테이너 생성
# docker container run -it --name ${컨테이너명} ${이미지명} ${생성시 실행할 명령어}
# 일반적으로 ${이미지명} → 회사/제품명:버전정보
docker container run -it --name tistory kakao/tistory:1.1 /bin/bash

-i: 사용자가 입출력 할 수 있는 상태
-t: 가상 터미널 환경을 에뮬레이션 하겠다.
-d: 컨테이너를 일반 프로세스가 아닌 데몬프로세스로 실행하여 프로세스가 끝나도 유지되도록 한다.
-e: 환경변수 설정, 옵션을 사용하면 Dockerfile의 ENV 설정도 덮어써지게 된다.
-p: 호스트 컴퓨터에서 설정한 포트
-h: 컨테이너의 호스트 이름을 설정한다.
--link: Docker 컨테이너끼리 연결할 때는 docker run 명령에서 --link 옵션을 사용
--rm: 컨테이너를 일회성으로 실행할 때 주로 쓰이는데, 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거해준다.

// 실행된 컨테이너 접속
# docker attach ${컨테이너명}
docker attach tistory

// 컨테이너 삭제
# docker rm ${컨테이너명}
docker rm search

// 모든 컨테이너 확인
# docker ps -a

// 동작중인 컨테이너 확인
# docker ps

// 부모서버 파일 → 컨테이너로 복사
# docker cp ${부모서버 파일 경로} ${컨테이너명:복사할 경로}
docker cp ~/data/tistory_1.1.tar tistory:/home/tistory_1.1.tar

// 컨테이너 파일 → 부모서버로 복사
# docker cp ${컨테이너명:복사할 경로} ${부모서버 파일 경로}
docker cp tistory:/home/tistory_1.1.tar ~/data/tistory_1.1.tar

// 컨테이너에 포트 포워딩 하는법
# docker run -it --name ${컨테이너명} -p ${부모포트}:${컨테이너포트} ${이미지명}
# 컨테이너 SSH 2222포트 일시 ${부모 아이피}:2000으로 접근시 컨테이너로 SSH 접근(라우팅)
docker run -it --name tistory -p 9200:9200/tcp -p 8021:8021/tcp -p 2000:2222 centos:normal_setting

// 컨테이너 시작
# docker start ${컨테이너명}
docker start tistory

// 컨테이너 정지
# docker stop ${컨테이너명}
docker stop tistory

// 컨테이너 재시작
# docker restart ${컨테이너명}
docker restart tistory

// Privileged 옵션으로 Container를 생성시 Container 안에서 Host의 리눅스 커널 기능을 모두 사용가능
# docker run -it --privileged --name ${컨테이너명} ${이미지명}
docker run -it --privileged --name tistory kakao/tistory:1.1


──── 이미지 ────

// 이미지 다운
# docker pull ${이미지명} [도커허브에 올라간 이미지명]
docker pull centos

// 현재 있는 도커 이미지 확인
docker images

// 이미지 삭제
# docker rmi ${이미지명}
docker rmi kakao/tistory:1.1

// 도커 이미지 명 변경 
# docker tag ${이미지명} ${바꿀 이미지명}
docker tag kakao/tistory:1.1 kakao/tistory:1.2

// 이미지 생성 
# docker commit ${이미지를 만들 컨테이너명} ${생성할 이미지명}
docker commit tistory kakao/tistory:1.1

// 도커 허브에 이미지 푸시
# docker push ${푸시 할 이미지명}
docker push kakao/tistory:1.1

 

📝도커 파일 작성

  • 도커파일의 경우 이미지로 올릴 때 이미지만 다운 받는게 아닌 다운 받고 실행 시키고 설정 바꾸는 등의 하나의 스크립트를 작성할 수 있습니다. 정해진 형식이 정해져있어서 해당 문법에 맞게 진행해야합니다.

 

──── 도커파일 ────
// 도커파일 빌드 [Dockfile이 있는 경로로 이동 후에 실행]
# docker build --tag ${생성할 이미지명}
docker build --tag kakao/tistory:1.1 .



──── 도커파일 작성 명령어 ────

// 이미지 다운로드
# FROM 도커 이미지 경로
FROM kakao/tistory:1.1

// 포트 오픈
# EXPOSE ${PORT}
EXPOSE 9200

// 디렉토리 이동
# WORKDIR ${디렉토리 경로}
WORKDIR /home

// 사용자 변경
# USER ${사용자명}
USER tistory

// 파일 실행시키기
# CMD ${실행 파일}
CMD ./start.sh



──── 도커 파일 작성 예제 ────
FROM kakao/tistory:1.1

USER tistory

EXPOSE 9200
EXPOSE 8021

WORKDIR /home

CMD ./start.sh

 

 

🔗 참고 및 출처

https://docs.docker.com/engine/reference/builder/

 

 

📝도커 이미지 증가하는 이유

    • 도커 이미지는 레이어(layer) 형태로 구성되어 있습니다 각 레이어는 파일 시스템 변경 사항을 담고 있으며, 이미지를 생성하는 과정에서 기반 이미지와 추가적인 레이어를 추가하여 구성됩니다
      • 새로운 패치를 진행한 후에 도커 이미지를 재 생성하면, 이전 이미지의 변경 내용이 이전 레이어에 덮어쓰여 새로운 레이어가 추가됩니다. 이때 이전 레이어의 변경 내용은 그대로 존재하며, 새로운 레이어도 추가되므로 이미지 용량이 증가합니다.
    • 도커 이미지는 일종의 스냅샷 형태로 구성되어 있기 때문에, 이미지를 삭제하더라도 이전 레이어는 삭제되지 않고 남아 있습니다
    • 따라서 이미지를 재생성할 때 이전 레이어의 변경 내용과 새로운 레이어를 모두 포함하게 되므로이미지 용량이 증가하는 것입니다. (기본적으로 형상관리라고 생각하면 되고 삭제하진 못합니다)

 

📝도커 이미지 용량 줄이기

최종 이미지 레이어에 대한 것만 저장하면 용량을 크게 줄일 수 있습니다

1. docker export (From docker container To tar)
docker export ${export할 container명} ${export할 tar명}
ex) docker export kakao_tistory extracted.tar

2. docker import (From tar To docker image)
docker import ${import할 tar 경로} ${import할 이미지명}
ex) docker import extracted.tar kakao/tistory:1.5

 

📝나만의 Docker 기본 셋팅

─── CENTOS7 설치 ───
docker pull centos

 

─── ifconfig 설치 ───
yum install net-tools

 

─── 계정생성 ───
yum install passwd

useradd ${사용자계정}
passwd ${사용자패스워드}
패스워드 : ${사용자패스워드}

 

─── ls 컬러 주기 (root) ───
1. vi ~/.bashrc

2. 하기 내용 추가
alias ll='ls -l'

if [ $SHELL = "/bin/bash" -a -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'
    #alias grep='grep --color=auto'
    #alias fgrep='fgrep --color=auto'
    #alias egrep='egrep --color=auto'
fi

3. source ~/.bashrc 로 적용

─── ls 컬러 주기 (사용자계정) ───
vi /home/${사용자계정}/.bashrc 에도 적용 시켜서 ${사용자계정}에도 컬러 추가하기

 

─── OPENJDK 설치 ───
yum install java-11-openjdk-devel.x86_64

 

─── sudo 권한 ───
1. yum install sudo

2. vi /etc/sudoers
3. ${사용자계정} 내용 추가
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
${사용자계정}  ALL=(ALL)       NOPASSWD: ALL

 

─── 트러블 슈팅 ───

─ 명령어 설치 에러
Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

해결 방안
1. cd /etc/yum.repos.d/
2. sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
3. sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
4. yum update -y

 

 

🔗 참고 및 출처

https://techglimpse.com/failed-metadata-repo-appstream-centos-8/

https://nulls.co.kr/docker/463

https://tech95.kr/213

반응형