220510 Today I Learned
일지
특이사항 없음
주요 키워드
오늘의 할일
- 220510 TIL 작성
- 아뭐하지
- [ ]
추가로 정리해야할 부분
수업 정리
이미지 관리
- 이미지 생성(직접 생성, 코드에 의한 관리 IaC)
- 이미지 내보내기
- 이미지 가져오기
-
이미지 업로드
-
Snowflake Server Snowflake : 눈송이
사용자에 의해서 지속적으로 관리가 수행되는 서버 - Phoenix Server
Phoenix : 불사조
서버의 상태를 이미지화하는 서버
Docker의 이미지 Layer 구조
- Union Filesystem
- 하나의 지점에 여러 디렉토리를 마운트 할 수 있는 파일시스템
- 겹치는 부분이 있을 경우, 층 구조에서 상단에 위치한 층의 정보를 사용
- 대표적인 Union Filesystem
- UnionFS
- AUFS(Advanced multi-layered Unification File System)
- BTRFS
- ZFS
- OverlayFS(v1/v2)
OverlayFS
- Union Filesystem을 구현한 파일시스템
-
lsmod grep overlay - 기본구조
- lower : 아래쪽 층들의 모임, 절대 수정되지 않음
- upper : 겹침 구조의 최상층, 실제 수정이 반영되는 부분
- merge : lower+upper 겹쳐서 보는 통합 View
- work : 겹침 구조의 병합 작업등을 위하여 사용되는 임시공산
OverlayFS 테스트
- 마운트용 디렉토리 생성
- mkdir /overlay
- cd /overlay/
- mkdir lower upper merge work
- 테스트용 파일 생성
- echo Hello > lower/fileA
- echo World > upper/fileB
- OverlayFS 마운트
- mount -t overlay overlay -o lowerdir=lower/,upperdir=upper/,workdir=work/ merge/
- mounr -t [TYPE] -o [옵션] <원본> <마운트포인트>마운트포인트>원본>
- 마운트 상태 및 파일 상태 확인
- ls -l lower
- ls -l upper
- ls -l merge
- lower에 존재하는 fileA 파일을 마운트 된 merge를 통해 접근하여 수정 및 확인
- echo merong » merge/fileA
- ls -l merge/
- cat merge/fileA
- ls -l lower/
- cat lower/fileA
- ls -l upper/
- cat upper/fileA
- 결론: lower의 파일은 수정되지 않고, upper에 수정된 파일이 생성되며, merge에서는 upper의 파일이 노출됨
- upper에 존재하는 fileB 파일을 마운트 된 merge를 통해 접근하여 수정 및 확인
- echo merong » merge/fileB
- ls -l merge/
- cat merge/fileB
- ls -l lower/
- ls -l upper/
- cat upper/fileB
- 결론: lower는 upper에만 존재하는 파일과 무관하며, upper에만 존재하는 파일은 upper에서 수정됨
- lower에 존재하는 fileA 파일을 merge를 통해 접근하여 삭제
- rm merge/fileA
- ls -l merge/
- ls -l lower/
- cat lower/fileA
- ls -l upper/
- 결론: lower에 존재하는 파일을 삭제할 경우, merge에 파일이 노출되지 않도록 upper에서 masking을 위한 Character 장치파일(c)을 생성. merge에는 해당 파일이 노출되지 않음
- upper에 존재하는 fileB 파일을 merge를 통해 접근하여 삭제
- rm merge/fileB
- ls -l merge/
- ls -l lower/
- ls -l upper/
- 결론: upper에만 존재하는 파일을 삭제할 경우 lower는 무관하며, upper에서 직접 파일이 삭제됨
이미지 생성
태그 docker image tag : 이미지 태그 생성 (기존 이미지의 정보와 동일)
현재 사용중인 컨테이너를 이미지화 docker container commit <원본컨테이너> <생성할이미지명>[:태그] 원본 이미지의 정보를 그대로 생성할 이미지로 전달 기존 컨테이너 생성 시 사용한 이미지의 레이어 정보도 그대로 유지생성할이미지명>원본컨테이너>
옵션
-a, –author : 작성자 지정
-m, –message : 별도로 추가하고 싶은 메시지 입력
-c, –change : 이미지와 관련된 설정 변경
-p, –pause : 이미지 작성 시 컨테이너 일시 중지 후 작성
이미지 내보내기 / 가져오기
현재 Docker Host(Docker Engine)에 저장되어 있는 이미지를 파일로 내보내기
파일 형태로 저장되어 있는 이미지를 이미지로 불러오기
컨테이너 -> 파일(export), 이미지 -> 파일(save)
<export/import>
- 컨테이너를 파일로 내보내기
- docker container export <컨테이너명> > <파일명>파일명>컨테이너명>
- docker container export <컨테이너명> -o <파일명>파일명>컨테이너명>
- 내보내기 시는 tar 아카이브 파일로 생성
- export 한 파일을 이미지로 저장하기
- docker image import
<이미지명>[:태그] 이미지명> - 옵션
- -m, –message : 메시지 추가
- -c, –change : 이미지 속성 정보 추가
- docker image import
export/import의 경우 이미지의 계층 정보 및 이미지의 속성정보 등이 모두 남아있지 않고, 현재 컨테이너의 파일시스템 내의 데이터만 파일로 저장하므로, 해당 이미지를 사용하여 컨테이너를 구동하기 위해서는 필요한 구성 설정을 직접 추가하여야 함 (-c, –change 옵션 사용)
<save/load>
- 이미지를 파일로 내보내기
- docker image save <이미지이름>[:태그] > <파일명>파일명>이미지이름>
- docker image save <이미지이름>[:태그] -o <파일명>파일명>이미지이름>
- 파일을 이미지로 가져오기
- docker image load -i <파일명>파일명>
save/load의 경우 이미지의 계층(layer) 정보 및 이미지의 속성정보(manifest) 등을 모두 포함한 형태로 저장하기 때문에, 이미지를 다시 load 하였을 때 정보가 그대로 유지됨
- Dockerfile을 사용한 이미지 작성
- 이미지 작성 시, 코드에 의해 이미지를 작성하도록 하는 방법
- 기본 파일명 Dockerfile (필요시 변경 가능)
- docker image build 명령어를 사용하여 Dockerfile 내용에 따른 이미지 빌드
- docker image build -t <생성할이미지명>[:태그]
- 옵션: -f, –file: Dockerfile 대신 사용할 이름
Dockerfile
- 기본 이미지: ubuntu, centos, busybox 등등…
- 이미지에 추가, 수정할 파일
- 실행할 명령
- 이미지를 만드는 과정에서 실행할 명령
- 만들어진 이미지로 컨테이너를 구동하는 과정에서 실행할 명령
- 만들어진 이미지를 사용하여 다시 이미지를 빌드할 때 실행할 명령
- 네트워크 정보: 컨테이너에서 노출할 포트 정보
- 볼륨 정보: 컨테이너에서 사용할 볼륨
- 기본정보: 컨테이너 작성자
- 환경변수: 이미지 실행시 사용자화(Customization)를 위한 환경변수 지정
- 사용자: 컨테이너 내에서 명령을 실행할 사용자 지정
- 실행위치: working directory 지정
Dockerfile에서 사용하는 예약어
- 베이스 이미지 (기본 이미지): FROM
- 사용법
- FROM <이미지명> // latest 태그를 자동 지정이미지명>
- FROM <이미지명>:<태그명>태그명>이미지명>
- FROM <이미지명>@
이미지명>
- 실행할 명령어 (이미지 작성 시 실행): RUN
- 사용법
- RUN <실행할 명령="">실행할>
- 실행할 명령어 (이미지로부터 컨테이너 구동 시 실행): CMD, ENTRYPOINT
- CMD와 ENTRYPOINT의 관계
- CMD만 있을 경우: CMD에 지정된 명령을 실행
- ENTRYPOINT만 있을 경우: ENTRYPOINT에 지정된 명령을 실행
- CMD와 ENTRYPOINT가 모두 있을 경우: ENTRYPOINT에 지정된 부분이 명령어, CMD에 지정된 부분이 명령어의 인자
- ex) ENTRYPOINT touch
- CMD /tmp/test
- CMD의 경우 컨테이너 실행 시 변경가능
- docker run [옵션] <이미지> [명령어]이미지>
- ENTRYPOINT의 경우 옵션을 사용하여 변경 가능
- docker run –entrypoint
…
- docker run –entrypoint
- CMD와 ENTRYPOINT의 관계
- 실행할 명령어 (이미지를 사용하여 빌드할 때 실행): ONBUILD
Dockerfile 내에서 실행할 명령을 입력할 때 사용하는 방법
- Shell 방식 : 명령어를 그대로 입력
- ex) RUN yum -y install httpd
- Exec 방식 : 명령어를 JSON 포맷 형태로 입력
- ex) RUN [“yum”, “-y”, “install”, “httpd”]
Dockerfile
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (빌드시 실행할 명령을 Shell 형식으로 지정)
RUN yum -y install httpd
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (빌드 시 실행할 명령을 Exec 형식으로 지정)
RUN ["yum", "-y", "install", "httpd"]
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (컨테이너 구동 시 실행할 명령을 Shell 형식으로 지정)
ENTRYPOINT touch
CMD /tmp/test
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (컨테이너 구동 시 실행할 명령을 Exec 형식으로 지정)
ENTRYPOINT ["touch"]
CMD ["/tmp/test"]
실습!
실습 전 사용하지 않는 이미지들은 제거해주세요~
사용하지 않는 이미지 일괄 제거 (컨테이너에서 사용하지 않는 이미지 모두 삭제)
docker image prune --all
1. 웹 서비스 및 웹 서비스용 테스트 페이지가 포함된 mywebcontainer 이미지를 작성하시오. (commit 사용)
사용할 이미지: ubuntu:focal
설치할 웹서버 패키지: nginx
테스트용 페이지: /var/www/html/index.html (임의로 생성)
참고: ubuntu 패키지 설치 명령
$ apt update
$ apt install <패키지명>
A)
docker run -itd --name ubuntu ubuntu:focal
docker attach ubuntu
apt update
apt install nginx
echo Test page > /var/www/html/index.html
exit
docker container commit ubuntu mywebcontainer
강사님 답안.
<컨테이너 생성>
docker run -it --name myubuntu ubuntu:focal
<컨테이너 구성>
echo Asia/Seoul > /etc/timezone
touch /etc/localtime
apt update
apt -y install nginx
echo "Hello my ubuntu-nginx webserver" > /var/www/html/index.html
<이미지 생성>
docker container commit myubuntu mywebcontainer
2. 1번에서 생성한 이미지를 사용하여 컨테이너를 구동하시오. 이 때, 컨테이너에서 웹 서버가 바로 구동되도록 컨테이너를 생성하시오. (docker run)
A)
docker run -itd mywebcontainer
강사님 답안.
docker run -d --name mywebcontainer -p 80:80 mywebcontainer nginx -g "daemon off;"
3. 1번에서 생성한 이미지를 ubuntu-nginx:0.1 이름으로 사용할 수 있도록 설정하시오.
A)
docker image tag mywebcontainer ubuntu-nginx:0.1
docker images
강사님 답안.
docker image tag mywebcontainer:latest ubuntu-nginx:0.1
4. ubuntu-nginx:0.1 이미지를 webserver.tar 이름의 파일로 저장하시오. 이 파일은 다른 docker host에서 로드하여 사용할 수 있도록 저장되어야 함.
A)
docker image save ubuntu-nginx:0.1 -o webserver.tar
강사님 답안.
docker image save ubuntu-nginx:0.1 > webserver.tar
5. ubuntu-nginx:0.1 이미지를 사용하여, 컨테이너 구동시 웹 서버를 실행하는 명령을 직접 지정하지 않더라도 웹서버가 실행될 수 있도록 ubuntu-nginx:0.2 이미지를 Dockerfile을 사용하여 작성하시오.
A)
vi Dockerfile
FROM ubuntu-nginx:0.1
RUN 흑흑
CMD []
아니 엔진엑스 웹서버는 어떻게켜
강사님 답안.
# 기본 이미지 지정
FROM ubuntu-nginx:0.1
# 컨테이너 구동시 실행명령 지정
CMD ["nginx", "-g", "daemon off;"]
6. 1~5까지의 과정을 한번에 빌드할 수 있는 Dockerfile을 작성하시오. 이 Dockerfile을 사용하여 ubuntu-nginx:1.0 이미지를 빌드하시오
A)
ㅠㅠ
강사님 답안
Dockerfile
# 기본 이미지 지정
FROM ubuntu:focal
# nginx 설치
RUN echo Asia/Seoul > /etc/timezone
RUN touch /etc/localtime
RUN apt update || true
RUN apt -y install nginx
# index.html 복사
COPY index.html /var/www/html
# 컨테이너 구동시 실행명령 지정
CMD ["nginx", "-g", "daemon off;"]
index.html
Hello my nginx container with Dockerfile
Leave a comment