도커 기초

Introduction

  1. Docker가 설치되어 있는지 확인

    docker --version
  2. 생성된 모든 컨테이너 목록 확인

    docker container ls -a
  3. Docker 실행 옵션 확인 - Docker 구조

    sudo systemctl status docker.service --no-pager
  4. containerd 상태 확인 - https://www.docker.com/blog/docker-engine-1-11-runc/

    sudo systemctl status containerd.service --no-pager
  5. Docker CLI로 컨테이너 생성

    docker container run --name nginx --detach --publish 8080:80 nginx
  6. 현재 실행중인 컨테이너 목록 확인

    docker container ls
  7. 로컬호스트에 연동된 포트로 HTTP 요청

    curl localhost:8080
  8. runc가 생성한 컨테이너 확인

    sudo runc --root /run/docker/runtime-runc/moby list
  9. 컨테이너를 통해서 실행된 프로세스 확인

    sudo runc --root /run/docker/runtime-runc/moby ps \
    $(sudo runc --root /run/docker/runtime-runc/moby list -q)
  10. 위에서 생성한 컨테이너 삭제 시도

    docker container rm nginx
  11. 실행중인 컨테이너 정지

    docker container stop nginx
  12. 컨테이너 삭제

    docker container rm nginx
  13. 생성된 모든 컨테이너 목록 확인

    docker container ls -a
  14. 지난 30분간 Docker에서 발생한 이벤트 확인

    docker system events --since '30m' --until $(date +%s)

컨테이너 이미지 구조

  1. Apache 컨테이너 이미지 다운로드

  2. Docker Hub에서 Apache 컨테이너 이미지 검색

  3. Apache 컨테이너 이미지 다운로드

  4. Docker Hub에서 latest 태그를 가진 Apache 컨테이너 이미지의 상세 내용 확인

  5. Docker Hub에서 alpine 태그를 가진 Apache 컨테이너 이미지의 상세 내용 확인

  6. Alpine 리눅스를 사용하는 Apache 컨테이너 이미지 다운로드

  7. 로컬호스트에 저장된 컨테이너 이미지 확인

  8. alpine 태그를 가진 Apache 컨테이너 이미지의 상세 내용 확인

  9. alpine 태그를 가진 Apache 컨테이너 이미지 삭제

  10. bookworm 태그를 가진 NGINX 컨테이너 이미지 다운로드

  11. 로컬호스트에 저장된 컨테이너 이미지 확인

  12. bookworm 태그를 가진 NGINX 컨테이너 이미지 삭제

  13. 새로운 컨테이너 이미지 빌드

  14. 로컬호스트에 저장된 컨테이너 이미지 확인

  15. 컨테이너 이미지 빌드에 사용한 베이스 이미지 다운로드

  16. python과 flask 이미지의 Layer 비교

  17. flask 이미지의 상세 내용 확인

  18. 마지막에 수행되는 명령만 변경해서 새로운 이미지 빌드

  19. flask와 boto3 이미지의 Layer 비교

  20. 이미지 삭제

이미지 생성 및 공유

  1. 데모 애플리케이션 소스코드 다운로드

  2. 애플리케이션 구동에 필요한 라이브러리 설치

  3. 애플리케이션 구동

  4. 새로운 터미널을 열고 웹 애플리케이션이 구동하는지 확인

  5. 기존 터미널로 돌아와서 Ctrl+C 를 입력해서 애플리케이션 정지

  6. Dockerfile 리뷰

  7. 컨테이너 이미지 빌드

  8. 컨테이너 실행

  9. 컨테이너가 정상적으로 실행 되었는지 확인

  10. 컨테이너 삭제

  11. ECR 리포지토리 생성

  12. 위에서 생성한 ECR 리포지토리의 URI를 확인하고 환경변수로 지정

  13. 위에서 생성한 컨테이너 이미지에 새로운 태그 부여

  14. 컨테이너 이미지 목록 확인

  15. 컨테이너 이미지를 ECR 리포지토리로 업로드

  16. ECR 레지스트리로 로그인

  17. 컨테이너 이미지를 ECR 리포지토리로 업로드

  18. 이미지가 정상적으로 업로드 되었는지 확인

  19. 로컬호스트에 생성된 모든 컨테이너 삭제

  20. 로컬호스트에 저장된 모드 컨테이너 이미지 삭제

  21. ECR 리포지토리에 저장된 이미지로 컨테이너 생성

  22. 컨테이너가 정상적으로 실행 되었는지 확인

  23. 컨테이너 및 이미지 삭제

  24. 아래의 요구 사항에 맞게 컨테이너 이미지를 만들고 실행하세요.

    1. Docker Hub에 있는 NGINX 이미지 사용

    2. 웹사이트 루트를 호출하면 Hello, Container가 표시어야 함

    3. 로컬호스트의 8080포트를 컨테이너에서 실행되는 NGINX 웹서버의 포트와 연동

문제 답안
  1. Dockerfile 생성

  2. 이미지 생성

  3. 컨테이너 실행

  4. 웹서버 호출

이미지 경량화

  1. 데모 애플리케이션 소스코드 다운로드

  2. 애플리케이션 구동

  3. 새로운 터미널을 열고 웹 애플리케이션이 구동하는지 확인

  4. 기존 터미널로 돌아와서 Ctrl+C 를 입력해서 애플리케이션 정지

  5. Dockerfile 리뷰

  6. 컨테이너 이미지 빌드

  7. 컨테이너 실행

  8. 컨테이너가 정상적으로 실행 되었는지 확인

  9. 컨테이너 삭제

  10. 컨테이너 이미지 크기 확인

  11. 멀티 스테이지로 짜여진 Dockerfile 리뷰

  12. 컨테이너 이미지 빌드

  13. 컨테이너 이미지 크기 확인

  14. 새로운 이미지 빌드

  15. 컨테이너 이미지 크기 확인

  16. 14번 명령어에 명시된 Dockerfile을 수정해서 경량화된 이미지를 생성하세요.

문제 답안
  1. 이미지 생성

  2. 컨테이너 이미지 크기 확인

  3. 이미지 삭제

컨테이너 네트워크

  1. 호스트에 있는 네트워크 인터페이스 목록 확인

  2. 컨테이너 생성

  3. 컨테이너에 부여된 IP 확인

  4. 컨테이너에서 실행중인 NGINX 웹서버 호출

  5. 호스트에 있는 네트워크 인터페이스 목록 확인

  6. 컨테이너 안에 있는 네트워크 인터페이스 목록 확인

  7. 컨테이너에 ip 프로그램 설치

  8. 컨테이너 안에 있는 네트워크 인터페이스 목록 확인

  9. 호스트에 있는 네트워크 인터페이스 목록 확인

  10. 컨테이너 로그 확인

  11. 컨테이너 삭제

  12. Docker 네크워크 목록 확인

  13. 컨테이너 재생성

  14. 컨테이너 안에 있는 네트워크 인터페이스 목록 확인

  15. 웹브라우저에서 Cloud9 인스턴스의 공인 IP로 접속되는지 확인 - 아래 명령어로 주소 확인 가능

  16. 연결에 실패할 경우에는 아래의 명령어를 실행해서 보안그룹에 인바운드 규칙 추가

  17. 컨테이너 삭제

  18. 컨테이너 재생성

  19. 웹브라우저에서 포트포워딩한 포트를 통해서 컨테이너로 접근되는지 확인 - 아래 명령어로 주소 확인 가능

  20. 연결에 실패할 경우에는 아래의 명령어를 실행해서 보안그룹에 인바운드 규칙 추가

  21. Iptable의 모든 규칙 확인

  22. DOCKER 규칙 확인

  23. 컨테이너 삭제

  24. DOCKER 규칙 확인

  25. 컨테이너 재생성

  26. 웹브라우저에서 포트포워딩한 포트를 통해서 컨테이너로 접근되는지 확인 - 아래 명령어로 주소 확인 가능

  27. Loopback 주소로 접속 시도

  28. 새로운 컨테이너 생성

  29. 새로 생성한 컨테이너에서 NGINX 컨테이너에 접근이 되는지 확인

  30. 컨테이너 삭제

  31. 새로운 Docker 네크워크 생성

  32. Docker 네크워크 목록 확인

  33. 위에서 생성한 Docker 네트워크를 사용하는 컨테이너 생성

  34. 새로 생성한 컨테이너에서 NGINX 컨테이너에 접근이 되는지 확인

  35. 새로 생성한 Docker 네트워크를 사용하는 Apache 컨테이너 생성

  36. 동일한 Docker 네트워크를 사용하는 컨테이너에서 Apache 컨테이너에 접근이 되는지 확인

  37. 컨테이너 이름으로 Apache 컨테이너에 접근이 되는지 확인

  38. 컨테이너 이름으로 도메인 주소 검색 시도

  39. Apache 컨테이너의 IP 주소 확인

  40. 리소스 정리

  41. 아래의 요구 사항에 맞게 컨테이너 이미지를 만들고 실행하세요.

    1. Docker Hub에 있는 mysql:5.7 이미지 사용

    2. 로컬호스트의 3366 포트를 컨테이너에서 실행되는 MySQL 데이터베이스의 포트와 연동

    3. 로컬호스트에서 아래의 명령어를 실행해서 DB에 접속

문제 답안

컨테이너 스토리지

  1. 리소스 정리

  2. MySQL 컨테이너 생성

  3. 데이터베이스 및 레코드 생성

  4. 위에서 생성한 데이터를 확인

  5. 만약 MySQL 컨테이너를 삭제하면 위에서 생성한 데이터는 어떻게 되나요?

  6. 컨테이너 생성에 사용된 명령 및 메타데이터(Dockerfile에 명시된 내용) 확인

  7. MySQL 컨테이너에 마운트된 볼륨 확인

  8. Docker 볼륨 목록 확인

  9. MySQL 컨테이너에 마운트된 볼륨 ID를 환경 변수로 저장

  10. 만약 MySQL 컨테이너를 삭제하고 재생성하면 위에서 생성한 데이터가 새로 생성된 컨테이너에 연동될까요?

  11. MySQL 컨테이너 재생성

  12. 데이터 확인

  13. Docker 볼륨 목록 확인

  14. MySQL 컨테이너 삭제

  15. MySQL 컨테이너 재생성

  16. 데이터 확인

  17. MySQL 컨테이너 삭제

  18. Docker 볼륨 목록 확인

  19. 사용하지 않는 볼륨 삭제

  20. Docker 볼륨 생성

  21. MySQL 컨테이너 생성

  22. MySQL 컨테이너에 마운트된 볼륨 확인

  23. 리소스 정리

  24. 디렉토리 생성

  25. HTML 문서 생성

  26. NGINX 컨테이너 생성

  27. NGINX 웹서버 호출

  28. HTML 문서에 내용 추가

  29. NGINX 웹서버 호출

  30. 컨테이너의 /usr/share/nginx/html 경로에 있는 파일 확인

  31. 컨테어너와 연동된 디렉토리에 새로운 파일 생성

  32. 컨테이너의 /usr/share/nginx/html 경로에 있는 파일 확인

  33. 컨테이너에서 호스트와 연동된 디렉토리에 새로운 파일 생성

  34. 로컬호스트의 $HOME/environment/nginx/html 경로에 있는 파일 확인

  35. 리소스 정리

  36. 아래의 요구 사항에 맞게 컨테이너 이미지를 만들고 실행하세요.

    1. my-app 이라는 이름의 Docker 볼륨 생성

    2. Docker 허브에 있는 NGINX 이미지로 컨테이너를 생성하고 위에서 생성한 my-app 볼륨을 /opt/app 경로에 마운트

    3. NGINX 컨테이너 /opt/app/ 경로에 hello.txt 파일을 생성하고 내용으로 world를 추가

    4. Docker 허브에 있는 Apache 이미지로 컨테이너를 생성하고 위에서 생성한 my-app 볼륨을 /usr/app 경로에 마운트를 하되 읽기 권한만 부여

    5. Apache 컨테이너 /usr/app/ 경로에 hello.txt 파일이 있는지 확인 하고 내용 확인

    6. Apache 컨테이너에서 /usr/app/hello.txt 파일을 열고 수정이 가능한지 확인

문제 답안
  1. my-app 이라는 이름의 Docker 볼륨 생성

  2. Docker 허브에 있는 NGINX 이미지로 컨테이너를 생성하고 위에서 생성한 my-app 볼륨을 /opt/app 경로에 마운트

  3. NGINX 컨테이너 /opt/app/ 경로에 hello.txt 파일을 생성하고 내용으로 world를 추가

  4. Docker 허브에 있는 Apache 이미지로 컨테이너를 생성하고 위에서 생성한 my-app 볼륨을 /usr/app 경로에 마운트를 하되 읽기 권한만 부여

  5. Apache 컨테이너 /usr/app/ 경로에 hello.txt 파일이 있는지 확인 하고 내용 확인

  6. Apache 컨테이너에서 /usr/app/hello.txt 파일을 열고 수정이 가능한지 확인

컨테이너 디버깅

  1. 리소스 정리

  2. NGINX 컨테이너 생성

  3. 컨테이너에서 프로세스를 실행하는 유저 확인

  4. 컨테이너에 생성되어 있는 유저 목록 확인

  5. NGINX 컨테이너 삭제

  6. NGINX 컨테이너 재생성하고 nginx 유저로 프로세스 실행

  7. 실행중인 컨테이너 목록 확인

  8. 모든 컨테이너 목록 확인

  9. NGINX 컨테이너 상태에 대한 상세 내용 확인

  10. NGINX 컨테이너 로그 확인

  11. NGINX 컨테이너의 로그 파일이 저장되는 경로 확인

  12. 로그 파일 내용 확인

  13. NGINX 컨테이너 삭제

  14. 삭제된 컨테이너의 로그 파일이 남아 있는지 확인

  15. NGINX 컨테이너 재생성

  16. NGINX 컨테이너 환경에 bash 프로세스 실행

  17. NGINX 설정 파일 확인

  18. NGINX 프로세스의 PID 파일이 생성되는 경로의 권한 확인

  19. 실행중인 프로세스 목록 확인

  20. 실행중인 프로세스의 리소스 사용량 확인

  21. bash 프로세스 종료

  22. NGINX 컨테이너에서 실행중인 프로세스 목록 확인

  23. NGINX 컨테이너가 사용중인 리소스 사용량 확인

  24. 새로운 컨테이너 생성

  25. 컨테이너가 실행중인지 확인하고 실행중이지 않다면 어떤 이유인지 확인

  26. 컨테이너 로그 확인

  27. 컨테이너 로그에 Hello, Docker가 출력되도록 컨테이너 생성

  28. 컨테이너 로그 확인

  29. 컨테이너 로그에 현재 시간이 출력 되도록 컨테이너 생성

  30. 컨테이너 로그 확인

  31. 리소스 정리

  32. 아래의 내용들을 수행해서 문제 해결

    1. 컨테이너 생성

    2. 컨테이너 안에 /app/password.txt 파일의 내용을 확인

    3. 새로운 컨테이너 생성

    4. 애플리케이션 로그 파일을 참고해서 애플리케이션이 정상적으로 실행되고 종료되도록 설정 애플리케이션이 정상 실행/종료되면 애플리케이션 로그를 통해서 다음 단계에서 필요한 정보를 확인 가능

    5. 새로운 컨테이너 생성

    6. TCP 서버가 구동중이고 이전 단계에서 확인한 암호를 TCP 서버로 전송하게 되면 다음 단계에서 필요한 정보를 확인 가능

    7. 새로운 컨테이너 생성

    8. 컨테이너 안에 /message.txt.gpg 파일이 GPG를 통해서 암호화 되어있습니다. 파일 내용을 확인하세요.

Last updated