Docker 입문
웹 개발을 하기 위해서는 운영체제, 웹 서버, 데이터베이스 등 여러가지 소프트웨어들을 설치해야 한다.
이것은 정말 까다롭고 힘든 작업이다.
이 상황 끝에 나온 것이 바로 Docker 이다.
생각의 흐름
1. 환경 제공 -> 컴퓨터가 여러대...?
한 사람이 컴퓨터를 구해서 운영체제를 설치하고 웹 서버를 설치하고, 데이터베이스를 설치한 것을 제공해준다면, 우리는 그냥 우리의 앱에서 그것들을 가져다 쓰기만 하면 될 것이다.
2. 가상 환경 -> 운영체제 위에 운영체제... 너무 무거움
비슷하게 하나의 컴퓨터에 가상의 컴퓨터를 만들고 그 위에 운영체제, 웹 서버, 데이터베이스를 설치한다면 우리는 여러 개의 가상 환경을 하나의 컴퓨터로 사용할 수 있을 것이다.
3. 운영체제를 공유한 채 필요한 것들만을 담은 가상 환경
각각의 앱은 격리된 환경에서 실행된다. 이때 운영체제가 설치된 컴퓨터를 host 라고 할 때 host 에서 실행되는 격리된 각각의 실행 환경을 container 라고 한다. 각각의 컨테이너에는 운영체제 전체가 있는 것이 아니라 lib, bin 이라는 앱을 실행에 필요한 라이브러리와 실행파일들이 포함되어 있다.
Docker 배경지식
Docker 위에 있는 컨테이너, 컨테이너 안에서 동작하는 각각의 앱들은 리눅스 운영체제 기반이다.
리눅스 운영체제 사람들은 Docker 같은 컨테이너를 바로 사용 가능하고 윈도우, 맥 기반은 리눅스 운영체제를 깔고 사용해야 하지만 그 과정, 효율은 Docker 가 알아서 해결해준다.
docker hub : 우리가 프로그램을 app store 에서 찾듯이 필요한 소프트웨어를 찾는 곳
image : 다운로드 해서 컴퓨터에 가지고 있는 program 같은 것
container : 프로그램을 실행하는 것을 process 라 하는 것 처럼 image 를 실행하는 것
네트워크 관련
파일 시스템 : 파일들이 저장되어 있음
웹 서버 : 소프트웨어중 하나로 파일시스템과 연결되어 있어 요청이 들어오면 그것을 가져다 줌
port : 컴퓨터에 있는 수 많은 포트들로 소프트웨어들과 연결이 되어 있음
example.com : 웹 서버가 설치된 컴퓨터의 주소
http://example.com:80/index.html 주소 입력 :
컴퓨터 주소의 80 번 port 로 접속 -> 웹 서버가 index.html 파일을 읽어서 전달
위와 다르게 Docker
docker run httpd : image 를 설치
docker 에서는 웹 서버는 컨테이너에 설치되어 있음
Docker Host : 컨테이너가 설치된 운영체제
Host 와 Container 모두 독립적인 파일 시스템이 있다.
docker run -p 80:80 httpd : local host 의 port 연결과 docker host 의 port 연결이 두 가지 이기 때문에 이를 표시해주어야 한다.
Docker 컨테이너에 있는 파일 시스템 접근 (터미널)
docker 에서 터미널을 열어서 사용한다.
우리 커멘트라인에서 컨테이너의 파일시스템을 접근하는 방법
docker exec NAME 명령어 : NAME 의 컨테이너에서 명령어를 실행한다.
docker exec -it NAME /bin/bash : NAME 의 컨테이너의 쉘을 실행하고 유지한다.
exit : 다시 우리 터미널로 나가기
이때 이 컨테이너가 사라진다면 파일들은 없어지게 된다. 그것을 위해 우리의 컴퓨터와 컨테이너의 파일이 연결되도록 하는 방법이 있다.
Local 과 Docker 파일시 스템 연동
docker run -p 8888:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/httpd : 8888 포트와 80 포트를 연결하고 우리 Local 의 파일과 컨테이너 안에서 데이터를 찾자고 약속되어 있는 디렉토리를 연결시킨다.
웹 서버의 파일 시스템 파일 변경하기
/usr/local/apache2/htdocs/ : 라는 곳에 컨테이너 안에 있는 파일 시스템이 있다.
우리는 컨테이너의 터미널을 여러 위의 파일 안에 있는 index.html 을 만들고 변경해야 한다.
그러기 위해서는 nano 나 vim 을 설치해야 한다.
apt update : apt 업데이트
apt install nano : nano 설치
기본 문법
docker hub > contatiners 에서 원하는 image 다운로드/설치
docker pull httpd : 레지스토리에서 httpd 라는 이미지 다운로드
docker images : 현재 있는 image 들 보기
*Container name : image 로 컨테이너들을 만들 때 서로 구별해주기 위해 이름 지어줌
docker run httpd : httpd 라는 컨테이너 만들고 실행
docker ps : 현재 실행중인 컨테이너 표시
docker run --name NAME httpd : NAME 이라는 컨테이너 만들고 실행
docker stop NAME : NAME 이라는 컨테이너 종료
docker ps -a : 모든 컨테이너 표시
docker start NAME : NAME 이라는 컨테이너 시작
docker logs NAME : NANE 이라는 컨테이너 로그 보기
docker logs -f NAME : NAME 이라는 컨테이너 로그 계속 실시간으로 보기
docker rm NAME : NAME 이라는 컨테이너 삭제
docker rmi NAME : NAME 이라는 이미지 삭제
docker run --name NAME -p 8080:80 httpd : NAME 이라는 컨테이너를 만들고 포트는 8080:80(host 포트 : 컨테이너 연결포트) 으로 연결해서 만들고 실행
docker exec -it NAME or container-id /bin/bash : NAME 이라는 컨테이너에서 쉘 실행
참고 자료: