HyeLog
[생활코딩] Docker 입문 본문
생활코딩 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