이식성: 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성
한 마디로 쉽게 하자면 “나는 되던데?” 문제를 해결하기 위한 도구이다.
팀원과 함께 MySQL을 설치한다고 가정을 해보자.
나는 정상적으로 MySQL을 설치하였지만, 팀원의 컴퓨터에서는 MySQL 설치 도중 에러가 발생하는 것이다. 둘은 설치 과정을 동일하게 진행했는데도 이런 경우가 발생한다.
이러한 이유는 다양한 이유가 있다. 버전이 다르다거나, 운영체제(Windows, Mac OS 등)가 다르다거나, 컴퓨터에 깔려있는 다른 프로그램과 충돌이 났거나 등등 다양한 이유로 정상적으로 설치가 진행되지 않는 것이다. 설치 과정이 복잡하다면 새 컴퓨터를 사서 MySQL 설치할 때 번거롭고 귀찮다고 느껴진다.
이러한 불편함을 해결하기 위해서 나온 도구가 Docker
인 것이다. Docker 명령어 한 줄로 어떤 컴퓨터에든 MySQL을 설치하고 실행할 수 있게 되는 것이다.
아래와 같은 장점도 있다!
Docker란 컨테이너를 사용하여 각각의 프로그램을 분리된 환경에서 실행 및 관리할 수 있는 도구이다.
윈도우 환경에서 ‘하나’의 컴퓨터로 ‘여러’ 사용자를 나눠서 사용할 수 있다. 각 사용자의 환경에 따라 ‘독립적’으로 구성이 되어있기 때문에 A 사용자에게 깔려있는 프로그램을 B 사용자는 이용할 수 없다.
컨테이너도 이와 비슷한 개념이다. 하나의 컴퓨터 환경 내에서 ‘독립적인’ 컴퓨터 환경을 구성해서, 각 환경에 프로그램을 별도로 설치할 수 있게 만든 개념이다.
출처: https://www.docker.com/resources/what-container
호스트(host): 도커가 띄운 컨테이너를 관리하는 곳 (컨테이너와 컨테이너를 포함하고 있는 컴퓨터)
컨테이너는 ‘독립적인 컴퓨터 환경’을 가지고 있다.
이미지 = 닌텐도 칩
MySQL 서버를 이미지로 만들었다면, 이 이미지를 Docker로 실행시키는 순간 MySQL 서버가 컨테이너(Container) 환경에서 실행된다. MySQL을 일일히 설치할 필요 없이 MySQL 데이터베이스를 사용할 수 있다.
다른 예로, 우리의 백엔드 서버를 빌드 후 jar 파일로 만들어 Docker 이미지로 빌드한 후, 이 이미지를 실행시키는 순간 컨테이너 환경에서 Spring Boot Application이 실행이 됩니다.
이미지(Image)는 프로그램을 실행하는데 필요한 설치 과정, 설정, 버전 정보 등을 포함하고 있습니다. 이 말은 즉, 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다!
이미지는 docker hub 에서 가져옵니다.
- 이미지 다운로드
- 명령어:
docker pull ‘image-name’
- 이미지마다 버전은
TAG
로 관리된다.- 버전을 명시하여 이미지 다운로드:
docker pull 'image-name':'tag-name'
- default: latest
다운받은 이미지 리스트
docker image ls
이미지 삭제
docker image rm 'image-id'
| docker image rm 'imgae-name'
docker image rm -f 'image-id'
docker image rm $(docker images -q)
컨테이너 생성 → 이미지 기반으로 생성된다.
docker create ‘image’
생성된 컨테이너 확인
docker ps -a
컨테이너 실행
docker start ‘container-id'
컨테이너 중지
docker stop 'container-id'
docker kill 'container-id'
컨테이너 삭제
docker rm 'container-id'
생성 및 실행
docker **run** 'image'
-d
: back-ground 환경 (docker run -d ‘image’
)- 포그라운드(fore-ground): 내가 실행시킨 프로그램의 내용이 화면에서 실행되고 출력되는 상태
- 실시간으로 로그를 확인할 수 있다. / 다른 명령어를 입력할 수 없다.
- 백그라운드(back-ground): 내가 실행시킨 프로그램이 컴퓨터 내부적으로 실행되는 상태
- 다른 명령어를 입력할 수 있다. / 로그를 실시간으로 확인할 수 없다.
--name
: docker container 이름 지정 (docker run -d —name web-server ‘image’
)-p
: 포트 포워딩 - 컨테이너 접속할 수 있도록 포트를 맞춰주는 과정#docker run -d -p [호스트 포트]:[컨테이너 포트] 이미지명[:태그명]
$ docker run -d -p 4000:80 nginx
컨테이너 조회
docker ps
docker ps -a
컨테이너 삭제
docker rm 'container-id'
docker rm -f 'container-id'
docker rm $(docker ps -qa)
컨테이너 로그 조회
docker logs 'container-id'
| docker logs 'container-name'
--tail '라인 수'
: 마지막 기준, 라인 수만큼 출력-f
: 실시간으로 로그를 확인할 때 사용# 이전의 로그를 제외하고, 현 시점부터 로그를 볼 때
$ docker logs --tail 0 -f <container-id> 혹은 <container-name>
참고 강의 : Docker 강의 - JSCODE 박재성