HyeLog

[생활코딩] Docker 입문 본문

DevOps/Docker

[생활코딩] Docker 입문

shj718 2023. 4. 21. 07:47

생활코딩 Docker 입문 강의를 정리한 내용입니다.

1️⃣ Docker Image, Container

-우리는 OS위에 여러 SW들을 설치해야함(Ex. DB, Web Server, 다른 앱 등등)

→ 근데 환경설정이 매우 어려움

→ DB, Web Server, 다른 앱 등등이 각자의 OS를 가져서 우리는 쓰기만 하면 된다면? 편하지만 너무 낭비임

→ 그래서 Docker Container등장! Docker는 DB, Web Server, 다른 앱 등등이 각자의 격리된 Container 안에서 실행되게 하는 것. 이때 이 Container들과 이 Container 속 DB, Web Server, 다른 앱 등등은 모두 Linux OS 위에서 동작함! (그래서 우리가 수업시간에 AWS EC2 Ubuntu 위에서 도커 씀)

관련 족보 문제)

29. container는 OS kernel을 포함하는가?
정답) 아니요

-앱스토어에서 필요한걸 내 컴퓨터에 다운로드 받은게 Program, 그걸 실행시킨게 Process임, 마찬가지로 Docker Hub에서 필요한걸 내 컴퓨터에 다운로드(pull) 받은게 Image고, Image를 실행(run)시킨게 Container임, 하나의 Image에 여러 Container 존재 가능

$ docker pull httpd # Apache '이미지'를 다운로드 받는 명령어
$ docker images # 잘 다운로드 받아졌는지 이미지들을 확인하는 명령어
# docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
$ docker run httpd # Apache '이미지'를 실행시켜서 '컨테이너'로 만드는 명령어
$ docker ps # 현재 '실행중'인 컨테이너 보여주는 명령어

-하나의 Image로 여러개의 Container 만들 수 있음 (—name 옵션 사용)

$ docker run --name ws2 httpd # ws2라는 이름의 httpd 컨테이너 생성

-실행중인 컨테이너를 끌 수 있음 (더이상 docker ps 를 했을때 보이지 않음) (BUT 삭제된건 X)

$ docker stop ws2 # ws2라는 이름의 컨테이너 중지
# $ docker stop [컨테이너 ID] <- docker ps 로 확인 가능

-실행중/중지 컨테이너를 ‘전부’ 보고싶다면

$ docker ps -a

-중지시킨 컨테이너를 다시 실행하고 싶다면

$ docker start ws2 # ws2라는 이름의 컨테이너 다시 실행

-로그를 확인하고 싶다면 (—f 옵션을 붙이면 ‘실시간’ 로그)

$ docker logs ws2
$ docker logs -f ws2

-컨테이너를 아예 삭제하고 싶다면 (중지된 것만 가능, 실행중인 걸 삭제하고 싶으면 —force 옵션 추가)

$ docker rm ws2
# $ docker rm --force ws2

-이미지를 삭제하고 싶다면

$ docker rmi httpd

 

2️⃣ Docker Container 접속 (ft. 포트 번호)

-이제, Docker와 네트워크에 대해 알아보자!

하나의 Host(Ex. AWS EC2)에는 여러 Container가 존재 가능하다. 이때 호스트도 자기만의 포트번호와 파일시스템을 가지고 있고, 각 컨테이너도 자기만의 포트번호와 파일시스템을 가지고 있다. 웹브라우저에서 접속(Ex. http://localhost:80/index.html)하는 포트번호는 호스트의 포트번호이므로, 특정 컨테이너의 포트번호와 연결시켜주는 작업이 필요하다. 이는 아래와 같은 명령어로 가능하다.

$ docker run -p 80:80 httpd

⭐ 여기서 앞의 80은 호스트의 포트번호이고, 뒤의 80은 컨테이너의 포트번호이다. (시험 출제) ⭐

 

3️⃣ Container 명령어 실행하기

-이제 호스트 속 컨테이너 안에 들어가서 명령어를 수행하는 방법에 대해 알아보자!

그냥 docker exec [컨테이너 이름] [명령어] 를 하면, 그 명령어가 1번만 실행되는 것이고,

여기에 -it 옵션을 붙여서 docker exec -it [컨테이너 이름] /bin/bash 를 하면,아예 컨테이너 속 shell을 실행시킬 수 있음 (-it 옵션은 사실 —interactive, —tty 를 합친건데 걍 외우자)

다시 Host로 빠져나오려면 exit 치면 됨

$ docker exec ws2 pwd # ws2라는 이름의 컨테이너 속에서 pwd(print working directory) 명령어 실행
$ docker exec -it ws2 /bin/bash # (또는 bin/sh) 아예 컨테이너 속으로 들어가서 계속 쉘 상태
$# ls -al # ws2 안에서 ls -al 명령어 실행
$# exit # 다시 호스트 기계로 돌아감

→ 이걸 이용해서 컨테이너 속 index.html 을 수정할 수 있음

 

4️⃣ Host 파일시스템과 Container의 파일시스템 연결

-이제… Host의 파일시스템과 Container의 파일시스템을 연결해보자…!

왜 이런짓을 해야하냐고?

일단 가장 큰 이유는 컨테이너 안에 작성한 코드는 컨테이너가 삭제되면 같이 삭제되어 버림…

그리고 이렇게 하면, 컨테이너는 계속 실행중으로 놔두고, 코드 수정은 호스트에 있는 파일에 할 수 있음 → 일종의 버전 관리가 가능해짐! 수정하고 반영하고 수정하고 반영하고… 이런식…

docker run httpd 에 -v [호스트 index.html 위치]:[컨테이너 index.html 위치] 옵션을 추가!!!

(-v 는 --volume 임!)

# 호스트 파일시스템에 있는 ~/Desktop/htdocs 디렉토리를 
# 컨테이너 파일시스템에 있는 /usr/local/apache2/htdocs/ 와 연결시킴
# (참고로 /usr/local/apache2/htdocs/ 는 Docker 공식 사이트의 httpd 매뉴얼에 지정되어 있음)
# (웹브라우저에서 접속시 해당 위치의 index.html 파일이 보여짐)
$ docker run -p 8080:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd