도커 (Docker)
앞서 설명한 컨테이너 엔진(Container engine)을 만든 대표적인 회사로서 우리가 일반적으로 말하는 도커(docker)는 docker 사의 컨테이너 엔진을 지칭하는 것이다. (=>컨테이너를 실행시키는 플랫폼)
컨테이너 엔진 (Container Engine)?
-> '컨테이너' 라고 불리는 소프트웨어 패키지 들을 배포하기 위해 OS 레벨에서의 가상화를 제공해주는 서비스 플랫폼이라고 생각하면 되겠다.
우리는 텍스트파일 형식의 도커 파일을 빌드하여 컨테이너 이미지(Container Image)를 만들 수 있고, 컨테이너는 컨테이너 이미지를 통해 실행될 수 있다. 이 컨테이너 이미지를 Docker Hub로부터 pull 할 수도 있고, Docker Hub로 push할 수도 있다. Docker Hub는 도커 이미지 파일을 공유할 수 있는 깃허브와 유사한 커뮤니티? 라고 생각하면 될 듯 하다.
이미지(레시피) - 컨테이너(요리) 로 비유적으로 생각해보면 이해가 잘 될 것이다.
기본적으로 하나의 컨테이너에는 하나의 프로세스만 실행되도록 이미지를 만들 것이 권장되며, 두 개 이상의 프로세스가 필요한 app의 경우 다수의 컨테이너를 만들어 사용하는 것이 필요하다.
실습에서 사용한 도커 명령어들을 정리해 보았다. (AWS EC2 가상머신에서 진행)
기본 도커 커맨드 연습
docker --version : 도커 버전 확인
docker --help : 도커 명령어들 보기
(sudo) docker run hello-world : 'hello-world' 도커 컨테이너 이미지 pull + run
cat /etc/group : 그룹 권한 보기
sudo usermod -aG docker $USER : 현재 유저에게(EC2 가상머신 유저) docker와 관련된 권한들을 준다. (a : append, G : group)
docker pull <이미지 이름> : docker hub에서 해당 컨테이너 이미지를 갖고온다. ('ubuntu' 이미지 사용)
docker images : 현재 도커 이미지들 보기 (이미지 id 확인 가능)
docker run -it -d <이미지 이름> : 컨테이너 이미지 실행 (ubuntu)
(d : 컨테이너를 백그라운드에서 실행, it : 컨테이너를 종료하지 않은 채로 터미널의 입력을 계속해서 컨테이너로 전달. ==> 일반적으로 항상 이렇게 입력하면 되는 것 같다.)
docker ps : 현재 돌고 있는 프로세스 보기 (컨테이너 id, 컨테이너 이름 확인 가능)
docker exec -it <컨테이너 id> <컨테이너에 있는 프로그램> : 특정 컨테이너가 실행되고 있는 환경에서 또다른 프로세스를 실행
(docker exec -it ubuntu bash)
exit : 컨테이너 나오기
docker stop <컨테이너id> : 컨테이너 중지
docker kill <컨테이너id> : 컨테이너 중지
docker ps -a : 모든 프로세스 보기 (현재 돌고 있는 프로세스를 보는게 x)
docker rm -f <컨테이너id> : 컨테이너 프로세스 제거
docker rmi -f <이미지id> : 컨테이너 이미지 제거
웹서비스 컨테이너 프로세스 배포 실습
(컨테이너로 들어와서 bash 프로세스 실행한 상태에서)
apt-get update : 소프트웨어 설치 전 업데이트 해주기
apt-get install -y apache2 : 아파치 설치(y : yes 묻지 않기)
cd /var/www/html
vim 1.html : 간단한 html 파일 생성
(EC2 기계에서 실습을 진행하였기 때문에 vim가 설치되어 있지 않다고 뜸)
apt-get install -y vim : 현재 이미지의 프로세스에 vim 설치
(html파일 생성 후 컨테이너를 나온다.)
exit
docker commit <컨테이너id or 컨테이너이름> <새로 커밋할 이미지 이름> :
1.html파일 + 아파치 서버를 하나의 이미지로 만들어서 배포
* <새로 커밋할 이미지 이름>의 형식은 <dockerHub계정/커밋할이미지이름>으로 해준다.
docker images
docker ps
docker run -it -p 81:80 -d <새로 커밋할 이미지 이름> : 81번 포트를 아파치의 default TCP 포트번호(80번)로 port forwarding
docker ps
docker exec -it <컨테이너id or 이름> <프로그램(bash)> : 다시 컨테이너 프로세스로 들어옴 (docker exec -it ubuntu bash)
service apache2 status : 아파치 상태 보기
service apache2 start : 아파치 서비스 시작
EC2기계에 81번 포트에 대한 인바운드 규칙 AWS에서 추가해 준 다음
(EC2기계의) 퍼블릭IP:81 -> 우분투 아파치2 디폴트 페이지(EC2기계의) 퍼블릭IP:81/1.html -> 내가 작성한 1.html 내용 확인 가능
Docker 컨테이너의 일생
docker를 통하여 컨테이너를 사용하게 되면 먼저 dockerfile을 만들어야 한다. dockerfile은 컨테이너 이미지를 생성시키는 커맨드가 들어있는 텍스트 형식의 파일이라고 생각하면 되겠다.
dockerfile을 빌드하면 컨테이너 이미지가 생성되고, 이 컨테이너 이미지를 run 시키면 컨테이너를 사용할 수 있다.
이 컨테이너 이미지는 Docker 사의 Docker Hub라는 사이트에서 여러 사람들과 공유가 가능하다. (컨테이너 이미지 파일의 깃허브라고 생각하면 되겠다.) 컨테이너 이미지를 Docker Hub로 업로드? 시키는 것이 push, Docker Hub에서 원하는 이미지를 가져다 오는 것이 pull이다.
기본적으로 하나의 컨테이너에는 하나의 프로세스만 실행되도록 이미지를 만들 것이 권장되며, 두 개 이상의 프로세스가 필요한 애플리케이션의 경우에는 단일 기능을 하는 다수의 컨테이너를 사용하는 것이 좋다.
'Docker Container' 카테고리의 다른 글
[Docker] Docker swarm (0) | 2022.04.17 |
---|---|
[Docker] Docker-compose (0) | 2022.04.13 |
[Docker] Docker Volume (도커 볼륨)? (0) | 2022.04.13 |
[Docker] Dockerfile (도커파일) (0) | 2022.04.12 |
[Conatiner] 컨테이너(Container)? (0) | 2022.04.01 |