Docker를 공부하면서 헷갈리거나, 어려웠던 부분을 열심히 이해해서 조금 더 쉽게 작성하려고 노력했다. 해당 글은 개념 및 실행 관련 예제가 많다보니, Docker를 만들어야하는 목적의 사람에겐 적합하지 않을 수 있음!
한 컴퓨터로 이것저것 할려니깐 정말 미쳐 도라방스다. 그렇다고 비싼 컴퓨터를 여러대를 살 수도 없는 노릇 이고
1.VM vs Container
1) VM ( Virtual Machines )
그렇다면, 하나의 컴퓨터에 가상 컴퓨터를 만들어서 운영 체제를 설치하는건 어떨까? 그렇다면 컴퓨터 한대를 더 안사도 되잖아! 의 개념에서 나온게 VM 이다. 하지만, 우리가 무거운 작업을 하면 상관 없겠지만 고작 웹서버 하나가 깔려고 운영체제를 깐다? 너무 무겁고 비효율 적이다. 그리고 이미 사용하고 있는 운영 체제 위에 운영체제를 올리니까 너무 느려진다.
그냥 한대에 컴퓨터에서 각각의 앱을 실행시키는데 격리된 환경에서 실행 시키면 안되나?
2) Container
위의 단점을 극복하고자 나온 것이 컨테이너이다. 한대에 컴퓨터에서 각각의 앱을 실행시키는데, 격리된 환경에서 실행시키는 것이다. 물론 VM이 더 높은 격리 레벨을 지원하겠지만, 성능 향상, 뛰어난 이식성, 유연성 들의 이유로 Container를 많이 사용한다. Container를 사용하게 되면, 내 컴퓨터에서는 되는데 왜 서버에서는 안되니 😥 문제를 해결할 수 있다. 왜냐면 리소스까지 다 묶어서 컨테이너로 한번에 실행 시켜버리면 되니까 말이다.
2.Docker
Docker라고 해서 검색하고 들어왔더니 컨테이너나 설명하고 있다. 그럼 Docker는 뭘까? Docker는 Container에서 제일 잘나가는 제품이라고 생각하면 된다.
그렇다면, 이제 본격적으로 Docker의 구조에 대해 알아보자
Docker 구성 요소와 프로세스
Docker는 위와 같은 구조 및 프로세스를 가지고 있다. Dockerfile을 만들고 이것을 빌드해서 image를 만들고, run을 통해 container를 구동하는 것이다. 이렇게 보면 잘 모르겠으니 하나씩 개념을 살펴보도록 하자!
1.Docker file (파일)
도커 파일은, 이미지 생성 방법을 정의하는 레시피가 담긴 문서이다. 어플리케이션을 구동하기 위해 꼭 필요한 파일이 무엇이 있는지, 어떤 프레임워크나 라이브러리를 설치해야하는지에 대한 외부 Dependency, 필요한 환경 변수, 어떻게 구동해야하는지 스크립트 등을 포함할 수 있으며 위에서부터 한줄 씩 실행된다. 이 파일을 실행해서 이미지를 만드는 것이 도커 빌드.
2.Docker Image (이미지)
그렇다면 도커 이미지는 뭘까? 도커에서 필요한 서버 프로그램 + 소스코드 + 실행 파일로, 프로그램을 구동하기위한 세트이다. 컨테이너를 실행하기 위한 압축 파일 느낌.
3.Docker Container (컨테이너)
컨테이너는 이미지를 실행할 때 만들어지는 것으로, 패키징된 도커 이미지를 격리된 공간에서 동작시키는 기술을 의미.
4.Docker hub (도커 허브)
도커 허브는 Docker에서 운영하는 Docker 이미지 저장소 서비스다. 미리 만들어진 Docker 이미지를 사용할 수 있다.
앱스토어 느낌이라고 생각하면 편하다. (허브에서 이미지를 땡겨오는 것을 PULL 이라고 한다)
아직 이해가 잘 안갈 수 있다. Docker를 실행하면서 필요한 필수 linux 명령어을 먼저 살펴보고, 이 후 Docker를 설치 및 허브에서 이미지를 다운 받아 웹서버를 올려보는 간단한 예제를 통해 더 이해해보도록 하자. 원래 하면서 이해하는게 최고당
3.자주쓰는 Docker 명령어
이미지 목록 보기
sudo docker images
이미지 검색
sudo docker search [이미지 이름]
이미지 받기
sudo docker pull [이미지 이름]:[버전] #latest 기재 시 최신 버전 다운로드 가능
이미지 삭제
sudo docker rmi [이미지id]
이미지 삭제 (컨테이너 삭제 전 컨테이너까지 강제 삭제)
sudo docker rmi -f [이미지 id]
컨테이너 목록 보기
sudo docker ps
컨테이너 목록 보기 (전체)
sudo docker -a ps
컨테이너 실행
sudo docker run ([옵션]) <이미지 식별자> (<명령어>) (<인자>) # () 생략가능
*옵션
-d | 백그라운드에서 실행, -d없이 실행한다면 Citl+C를 눌러 빠져나오는 순간 해당 컨테이너 종료 |
-it | -i + -t , 컨테이너를 종료하지 않은 채 터미널의 입력을 계속해서 컨테이너로 전달. 컨테이너의 표준 입력과 로컬 컴퓨터의 키보드 입력을 연결 |
--name | 컨테이너의 이름 부여. docker kill이나 docker rm 에서 이름으로 사용가능 |
-e | docker 컨테이너의 환경변수 설정 (dockerfile의 ENV 설정도 덮어써짐) |
-p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
-v | 호스트 컴퓨터의 파일 시스템의 특정 경로를 컨테이너의 파일 시스템의 특정 경로로 마운트 |
-w | dockerfile의 WORKDIR 설정을 덮어쓰기 위해 사용 |
--rm | 컨테이너를 일회성으로 실행할 때 주로 쓰임. 컨테이너가 종료될 때 컨테이너와 관련된 리소스까지 깨끗하게 제거 |
컨테이너 시작
sudo docker start [컨테이너 id 또는 컨테이너 이름]
*docker run 이랑 docker start랑 무슨 차이예요 ?
- docker run은 이미지 기반으로 새로운 컨테이너를 생성하고 실행
- docker start는 중지된 컨테이너를 시작
- 참고 ) docker restart : 실행 중인 컨테이너를 중지하고 다시 시작
- 참고 ) docker create : 새로운 컨테이너 생성, but 즉시 실행되지는 않음
컨테이너 재시작
sudo docker restart [컨테이너 id 또는 컨테이너 이름]
컨테이너 접속
sudo docker attach [컨테이너 id 또는 컨테이너 이름]
컨테이너 정지
sudo docker stop [컨테이너 id 또는 컨테이너 이름]
컨테이너 삭제
sudo docker rm [컨테이너 id 또는 컨테이너 이름]
모든 컨테이너 삭제
sudo docker rm `docker ps -a -q`
*sudo 없이 docker 명령어 쓰기
sudo usermod -aG docker [사용자명]
newgrp docker
컨테이너 안에서 명령어 실행
docker exec [옵션] [컨테이너명] [명령어]
docker exec ws3 pwd
*계속 쓰게 하는법
docker exec -it [컨테이너명] /bin/sh
#부터 계속 쓸수 있고, 나가려면 exit
4.Docker 설치부터 간단한 예제 (아파치 웹서버 올려보기)
1.Docker 설치
1.우분투 시스템 패키지 업데이트
sudo apt-get update
2.필요 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
apt-transport-https : HTTPS를 통해 외부 리포지토리를 사용하기 위한 패키지
ca-certificates : HTTPS 연결을 할 때 사용되는 인증서 관련 패키지
curl : URL을 통해 데이터를 전송하거나 받는 기능을 제공하는 명령줄 도구
gnupg-agent : GPG를 사용하여 보안 인증 및 암호화 기능을 제공하는 패키지
software-properties-common : 소프트웨어 소스를 추가하고 관리하기 위한 도구를 제공하는 패키지
3.Docker의 공식 GPG키를 추가
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
4.시스템 패키지 업데이트
sudo apt-get update
5.Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
6.Docker 설치 확인
- 도커 실행상태 확인
sudo systemctl status docker
- 도커 실행
sudo docker run hello-world
2.Docker Image PULL
아파치 웹서버를 올리기 위해, httpd 이미지를 받아오자
*httpd = Apache HTTP Sever의 공식 이미지
sudo docker pull httpd
*다운 받은 이미지 확인
이미지를 다운받았으니, run을 통해 컨테이너를 실행시켜주자
sudo docker run --name ws3 -p 8081:80 httpd
(8081을 80번으로 보낸다)
*컨테이너 확인
sudo docker ps
*STATUS
- Up : 컨테이너가 현재 실행중 (-d 옵션을 사용해서 백그라운드에서 실행되는 경우에도 적용)
- Exited : 컨테이너가 실행을 완료하고 종료된 상태
- Paused : 컨테이너가 일시 중지된 상태, docker pause 명령어를 사용하여 컨테이너를 일시 중지한 경우에 나타남
- Restarting : 컨테이너가 재시작 중인 상태. 컨테이너가 다시 시작되고 있는 동안에 나타남
- Created : 컨테이너가 생성되었지만 아직 시작되지 않은 상태
이후, 주소창에 localhost:8081/index.html 을 입력하면 서버가 제대로 띄워진 것을 확인할 수 있다.
이미 만들어진 이미지를 땡겨와 실행만 함으로써 서버를 띄울 수 있는 것이다. 패키징 채로 갖고오니 오류가 뜰 일도 없고 진짜 너무너무 편리한 기능.. 일단 여기까지를 끝으로 도커의 기본 개념을 배웠다. 이제 호스트와 컨테이너의 파일 시스템 연결을 통해 효율적인 버전관리나, 컴포즈 같은 기능도 있긴한데 기초인 만큼 이정도에서 끝내려고 한다! 빠빠룽!
https://analytics4everything.tistory.com/213
https://haengsin.tistory.com/128
https://www.daleseo.com/docker-run/
https://shanepark.tistory.com/250
'리눅스 Linux' 카테고리의 다른 글
[Linux] 도커 컴포즈 (Docker Compose) 기초 개념과 설치부터 실행까지 (0) | 2024.04.09 |
---|---|
[Linux/Ubuntu] 삼바(Samba)를 설치하고 HDFS를 윈도우 디렉토리와 연결해보자 (0) | 2024.03.29 |
[Linux/Ubuntu] Fuse를 이용하여 HDFS를 Linux에 Mount하기 (0) | 2024.03.29 |
[Linux] 뉴비를 위한 VIM 기초 사용법 총정리 (0) | 2024.03.27 |
[Linux/Ubuntu] 리눅스와 우분투는 무엇일까? (0) | 2024.03.20 |
댓글