<가상화 배경>
<가상화 종류>
<서버 가상화>
<하이퍼바이저>
<리눅스 컨테이너>
리눅스 컨테이너는 컨테이너 가상화 기술을 사용
리눅스 컨테이너에는 애플리케이션이나 이에 필요한 라이브러리 및 설정파일 등이 포함됨
리눅스 컨테이너는 오래전부터 사용되었지만 극히 일부 기업에서만 사용되었고, 도커가 개발된 이후부터 활발하게 사용되고 있다
도커는 리눅스 컨테이너를 다루는 도구이며, 컨테이너 런타임이라고 함
앱을 돌리기 위해 필요한 리소스가 10이라고 했을 때, 가상머신에 필요한 10, GUEST OS에 필요한 50으로 앱 하나를 위해 사실상 100이 필요
앱을 돌리기 위해 필요한 리소스가 10이라 했을 때, 컨테이너 엔진은 5정도 필요하다. 따라서 앱 하나를 위해 15정도가 필요하다. 즉, 컨테이너는 가상머신에 비해 매우 가볍다
📒 컨테이너의 역할은 앱을 돌리기 위한 것으로, 컨테이너 하나당 하나의 앱을 돌린다
<소프트웨어 컨테이너 란>
<리눅스 컨테이너에서 사용하는 기술>
cgroup
namespace
<Docker를 사용하는 이유>
<도커의 구조>
이미지
저장소
컨테이너
<도커의 기능>
이미지 생성
이미지 공유
컨테이너 생성
설치 및 접속
Virtualbox에 centos7 가상머신을 설치한다
(runlevel 3, 호스트전용 어댑터, NAT Network, 메모리 4096)
ssh root@localhost
Password 입력
# 만약 key문제로 접속이 안된다면 c드라이브에 users폴더에
나의 user로 들어가 .ssh폴더가 있는지 확인 후 폴더 안에 파일을 지워준다
yum install -y yum-utils
# yum 관리도구 설치
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 도커 관련 레포지토리 추가
yum install docker-ce docker-ce-cli containerd.io
# 도커 설치
systemctl enable docker
systemctl start docker
# 도커 시작 및 활성화
systemctl status docker
docker --version
# 도커 설치 및 시작 확인
ip addr
# 연결된 네트워크의 ip주소 확인 = ifconfig
이미지 검색
docker search 이미지명
# 도커허브에서 이미지 검색
# 실제 docker hub 사이트에 검색하는 것과 동일
이미지 다운
docker image
# 이미지 관련 명령어 보기
docker image pull hello-world:nanoserver
# 실제 이미지 다운
# 계정명/이미지명:태그명
이미지 확인 / 지우기
docker iamge ls / docker images
# 이미지 목록 확인
docker image ls -q
# 이미지 ID리스트 확인
docker image rm 계정명/이미지명:태그명
# 이미지 지우기
docker image rm id
# 아이디로 이미지 지우기
docker image rm $(docker image ls -q)
# 전체 이미지 지우기
docker image rm -f 이미지명
# 실행되고 있는 이미지 삭제
이미지들의 CMD 항목 확인
docker inspect httpd | grep -A 4 CMD
-> httpd는 서비스이기 때문에 cmd가 shell이 아닌 foreground에서 실행되는 것을 알 수 있다
docker inspect centos:7 | grep -A 4 CMD
-> centos는 cmd가 shell이기 때문에 bash 셸에서 실행되는 것을 알 수 있다
prune 명령어
docker image prune --all
백업 명령어
docker image save -o test.tar centos:7 centos:latest
# image를 아카이브파일로 백업한다
docker image load -i test.tar
# 백업된 아카이브 파일을 다시 푼다
컨테이너 및 이미지 스펙 확인
docker image inspect 컨테이너명/이미지명
컨네이너 관련 명령어 확인
docker container
컨테이너 생성 및 실행
create : 컨테이너 생성
docker create -it --name os1 centos:7
실행중인 컨테이너 목록 확인
docker container ps
# 현재 실행 중인 컨테이너
docker container ps -a
# 실행중이지 않은 컨테이너까지 보기
docker container ps -aq
# 컨테이너 전체 아이디 보기
start : 컨테이너 시작
docker container start 컨테이너명
attach : 컨테이너 접속
docker container attach 컨테이너명
접속중인 컨테이너에서 나오기
ctrl+pq
# 그냥 exit로 나오게 되면 container의 상태에 영향을 미친다
run : create + start + attach
형식: docker run [option] --name 컨테이너명 이미지:태그
옵션
- i : interactive, shell 명령어 처럼 대화형으로 진행되는 경우
- t : tty, shell 명령어는 대화형하는데 있어서 해당 제어터미널이 있어야 확인할 수 있음.
- it : 입력값과 출력값이 필요로 하는 컨테이너 경우에 붙임
- d : 입력값이나 출력값이 필요없고 실행만 시킬 경우에 붙임
= run에서 attach를 실행 x
docker run -it --name os2 centos:7
docker run -itd --name os3 centos:7
# cmd가 shell인 경우
docker run -d --name web1 httpd:latest
# cmd가 서비스인 경우
컨테이너 삭제
docker container prune
# 실행중인 것은 삭제 x
docker container rm -f 컨테이너명 or id
# 실행중인 컨테이너 삭제
docker container rm -f $(docker ps -aq)
# 실행중인 컨테이너 포함 전체 삭제
docker exec 컨네이너명 명령어
docker exec os1 ls -a /root
docker exec -it 컨테이너명 shell
docker exec -it os1 bash # exit로 나와도 된다
📒 prune,rm을 제외하고는 명령어앞에 image나 container는 생략해도 된다
docker exec -it web1 bash
#bash 셸로 접속
cd htdocs
#htdocs디렉터리 접속
#index.html파일이 존재하는 것을 확인
cat > index.html
text입력
docker inspect web1 | grep IPA
#해당 컨테이너 IP 확인
exit후 curl 컨테이너 IP
#입력한 text가 나타남
docker exec -it web1 cat htdocs/index.html
컨테이너 리소스 확인
docker stats --no-stream
컨테이너 리소스 제한
docker run -it --name os2 --cpus 0.5 --memory 1G centos:7 # 제한된 리소스로 생성
docker update --cpus 0.4 --memory 2G os2 # 리소스 수정
컨테이너 PID 확인
docker top 컨테이너명
컨테이너에 파일 복사 및 확인
컨테이너는 기본적으로 메모리에 이미지가 올라가서 실행된 상태 = 컨테이너는 메모리에 있는 것
컨테이너에 일어난 변화가 이미지에 영향을 주지 않는다
컨테이너에 아무리 파일을 생성해도 컨테이너를 중지하게 되면 해당 내용은 모두 삭제
컨테이너에 있는 파일을 외부로 가져오거나 외부에 있는 파일을 컨테이너에 복사해서 넣는 것이 가능
host에서 컨테이너에게 파일 복사
touch hostfile # 파일 생성
echo docker cp test > hostfile
docker run -itd --name os1 centos:7 # 컨테이너 생성
docker cp hostfile os1:/root/ # 파일 복사
docker exec os1 ls /root/
#실제로 컨테이너 해당 경로에 파일이 생성된 것을 확인
컨테이너에서 host에게 파일 복사
docker exec -it os1 bash
touch os1file
exit
docker cp os1:/root/os1file ./
#ls로 호스트 현재 디렉터리에 파일이 생성된 것을 확인
host에서 컨테이너에게 디렉터리 복사
mkdir hostdir
docker cp hostdir os1:/root/
docker exec os1 ls /root/
컨테이너에서 host에게 디렉터리 복사
docker exec -it os1 bash
mkdir os1dir
exit
docker cp os1:/root/os1dir ./
diff 명령어
diff = 차이점 (기본 이미지와의 차이점)
docker diff 컨테이너명
C : change
A : add
D : delete
처음 컨테이너 생성후 docker diff os1해보면 아무것도 안뜨는 것을 확인
호스트가 컨테이너에게 파일을 복사한 후 diff로 확인하면 기본 이미지와 차이가 생긴 경로에 C와 A가 나타난 것을 확인
컨테이너에서 파일을 삭제한 후 diff를 해보면 해당 경로에 D가 나타난 것을 확인