docker는 컨테이너라는 표준화된 유닛으로 패키징하여, 이 컨테이너 안에 라이브러리, 코드, 시스템 환경등 소프트웨어를 실행하는데 필요한 모든것들이 포함되어 있다. 따라서 이 docker를 사용하면 환경에 상관없이 신속하고 빠르게 코드를 실행할 수 있다.
우리 개발자들은 개발을 하면서 환경만 구축하는데 많은 시간을 소비하게 된다. 예를들어 어떤 프로젝트를 개발하면서 다른 프로젝트 라이브러리의 버전과 겹쳐 에러가 나고 다른 개발자 컴퓨터에서는 잘 작동하지만 OS가 달라서 안되고 이 뿐만아니라 다양한 문제로 개발하는데 많은 어려움을 겪게 된다.
그래서 Docker는 Container를 활용하여 각각의 환경을 분리하여 관리해 더 편리하게 개발 할 수 있는 환경을 제공한다.
컨테이너란 쉽게 말해 미니컴퓨터라고 할 수 있다.
쉽게 말해 호스트 컴퓨터(실제 우리 컴퓨터)에서 Container라는 가상의 컴퓨터를 만드는 것이다. 그래서 옆에 사진을 보면 OS단에서 각각의 컨테이너로 분리하여 격리된 라이브러리, 네트워크, 파일시스템을 가질 수 있다.
하지만 이 컨테이너는 호스트 컴퓨터 안에 있는것이기 때문에 메모리나 cpu와 같은 하드웨어는 나누어 실행하게 된다.
이미지란 코드, 시스템 도구, 라이브러리 및 설정등 어플리케이션 실행에 필요한 모든것을 포함하고 있는 경량의 실행형 소프트웨어 패키지이다.
이 이미지는 위에서 설명한 컨테이너를 만들기 위한 압축 파일이라고 할 수 있다. 이 이미지에 컨테이너의 환경을 만들기 위한 모든 내용이 담겨있고 이 이미지를 활용하여 컨테이너를 만들면 이 이미지에 담긴 컴퓨터의 내용에 따라 그대로 컨테이너가 만들어지게 된다.
이 docker가 나오게 된 배경은 출시전 오클랜드 항구에 들어오는 모든 컨테이너 선박을 볼 수 있었고
“한 서버에서 다른 서버로 앱을 옮기는 것보다 지구 반대편에서 자동차를 배송하는 것이 더 쉽다”
는 사실이 해결해야 할 문제처럼 보였다고 한다.
이 당시 클라우드 환경에서 어플리케이션을 배포하는데 어려움이 있었다고 한다. 커져가는 클라우드 환경에서 서버가 10대라면 관계없겠지만 수천대를 관리하게 된다면 기존 가상화 기술을 사용하였을때는 많은 리소스가 소모되고 대규모 관리가 어렵다는 사실이 있었다.
따라서 전체 운영체제를 가상화하는 대신에 애플리케이션과 해당 종속성만 가상화 하는것이 더 효율적이라는 것을 깨달고 docker의 컨테이너 개념을 만들게 되었다.
도커에서 말하는 컨테이너의 정의
컨테이너는 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행될 수 있도록 코드와 모든 종속성을 패키징 하는 표준 소프트웨어 단위입니다.
Docker 컨테이너 이미지는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정 등 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 경량의 독립 실행형 소프트웨어 패키지입니다.
컨테이너화는 동일한 기본운영체제 커널에서 다른 컨테이너와 공유하지만 격리된 환경에서 애플리케이션을 실행하는 방법이다. 하지만 Virtual machines는 하이퍼바이저위에 여러개의 Guest OS를 실행시켜 호스트 OS커널을 사용하여 격리된 여러개의 컨테이너를 사용하는 방법보다 더 무겁다.
좀 쉽게 말해 Virtual machines는 각 단위별로 OS를 따로 두는것이고 Container는 한 호스트 OS에서 가상으로 나누어 관리하는것이다.
따라서 기존의 방식인 Virtual machines보다 docker 컨테이너 방식이 더 효율적이고 가볍다.
우리 호스트 컴퓨터에서 가상의 컨테이너를 만들기 위해 docker hub에 올라와 있는 이미지를 pull 받아온다.
📌 docker hub란 github처럼 github는 코드저장소이지만 docker hub는 이미지를 저장하고 있다고 생각하면 편하다.
pull 받는 이미지는 사람들이 컴퓨터 환경을 이미지로 올린것이다. 즉 mysql을 실행할때 필요한 모든 환경이 구축되어 있는 이미지를 pull 받고 싶다면 먼저 docker hub에 올라와 있는지 확인을 한다.

이렇게 검색했을때 있는것을 확인할 수 있다. 그럼 아래 명령어에 이미지명을 넣어 pull을 받으면 된다.
docker pull <이미지명>
지금 내 컴퓨터에 pull 받은 이미지를 보는 명령어 이다.
👉🏻 옵션 : -aq를 붙이면 이미지 id들만 나오게 된다.
-는 축약하는걸 나타내고 --는 pull name을 나타낸다. a는 all q는 quiet의 축약형이다. quiet 말그대로 조용히 id만 달라는 뜻이다.
docker image ls
이미지 삭제할때 이 이미지로 실행중인 컨테이너가 있다면 그 컨테이너를 시키고 -f로 다같이 삭제를 시켜야한다. 아니면 none으로 들어가게 된다. -f는 fouce로 힘이라는 뜻이다.
docker image rm <이미지 명 또는 id>
👉🏻 옵션 : -a, -aq
ps의 뜻은 prosess status 이다.
docker ps
docker pull → create → start = run
컨테이너를 실행시키는 방법은 2가지가 있는데 왼쪽처럼 pull 받고 create하고 start하는 방법과 그냥 run 한번 실행시키는 방법이 있다.
1번째 방법 docker pull → create → start
pull은 위에 이미지 관련명령어에 있는 방법대로 하면되고 그 다음 아래 순서대로 creae, start 하면 된다.
👉🏻 옵션 : -p 포트설정
-p 다음 :을 사이에 두고 두가지 포트가 들어오는데 왼쪽 포트는 호스트 컴퓨터로 들어오는 포트이고 오른쪽 포트는 컨테이너로 들어오는 포트이다 이 두 포트를 매핑해주는것이다.
docker create -p 4000:80 nginx
docker start nginx
2번째 방법 위에 pull, create, start를 한번에 할 수 있는 명령어가 run이다. 따라서 아래와 같이 실행시켜주면 된다.
👉🏻 옵션 : --name 이름설정, -d 백그라운드 설정
run을 시키면 보통 바로 포그라운드로 컨테이너를 실행시켜서 나오는 log들을 볼 수 있는 환경으로 들어와진다. 하지만 이러면 다른 작업을 하지못하기 때문에 -d 백그라운드로 설정해준다.
docker run --name mysql-container -d -p 3306:3306 mysql:latest
docker stop <컨테이너 명 또는 id>
docker kill <컨테이너 명 또는 id>
kill은 stop과 같은 개념이지만 강제종료의 의미를 가지고 있다.
docker rm <컨테이너 명 또는 id>
docker logs <컨테이너 명 또는 id> # 로그보기 -d 에서
docker logs --tail 10 <컨테이너 명 또는 id> # 최근 로그 10개만 가져오기
docker logs -f <컨테이너 명 또는 id> # -f flow의 약자로 요청들어오는것도 다 볼 수 있고 포그라운드 상태에서 볼 수 있게 된다. (로그 계속 업데이트 되는것을 확인 할 수 있다.)
docker logs --tail 0 -f <컨테이너 명 또는 id> # tail로 0개를 가져오면 지금 부터 실시간으로 뜨는 로그만 확인할 수 있다.
docker exec -it <컨테이너 명 또는 id> bash
exec는 execute 실행하다 라는 뜻이다.
it는 interactive + tty로 가상터미널(tty)로 상호작용하겠라는 뜻이다.
마지막 bash는 bash 셸로 들어가는것을 나타낸다.
🚧 접속후 다시 나오는 방법은 터미널에 exit를 치거나 아니면 control + d를 누르면 된다.