반응형

Docker 파일 빌드할 때 발생하는 "oci runtime create failed container_linux.go:346: starting container process caused "~~": executable file not found in $PATH": unknown 에러는 문법 오류로 인해 발생 합니다.

starting container process caused 뒤에 문제가 된 문법이 나오게 되는데 해당 부분을 Dockerfile에서 찾아 수정 해주어야 합니다. 일반적으로 RUN 명령에서 exec 형식을 사용할 때 명령 인수에 환경 변수를 지정할 수가 없는데, 환경 변수를 지정 하였거나 문법에 어긋난 명령을 입력할 때 자주 발생 합니다.

FROM centos:7

RUN ["yum -y install nginx"]

 

위의 예시를 언뜻 보면 문제가 없어 보이지만 일반적인 shell 형식으로 작성된것이 아닌 exec 형식으로 작성 되었습니다. 위의 코드를 정상적으로 동작 시키기 위해서는 아래와 같이 작성 해야 합니다.

FROM centos:7

RUN yum -y install nginx 
#또는
RUN ["/bin/bash", "-c", "yum -y install nginx"]

 

반응형
반응형

 

Centos 7.7 1908 커널 업데이트(yum 설치) 하는 방법 이고, yum으로 하다보니 최신 버전으로 다운로드 됩니다.

기존의 커널을 업데이트 한다기 보단, 최신버전의 새 커널을 다운받아 커널을 옮깁니다. (기존 커널은 그대로 유지되고 이후 커널 부팅 순서 변경 또는 오래된 커널 삭제 등 가능합니다. )

 

  • 현재 커널 버전 확인

 

  • 커널 업데이트 진행

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

yum --enablerepo=elrepo-kernel install kernel-ml

이후 커널 설치까지 완료 되었다면 재부팅을 해주어야 최신 버전의 커널로 진입할 수 있습니다.

재부팅을 하게되면 아래와 같이 grub 화면에서 커널을 선택할 수 있습니다. 키보드 화살표를 이용해 최신 버전의 커널을 선택하고 엔터를 눌러서 최신 버전 커널로 진입 합니다. (재부팅 시켜놓고 가만히 있으면 기존에 있던 커널로 진입 됩니다)

 

  • 커널 부팅 순서 변경

최신 버전의 커널이 설치된 상태로만 있으면 부팅 시 기존에 있던 옛날 버전의 커널로 부팅 되기 때문에 순서를 변경 해주어야 합니다.

cat /boot/grub2/grub.cfg | grep menuentry | cut -d "'" -f2

위의 명령어를 입력하면 이미지와 같이 현재 GRUB 에서 봣던 커널들이 출력 됩니다. 

 

grub2-set-default "CentOS Linux (5.4.12-1.el7.elrepo.x86_64) 7 (Core)"
grub2-editenv list

 이제 재부팅을 하면 커널을 직접 선택하지 않아도 최신 버전의 커널로 진입 됩니다.

 

  • 커널 삭제

커널의 업데이트도 정상적으로 되었으니, 이제 기존 커널은 필요가 없어졌네요. 삭제는 아래와 같이 rpm으로 커널을 확인한 후 yum remove 를 사용하여 삭제해주시면 됩니다.

아래 명령어를 그대로 치지 마시고 rpm -qa kernel 으로 커널명을 확인 후 yum remove 에 작성해 주세요.

rpm -qa kernel 
yum -y remove kernel-3.10.0-1062.el7.x86_64

위의 삭제 과정을 거친 후 아래와 같이 커널 3.10 버전이 정상적으로 삭제 되었습니다.

 

반응형
반응형

 

  • Dockerfile 이란?

도커는 기본적으로 이미지가 있어야 컨테이너를 생성하고 동작시킬 수 있습니다. dockerfile은 필요한 최소한의 패키지를 설치하고 동작하기 위한 자신만의 설정을 담은 파일이고, 이 파일로 이미지를 생성(빌드)하게 됩니다.

패키지 설치, 환경 변수 변경, 설정 파일 변경 등 다양한 작업을 하나하나 컨테이너를 만들고 설정을 적용할 필요 없이 dockerfile을 사용하여 적용할 수 있고, 유저의 실수로 인한 설정 누락 예방 등 다양한 장점이 있습니다. 

위에서 빌드할 때 이미지의 이름을 web_img 로 정했으므로 web_img 라는 이미지가 생성 되었습니다. 물론 단순히 패키지 설치뿐만 아니라 컨테이너 안에서의 환경 변수나 여러가지 설정들을 할 수 있지만 이 글에서는 간단한 개념만 작성 하겠습니다.

 

  • Dockerfile 명령어 종류

명령은 대소문자 상관 없습니다. DB에서 가독성을 높이기 위해 관례적으로 명령들을 대문자 사용하는것과 같습니다.

추후 아래 명령어들에 대해 정리한 글을 업로드할 예정 입니다.

명령 설명
FROM 베이스 이미지 지정
RUN 명령 실행
CMD 컨테이너 실행 명령
LABEL 라벨 설정
EXPOSE 포트 익스포트
ENV 환경변수
ADD 파일/디렉토리 추가
COPY 파일 복사
ENTRYPOINT 컨테이너 실행 명령
VOLUME 볼륨 마운트
USER 사용자 지정
WORKDIR 작업 디렉토리
ARG Dockerfile 에서의 변수
ONBUILD 빌드 완료 후 생성된 이미지가 다른 dockerfile에서 FROM 으로 불러질 때   실행되는 명령
STOPSIGNAL 시스템 콜 시그널 설정
HEALTHCHECK 컨테이너의 헬스 체크
SHELL 기본 쉘 설정

 

  • Docker build 와 Image layer

여러 패키지 설치나 설정 등을 저장한 dockerfile을 빌드할 때(이미지 파일로 변환 시킬 때)는 layer 구조를 보이는데, 이미지가 계층적으로 하나씩 쌓이면서 빌드 됩니다. 

# Step1
FROM centos:7

# Step2
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

# Step3
RUN yum -y install nginx

# Step4
EXPOSE 80

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

맨 위에 Dockerfile 개념을 설명할 때에 사진에 등장했던 dockerfile 코드 이고 각각의 커맨드들이 step 으로 구분됩니다.

centos7을 사용중이신분들을 기준으로 우선 build 하기 전에 mkdir /build_test 입력하여 디렉토리를 생성해주고 vi /build_test/Dockerfile를 사용하여 위의 코드를 입력 후 저장 해주세요.  이후 cd /build_test/ 로 Dockerfile 이 있는 경로에 접근한 후 아래 사진에 있는 명령어를 입력 합니다. (위의 코드는 간단한 centos+nginx를 설치하기 위한 코드 입니다)

build 했을때 보이는 영어를 자세히 봐보면 이미지 id가 보이는데, 스탭별로 이미지가 생성되는걸 볼 수 있습니다.

  • docker build -t [생성할 이미지명] .
  • dockerfile 지정 시 -f옵션 및 예시 : docker build -t [생성할 이미지명] -f [dockerfile 파일명] .

 

dockerfile을 build 했을 때 아래와 같이 각 스탭별로 이미지가 생성되며 layer 구조를 이루게 됩니다.

 

여기서 이제 docker container run 명령어를 사용하면 아래 사진과 같이 가장 마지막에 container layer를 생성 합니다. (이 컨테이너 레이어는 컨테이너 삭제하면 같이 삭제 됩니다)

그럼 실제로 컨테이너를 사용할 때는 하나의 파일 시스템으로 보이는데, 이렇게 계층적으로 나눠진 이미지들이 어떻게 하나의 파일 시스템으로 보일까요?

 

하나로 보이는 이유는 이렇게 모든 레이어들이 준비 되었다면 유니온 파일 시스템(Union File System)을 사용하여 여러개로 나누어져 있는 파일 시스템을 하나의 파일 시스템으로 마운트하여 실제 사용할때는 하나로 보이게 되고, 여러개로 나눠져 있는것을 느낄 수 없습니다.

반응형
반응형

 

Dockerfile을 이용한 Centos7 + 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

EXPOSE 80

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

 

 

반응형

+ Recent posts