컴공생의 발자취

[내일배움캠프 53일차 TIL] Docker Image와 Container 본문

🤝 활동/내배캠TIL

[내일배움캠프 53일차 TIL] Docker Image와 Container

MNY 2024. 7. 2. 22:37
728x90
반응형
2024.07.02.(화)
오늘의 진도 : docker 1주차까지...

실시간 강의에서 아바타 필터 켜놓고 열심히 졸은 나.. 칭찬해!
오늘의 학습, 코드카타, 오늘의 회고 이렇게 3개의 큰 틀로 나누어 정리할 것이다.

 

💡 오늘의 학습 키워드

- docker 1주차 -
CI/CD란 무엇인가?
Docker 사용 이유
Window Docker 설치
Container 실행 테스트
Docker 이미지
Docker Image와 Docker Container의 관계
Docker Container 삭제

 


 

CI/CD란 무엇인가?

: Continuous Integration/Continuous Deployment(Delivery)의 약자로, 지속적인 통합과 지속적인 제공을 의미

 

  • 기본 개념
    • 지속적인 통합(Continuous Integration)
    • 지속적인 서비스 제공 (Continuous Delivery)
    • 지속적인 배포(Continuous Deployment)
  • 단계
    • 코드 작성: 개발자들은 소스 코드를 작성하고 저장소(repository)에 업로드
    • 빌드: 저장소에서 최신 소스 코드를 가져와 빌드를 수행. 빌드는 소스 코드를 컴파일하고, 라이브러리를 추가하고, 필요한 파일을 생성하는 과정.
    • 테스트: 빌드된 결과물을 대상으로 테스트를 수행. 테스트는 기능이 정상적으로 작동하는지 확인하고, 버그를 발견하고 수정하는 과정.
    • 배포: 테스트를 통과한 결과물을 배포. 배포는 서버에 업로드하거나, 사용자에게 제공하는 과정

 

Docker 사용 이유

  • 애플리케이션 개발과 배포가 편해져요.
    • Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없어요.
    • CI/CD에서 지속적인 통합(Continuous Integration) 과정의 테스트에서 Docker를 활용해요.
    • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있어요.
  • 여러 애플리케이션의 독립성과 확장성이 높아져요.
  • Docker가 가상화에서 사실상 표준의 위치에요.

 

Window Docker 설치

  • Window wsl 설치
  • Ubuntu 22.04 설치
  • Ubuntu 22.04 에 최신 버전의 docker 설치
# docker engine gpg 키 등록
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# apt source 에 docker 관련 추가
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# docker engine 설치
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin docker-compose

# docker 그룹에 현재 계정을 등록하여 sudo 없이 docker 명령을 사용하게 함
sudo usermod -aG docker user
sudo service docker restart

# 새로운 터미널을 열고 확인
docker version

 

  • Windows 에 Docker Desktop 설치
  • Windows Docker Desktop 설정
    • 우측 상단 톱니바퀴 → 왼쪽 Resources → WSL Integration → Apply&restart

 

Container 실행 테스트

# nginx 이미지 다운받기
docker image pull nginx:1.25.3-alpine

docker images

docker image history nginx:1.25.3-alpine

docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine

docker ps | grep webserver01

docker port webserver01

curl localhost:8001

 

Docker 이미지

  • Docker Container 서비스를 위한 이미지는 Container 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않음(Immutable, Read-Only)
  • 상태 저장 없음(Stateless): 애플리케이션과 관련된 모든 파일과 라이브러리를 포함하고 있기 때문에, 다른 환경에서도 동일한 애플리케이션을 실행 가능
  • 불변성(Immutable): 이미지가 한번 생성되면 변경할 수 없는 것을 의미
  • 도커 이미지는 필요한 파일만 포함하고 있기 때문에, 용량이 작으며, 이미지를 변경할 필요가 있을 경우에는 새로운 이미지를 생성 필요

 

* docker pull: Docker 이미지 내려받기

  • hub.docker.com 에서 이미지를 제공받거나 해당 사이트로 이미지를 제공
  • Private Registry 서버를 통해 이미지를 제공받거나 제공 가능
더보기
# docker [image] pull [options] name:[tag]

# 최초에는 docker.io가 default registry로 설정됨.
docker pull debian[:latest]
docker pull library/debian:10
docker pull docker.io/library/debian:10
docker pull index/docker.io/library/debian:10
docker pull nginx:latest

# private registry 나 클라우드 저장소의 이미지를 받는 경우
docker pull 192.168.0.101:5000/debian:10 # 현재는 실제로 동작하지 않음
docker pull gcr.io/google-samples/hello-app:1.0

* docker image inspect: Docker 이미지 구조 확인

* docker image inspect: 생성된 이미지의 내부 구조 정보를 json 형태로 제공

더보기
docker image inspect --format="{{.Os}}" nginx:latest
linux
docker image inspect --format="{{.RepoTags}}" nginx:latest
[nginx:latest]
docker image inspect --format="{{.ContainerConfig.ExposedPorts}}" nginx:latest
map[80/tcp:{}]
docker image inspect --format="{{.RepoTags}} {{.Os}}" nginx:latest
[nginx:latest] linux

* docker image history: Dockerfile에 대한 정보

  • 여러 개의 계층 구조로 구성

* docker pull: 이미지가 계층 구조인 것을 확인

  • 다운로드된 계층들 정보는 전용 경로에 저장
더보기
docker pull nginx:latest
latest: Pulling from library/nginx
a378f10b3218: Pull complete
5b5e4b85559a: Pull complete
508092f60780: Pull complete
59c24706ed13: Pull complete
1a8747e4a8f8: Pull complete
ad85f053b4ed: Pull complete
3000e3c97745: Pull complete
Digest: sha256:add4792d930c25dd2abf2ef9ea79de578097a1c175a16ab25814332fe33622de
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

* Docker login/logout : hub.docker.com에서 회원가입 후 실행

더보기
docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/

Username: {자신의 계정}
Password: {자신의 암호}
Login Succeeded

$ docker logout
Removing login credentials for https://index.docker.io/v1/
  • 명령을 통해 등록 후 관리되는 Access Token 리스트

 

Docker Image와 Docker Container의 관계

* Docker Image와 Docker Container의 관계

  • Image: 컨테이너에 대한 OS, Application, Library 등등의 정보를 담고 있음
  • Container: Image를 실행한 상태. 1개의 Image로 부터 N개의 Container를 생성할 수 있는 1:N의 관계.
    • Image는 내가 만들고 싶은 붕어빵의 정보를 갖고 있는 틀이라면, Container는 구워낸 붕어빵

* Docker Container 수동 생성

더보기
docker pull ubuntu:22.04
docker images

# docker create 은 실제 실행하지 않고 컨테이너 생성만
docker create –ti --name ubuntu2204test ubuntu:22.04
docker ps –a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS    PORTS     NAMES
2ccc1b2a1144   ubuntu:22.04   "/bin/bash"   4 seconds ago   Created             ubuntu2204test

docker start ubuntu2204test
Ubuntu2204test
docker attach ubuntu2204test

# docker run 은 create/start/attach 를 순차적으로 한 번에 실행하는 것과 같음 
docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash
root@57a1a1c759b6:/#

* Docker Container는 프로세스

더보기
docker run -ti --name=ubuntu2204test3 ubuntu:22.04 /bin/bash
root@1cd125b32870:/#

# 터미널을 한 개 더 열고 
ps -ef | grep ubuntu2204test3
user   9710  7637  0 17:17 pts/4    00:00:00 docker run -ti --name=ubuntu2204test3 ubuntu:22.04 /bin/bash
user   9921  9377  0 17:17 pts/5    00:00:00 grep --color=auto ubuntu2204test3

* Container 명령 테스트

cd ~
mkdir nodejsapp
cd nodejsapp
vi app.js # 테스트용 nodejs 앱
vi Dockerfile # 새로운 도커 이미지를 위한 Dockerfile
docker buildx build -t node-test:1.0 . # 1.0 태그를 추가하여 node-test라는 이미지를 빌드 
docker images | grep node-test  # 빌드 완료한 이미지 보기
docker image history node-test:1.0 # 1.0으로 태그 추가한 이미지의 Dockerfile history
docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0
docker ps | grep node-test
curl http://localhost:6060

* docker run 자주 사용하는 옵션

  • -d: detached mode; 백그라운드 모드
  • -p: 호스트와 컨테이너의 포트를 연결(포워딩)
  • -v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
  • -e: 컨테이너 내에서 사용할 환경변수 설정
  • -name: 컨테이너 이름 설정
  • -rm: 프로세스 종료 시 컨테이너 자동 삭제
  • -ti: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션

* 실행 중인 Container에 대한 정보

# 컨테이너에서 실행 중인 프로세스 조회
docker top node-test 

# 컨테이너에 매핑된 포트 조회
docker port node-test

# 컨테이너 리소스 통계 출력 (1회)
docker stats node-test --no-stream

# 컨테이너 리소스 통계 출력 (스트림)
docker stats node-test

--------------------------------------
[docker logs]

# 표준 출력(stdout), 표준에러(stderr) 출력
docker logs node-test 

# 로그를 계속 출력
docker logs –f node-test

# 출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용
docker info | grep -i log

--------------------------------------
[docker [container] inspect]

# 컨테이너 내부 확인
docker inspect node-test

--------------------------------------
[ docker stop | start | pause | unpause ]

# 터미널1, 도커 상태 확인
docker stats

# 터미널2, 도커 프로세스 이벤트 확인
docker events

# 터미널3, docker start
docker stop node-test
docker ps –a
docker start node-test

# 
docker pause node-test
docker unpause node-test
docker ps -a

* docker exit code

 

  • 0 : Docker Process가 수행해야 할 모든 Command 또는 Shell을 실행하고 정상 종료
  • 255 : Docker Image에 정의된 EntryPoint 또는 CMD가 수행이 완료되었을 경우 발생
  • 125 : Docker run 명령어의 실패로 실제 docker process가 기동되지 않음
  • 126 : Docker Container 내부에서 Command를 실행하지 못할 경우 발생
  • 127 : Docker Container 내부에서 Command를 발견하지 못하였을 경우 발생
  • 137 : kill -9로 인해 종료 됨
  • 141 : 잘못된 메모리 참조하여 종료 됨
  • 143 : Linux Signal로 정상 종료 됨
  • 147 : 터미널에서 입력된 정지 시그널로 종료 됨
  • 149 : 자식 프로세스가 종료 되어 종료 됨

 

Docker Container 삭제

* 실행 중이 아닌 모든 컨테이너를 삭제

# 중지된 컨테이너를 포함하여 모든 컨테이너 리스트
docker container ls -a

# 
docker container prune

* 태그가 붙지 않은(dangling) 모든 이미지 삭제

# 
docker image prune

# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls

* 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제

docker system prune

 


코드 카타

* 프로그래머스로 진행

 

  • SQL
    • 서울에 위치한 식당 목록 출력하기

 


오늘의 회고

  • 12시간 중 얼마나 몰입했는가?

그래도 하고자 했던 건 한 것 같다.

물론 다하지는 못했지만,..

몰입 자체는 아침에 잠에서 깼을 때가 가장 몰입해서 한 것 같다.

그러니까 1시간 정도..?

 

  • 오늘의 생각

아니 학습할 거 너무 많네 진짜..

시간을 쪼개고 쪼갠다!

테스트 코드를 잘 짜는 개발자가 되고 싶은데.. 테스트 코드가 제일 어렵다.

근데 그래도 뭔가 테스트 코드 짤 때가 제일 즐거워! 이유는 모르지만±

아 이거 물결표 진짜.. 망할 맥 같으니라구

 

  • 내일 학습할 것은 무엇인지
    • 오전
      • 면접 준비
      • 코딩테스트 1문제라도 풀기 : 알고리즘 또는 SQL
      • 자격증 공부
    •  오후
      • 책 읽기
      • docker 2주차 보기
      • 개인과제
728x90
반응형