Docker
Virtual Machine 같이 CPU나 기타 자원들을 완전히 가상화해서 컴퓨터를 새로 만들어내는 것이 아니라, 리눅스의 컨테이너 기술을 이용해서 가상화를 하지않고 프로세스만 경유해서 빠르게 실행시키는 기술.
장점
기존 시스템 자원을 공유함으로써 OS를 다시 설치하는 게 아니다.
리얼 머신에서 돌아가면서 가상머신의 효과를 낸다.
docker 설치
패키지 관리자가 설치된 이미지 받아오기
docker pull ubuntu:14.04 (우분투 14.04 버전 이미지 받아오기)
이미지 Search 하는 법 : docker search ubuntu (우분투라는 이름을 가진 이미지들을 검색)
Docker 홈페이지 들어가서도 우분투 버전 검색 가능
이미지 : 실행파일과 라이브러리가 조합된 것
컨테이너 : 이미지를 실행한 상태
docker 실행
docker run -i -t ubuntu:14.04 /bin/bash
-i 옵션 : Interactive. 사용자가 입출력 가능하게
-t 옵션 : sudo tty. 가상 터미널환경을 에뮬레이션
/bin/bash : Main 실행파일로 컨테이너 안의(우분투) bash 쉘을 이용하겠다. (Main 실행파일이 종료되면 컨테이너도 종료된다)
이제 root 컨테이너 안에서 apt-get install로 git 등을 설치할 수 있다.
exit -> bash 쉘의 종료 -> 컨테이너의 종료로 이어진다.
docker 이미지의 상태 보기
docker ps -a
※ docker 컨테이너를 종료하지 않고 실행상태에서 빠져나올 수 있다.
docker 재실행
docker start [컨테이너_이름]
- start는 실행만 하고 들어가진 않음
docker attach [컨테이너_이름]
- attach 명령은 실행 후 들어감
docker 컨테이너 종료 없이 빠져나오기
- ctrl + P + Q를 누르면 종료 없이 빠져나온다 (다른 특별한 명령어는 없는 듯)
docker 실행 종료
docker stop [컨테이너_이름]
docker 컨테이너 삭제
docker rm [컨테이너_이름]
docker 이미지 삭제
docker rmi [이미지_이름]
컨테이너 삭제와 이미지 삭제는 다르다.
이미지 하나로 여러개의 컨테이너를 실행할 수 있다.
컨테이너에 설치한 프로그램들은 이미지에 영향을 끼치지 않는다. 컨테이너 자체에만 저장됨 **
※ 운영체제 말고 내가 필요한 어플리케이션만 받아온다 = 어플리케이션이 설치된 이미지를 받아오는 것
nginx가 설치된 이미지 받아오기
docker pull nginx:latest
nginx 백그라운드 실행
docker run -d --name hello-nginx nginx:latest
-d 옵션 : 백그라운드 실행
-p 옵션 : 포트번호 설정 가능 (8000:80 -> 외부의 8000번 포트로 들어왔을 때 docker의 80번 포트로 보내라)
--name 옵션 : 컨테이너의 이름을 지정
exec command
main process 이외에 다른 실행파일을 실행할 수 있도록 함.
docker run -i -t --name hello ubuntu:14.04 /bin/bash
ctrl + pq로 빠져나옴
docker ps
docker exec hello touch /hello.txt
-> hello 컨테이너의 명령어를 외부에서 사용한다. (컨테이너 안에 hello.txt 파일을 생성)
※ 외부에 있는 파일 또는 폴더를 docker 컨테이너에 링크하면 컨테이너 내에서 외부 디렉토리를 이용 가능하다.
docker image 생성하기
이미지 생성
docker build --tag hello:0.1 .
컨테이너 생성
docker run --name hello-nginx -d -p 80:80 -v /root/data:/data hello:0.1
이미지 히스토리 살펴보기
docker history hello:0.1
컨테이너에서 파일 꺼내기
docker cp hello-nginx:/etc/nginx/nginx.conf ./
컨테이너의 변경 사항을 이미지로 저장하기
docker commit -a "Foo Bar <[email protected]>" -m "add hello.txt" hello-nginx hello:0.2
컨테이너에서 변경된 파일 확인하기
docker diff hello-nginx