도커란?
도커, 컨테이너,쿠버네티스가 무엇일까?
도커는 컨테이너를 관리하기 위한 도구로 일종의 프로그램이다.
컨테이너를 통해 한대의 서버에 여러개의 소프트웨어를 안전하고 효율적으로 운영할 수 있다.
쿠버네티스는 서버가 여러 대 있는 환경에서 각각의 서버의 도커에게 대신 지시를 해주는 오케스트레이션 도구이다.
vm과의 차이
vm이란?
VM(virtual machine)의 정의는 컴퓨팅 환경을 소프트웨어로 구현한 것으로 즉 컴퓨터 시스템을 에뮬레이션(가상현실화)하는 소프트웨어라고 하며, 가상머신상에서 운영 체제나 응용 프로그램을 설치 및 실행할 수 있다고 한다.
VM과 도커의 공통점
- Docker와 Virtual Machine은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하여 실행한다.
VM과 도커의 차이점
- Docker은 Virtual Machine에서 사용되는 Guest OS 의 이미지를 사용하지 않기 때문에 가볍다는 장점이 있다.
- App을 실행하는 방식에 있어 Docker는 호스트 OS 위에 어플리케이션의 이미지를 배포하기만 하면 되지만,
- VM은 어플리케이션을 실행하기 위해서 VM을 띄우고 자원을 할당한 다음, Guest OS를 부팅하므로 훨씬 복잡하고 무겁게 실행해야 한다.
도커가 OS를 대신한다고 생각하면될것같다.
그러면 가벼운 도커가 무조건 좋은가?
안전성
- Docker는 커널을 공유하는데, 커널을 공유한는 것은 장점도 많지만 단점도 많다.
- 커널 공유는 전염을 당할수 있다는 의미이며 직관적으로 Host OS가 불안정 해진다면 이를 공유받고 있는 Contanier에도 영향을 끼칠수 있다.
다양한 OS
- 커널 기술은 리눅스 기반의 기술이기 때문에 Host OS가 다르면 다른 OS의 Contanier을 올릴수 없다.
- 예를 들어 리눅스 기반의 Contanier를 Window에 올릴수 없다는 뜻이다. (WSL을 사용해서 올릴수 있다.)
- 반면 VM은 Guest OS를 통해 OS를 설정해 줄 수 있기 때문에 이러한 문제에서 자유로워 진다.
도커의 구조
- 컨테이너 레이어
- 읽기,쓰기 모두 가능, 최상단에 위치
- 이미지 레이어
- 읽기 전용 레이어, 다른 컨테이너와 공유가능
컨테이너들이 이미지 레이어를 공유하고 각각 컨테이너 레이어를 보유하고있다
vm은 각각 이미지 레이어가 필요하다 도커는 이미지레이어를 공유한다.
포트포워딩
도커 컨테이너는 기본적으로 독립적인 환경에서 실행되기 때문에 컨테이너 밖에서 접근할 수 없다.
컨테이너와 통신하기 위해서는 컨테이너를 가동시킬때 p옵션을 사용해서 호스트의 포트와 컨테이너의 포트를 설정해야한다.
예를들어 컨테이너에 MySQL을 띄우고 접근하기 위해서는 컨테이너의 3306 포트로 접근해야한다.
로컬에서 3306 포트로 접근을 한다고 컨테이너의 3306으로 접근하는것이 아니다.
로컬에서 원하는 포트와 컨테이너의 3306을 연결해주면
로컬에서 해당 포트로 접근을 하면 컨테이너의 3306 포트로 연결이 되어 MySQL에 접근할 수 있게된다.
ex) -p 80:3306 -> 로컬 80 포트로 접근하면 컨테이너의 3306 포트로 연결해준다.
도커 dit 옵션과 attach
docker run -d --name myubuntu ubuntu를 통해 myubuntu 라는 컨테이너를 실행시켰는데 왜 실행중인 컨테이너가 없으까?
아파치, 엔진엑스의 경우 실행중인 프로그램이 있지만 우분투만 실행시킬경우 실행되자 마자 종료된다.
-dit로 실행 시켜주자
bash를 실행중이라서 종료되지 않는다.
docker attach를 통해 실행중인 컨테이너에 접속할 수 있다.
docker exec 명령어
docker run -p 8080:80 httpd로 실행을 하면 fore-ground로 실행되서 아무것도할수없다.
docker attach를 통해 접속을해도 아무것도 할 수 없다.
docker exec -it 0a3b bash
exec를 통해 접속하면 접속이 가능하다.
(이때 d는 적어주지 않는다 직접사용할꺼기 때문에 백그라운드 실행이 아님)
docker run -dit -p 8080:80 httpd를 통해 -dit로 실행을한다.
attach를 통해 접속을한다.
바로 종료된다.
왜냐하면 httpd의 command가 bash가 아니므로 attach로 접속을해도 접속이 안된다.
정리
도커를 실행하면서 컨테이너를 만들고 백그라운드로 실행을 하려면 -d를 사용하면된다.
두가지 경우가 있다.
- docker run -d ubuntu
- docker run -d httpd
httpd 는 서버이기 때문에 백드라운드로 실행을 하면 계속 실행중이지만 (정확히 말하면 우분투와 아파치 서버를 모두 다운 받고 서버를 실행시킨다.)
ubuntu는 os이므로 실행을 시켜도 바로 종료된다.
따라서 ubuntu와 같이 내부적으로 프로세스가 돌지 않는것들은
docker run -dit ubuntu bash (it와 bash 추가)
-dit와 bash로 실행을 시켜 bash가 실행되서 죽지 않고 실행되고 있는 상태가 된다.
그러면 실행중인 상태에 docket attach를 통해 접속을해서 제어를 할 수 있다.
반면 docker run -d -= 8080:80 httpd bash → httpd를 bash로 실행시키면
우분투를 다운받고 서버를 다운받고 서버를 실행시키는것이 아니라 bash를 실행시키므로
바로 죽어버린다.
그래서 os와 프로그램을 다운받고 실행할때는 명령어를 전달하면 안된다.
docker run -d -= 8080:80 httpd 를 통해 일단 실행시킨후
docker exec -it {컨테이너 id} bash 를 통해 (즉, exec를 통해서) 접근후 제어가 가능하다.
최종정리
- OS (ubuntu)
- docker run -dit ubuntu bash
- docker attach {컨테이너 id}
- 프로세스(httpd)
- docker run -d -p 8080:80 httpd
- 그냥 실행은 docker run -dit -p 8080:80 httpd를 해도 가능하지만 it가 의미가 없음
- docker exec -it {컨테이너 id} bash
- docker run -d -p 8080:80 httpd
도커 volumn
-d : demon으로 실행
-p를 통해 local의 8080 포트 → container의 80포트 연결
docker exec -it {name} bash를 통해
/usr/local/apache2/htdocs 안의 index.html을 확인할 수 있다.
수정이 되지 않는다 (설치를 해줘야함)
-v 명령어를 이용해서 실행을 해보자
해당 코드가 출력된다.
volumn은 연결 같은 개념이다.
-v C:\Users\user\webapp:/usr/local/apache2/htdocs
C:\Users\user\webapp 해당 폴더와 /usr/local/apache2/htdocs 해당 폴더를 연결해준다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] DinD(Docker in Docker) 와 DooD(Docker out of Docker) (2) | 2025.02.02 |
---|---|
[Docker] Container의 불변성과 Volume, Bind Mount (0) | 2025.01.29 |
[Docker] docker compose - redis 연결 불가 오류 (0) | 2024.02.27 |
[Docker] docker compose로 Spring + MySQL 배포 환경 만들기 (0) | 2024.02.22 |
댓글