2023. 2. 27. 01:19ㆍTools/Docker
0. Docker?
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼으로, 컨테이너를 사용하여 응용 프로그램을 더 쉽게 개발, 배포 및 실행할 수 있습니다.
도커 소프트웨어의 실행에 필요한 모든 것을 컨테이너라는 독립된 파일 시스템 안에 담는다.
여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 모든 것이 담길 수 있다.
도커는 응용 프로그램과 그 의존성을 가상 컨테이너에 담을 수 있는 도구이며, 이 컨테이너는 도커만 설치되어 있다면 어디서든 구동 가능하다.
실행 환경을 일정하게 유지할 것을 보장한다.
출처 : https://ko.wikipedia.org/wiki/도커_(소프트웨어)
1. Why Docker?
가. VM
일정한 실행환경을 조성하기 위해서 OS부터 응용 프로그램까지 공간을 분리시킬 수 있다.
가상머신을 통해서 구현하면 독립된 실행환경을 구현할 수 있었다.
문제는 이 과정에서 OS를 독립된 가상머신만큼 설치해야 하는 문제가 발생했다.
이 방법은 느리고 용량을 많이 차치한다.
출처 : https://youtu.be/Ps8HDIAyPD0
나. LXC
리눅스에서는 독립된 실행환경을 조성하기 위해서 별도의 OS를 중복 설치할 필요 없이 꼭 필요한 라이브러리와 실행파일만 포함하는 container라는 기능을 제공한다.
출처 : https://youtu.be/Ps8HDIAyPD0
다. Docker
도커도 원래는 컨테이너를 실현하기 위해 LXC을 사용하고 있었다.
LXC는 리눅스에 특화되어 있는데 이는 시스템을 구성하는 핵심적인 요소가 외부 시스템에 의존한다는 문제로 이어졌다.
이에 Docker 0.9 버전부터는 기본으로 직접 만든 자체 컨테이너(libcontainer)를 사용하고 있다.
Docker는 단순한 컨테이너의 구현을 넘어 다양한 플랫폼에서 실행가능해졌고 지금은 컨테이너 기반 가상화 에코시스템마저 구축하고 있다.
또한 도커는 LXC와 달리 여러 Layer를 쌓아서 컨테이너를 만든다.
비교적 자주 변경되는 Layer를 상단에 위치시켜서 하단에 위치한 Layer는 다시 작업하지 않고 재사용할 수 있게 한다.
하나의 Layer로 컨테이너를 구성할 때보다 업데이트 작업의 효율성을 높였다.
출처 : https://www.redhat.com/ko/topics/containers/what-is-docker
2. Let’s Docker
기본적으로 도커를 구동하기 위해서는 Linux가 필요하다.
리눅스가 아닌 다른 운영체제를 사용하고 있어도 도커에서 알아서 Linux를 설치해 준다.
그러니 우리는 도커만 잘 설치하면 된다.
출처 : https://youtu.be/L3ZpudSF0HU
가. Docker 설치하기
#MacOS Homebrew 사용시
brew install Docker --cask
이런 GUI 환경도 제공한다.
terminal에 도커 관련해서 대충 아무 명령어를 입력하고 잘 동작하는지 확인한다.
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
3. Use Docker
본격적으로 도커를 사용하는 방법을 배워보자.
가. Docker 이미지 가져오기
Docker image라는 것이 있다.
Docker 이미지는 컨테이너를 만들기 위한 실행 가능한 패키지다.
즉, 리눅스를 사용하기 위해서 리눅스 이미지가 필요할 수도 있고, node.js를 사용하기 위해서 node.js 이미지가 필요할 수도 있다.
다행히 직접 이미지를 만들 필요 없이 Docker Hub에서 많은 이미지를 검색하고 사용할 수 있다.
Docker Hub에서 이미지를 가져오려면 docker pull
명령어를 사용한다.
docker pull 이미지이름
가져온 이미지를 확인하는 방법은 다음과 같다.
docker images
실습
지금 터미널을 열어서 확인한 결과 나의 node.js의 버전은 18.13.0이다.
dockerhub에서 검색해서 원하는 이미지를 찾는다.
일부 유명한 프로그램의 경우 docker에서 official로 이미지를 제공한다.
옆에 버튼을 눌러서 커맨드를 복사하고 터미널에 입력한다.
docker pull node
구체적인 버전을 설정하지 않았다.
이를 위해서 조금 뒤적거린 결과… 2023년 02년 24일 기준 node.js를 LTS버전인 18.14.2로 업데이트하고 이에 맞춰서 같은 버전으로 docker에도 image를 받겠다.
# 막간의 이용한 node.js 업데이트 방법
# NPM을 이용해서 Node를 업데이트하기 위해서는 n패키지를 설치한다.
# 이 패키지를 이용해서 node 버전을 상호적으로 관리할 수 있다.
npm install -g n
# n lts 또는 n latest에서 선택
n lts
# 이전 버전 삭제
n prune
node --version # v18.14.2
#출처 : [https://www.freecodecamp.org/korean/news/how-to-update-node-and-npm-to-the-latest-version/](https://www.freecodecamp.org/korean/news/how-to-update-node-and-npm-to-the-latest-version/)
18.14.2 버전으로 이미지 가져오기.
# node.js 이미지 pull
❯ docker pull node:18.14.2-alpine
18.14.2-alpine: Pulling from library/node
af6eaf76a39c: Pull complete
85e3118efd92: Pull complete
3839a37b9e43: Pull complete
1321f2e94f52: Pull complete
Digest: sha256:0d2712ac2b2c1149391173de670406f6e3dbdb1b2ba44e8530647e623e0e1b17
Status: Downloaded newer image for node:18.14.2-alpine
docker.io/library/node:18.14.2-alpine
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node 18.14.2-alpine ad0efe67fff2 35 hours ago 173MB
도커 데스크톱에서도 확인할 수 있다.
나. Docker 컨테이너 실행하기
Docker 이미지로부터 컨테이너를 실행하려면 docker run
명령어를 사용하세요.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run --name 컨테이너이름 이미지이름 # 컨테이너 이름 설정
가끔 run해도 컨테이너가 바로 꺼져버리는 경우가 있다.
이는 컨테이너 실행과 동시에 수행할 작업이 없어서 그런거니 마지막에 명령어를 같이 넣어주면 된다.
보통은 /bin/bash라고 많이 사용한다.
# 추천 옵션
docker run -it -p 8080:80 --name 컨테이너이름 -v 볼륨혹은파일과폴더:파일과폴더 이미지이름 /bin/bash
- -p : 포트포워딩
- -d : detach. 컨테이너를 백그라운드에서 실행. 서버 돌릴때 터미널 사용하려면 필요함.
- -v : 마운팅에 사용 → 뒤에서 배움.
다. Docker 컨테이너 관리하기
Docker를 사용하여 컨테이너를 관리할 수 있습니다.
컨테이너를 시작하거나 중지하고 로그를 확인하는 등의 작업을 할 수 있다.
docker ps
: 컨테이너 확인
docker ps #현재 실행중인 container 확인
docker ps -a #멈춘 container를 포함한 모든 container 확인
docker stop
: 컨테이너 중지
docker stop 컨테이너이름
docker start
: 컨테이너 시작
docker ps -a #같이 사용하는 경우가 많음
docker start 컨테이너이름
docker logs
: 컨테이너 로그 확인
docker logs [OPTIONS] 컨테이너이름
--follow
혹은 -f
: 계속해서 로그 출력
more options : https://docs.docker.com/engine/reference/commandline/logs/
라. Docker 컨테이너 삭제하기
docker stop 컨테이너이름
docker rm 컨테이너이름
docker rm
명령어를 사용하여 컨테이너를 삭제할 수 있다.
마. Docker 이미지 삭제하기
docker rmi 이미지이름
docker rmi
명령어를 사용하여 이미지를 삭제할 수 있습니다.
바. 오류
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
도커가 실행 중에 있지 않는 경우에 발생한다.
Docker desktop을 켜라.
'Tools > Docker' 카테고리의 다른 글
[Docker] 이미지 배포 (0) | 2023.02.27 |
---|---|
[Docker] Commit & Dockerfile (2) | 2023.02.27 |
[Docker] mount (0) | 2023.02.27 |
[Docker] 컨테이너 안에서 터미널 쓰기! (0) | 2023.02.27 |
[Docker] 포트포워딩 (0) | 2023.02.27 |