반응형
위키북스에서 나온 "시작하세요! 도커/쿠버네티스" 개인 공부 포스트입니다
http://www.yes24.com/Product/Goods/84927385
도커 이미지
- 컨테이너를 생성할 때 필요한 요소
- 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념
- 여러 개의 계층으로 된 바이너리 파일로 존재하며, 읽기 전용으로 사용된다
- [저장소 이름]/[이미지 이름]:[태그]
- 저장소 이름: 이미지가 저장된 장소,명시되지 않을 수 있다(도커 허브의 공식 이미지 혹은 생성시 생략 )
- 이미지 이름: 해당 이미지가 어떤 역할을 하는지 나타냅니다(생략 불가)
- 태그: 이미지의 버전 관리, 생략시 latest로 인식합니다
도커 컨테이너
- 도커 이미지를 이용해 컨테이너를 만들면, 해당 이미지의 목적에 맞는 파일이 들어있는 파일 시스템, 격리된 시스템 자원 및 네트워크를 사용할 수 있고 독립된 공간을 사용 가능
- 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 컨테이너에서 무엇을 하든지 원래 이미지는 영향을 받지 않는다
- 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치 혹은 삭제를 해도 다른 컨테이너와 호스트에 영향을 미치지 않습니다
도커 컨테이너 다루기
- 도커 버전 확인
- 도커는 다양한 기능을 빠르게 업데이트하기 때문에 주기적으로 버전 확인을 해줘야한다 ( 주요 기능들을 못쓸 수 있기 때문에 )
# docker version docker -v
=> ex) Docker version 19.03.12, build a872fc2f86
- 도커는 다양한 기능을 빠르게 업데이트하기 때문에 주기적으로 버전 확인을 해줘야한다 ( 주요 기능들을 못쓸 수 있기 때문에 )
- 컨테이너 생성 + 실행
- docker run 명령어는 컨테이너를 생성, 실행하고 컨테이너 내부로 들어가는 역할
- -i 옵션을 통해 컨테이너와 상호 입출력을 가능하게 한다
- -t 옵션을 통해 tty를 활성화해서 배시 셸을 사용하도록 한다 ( tty: 리눅스 드라이버중 콘솔, 터미널을 의미 )
- 컨테이너 생성시 기본 사용자 root와 무작위 16진수 해시값으로 컨테이너 고유한 ID가 발급됩니다
=> ex) ubuntu:14.04 이미지가 로컬 도커 엔진에 존재하지 않으므로, 도커 중앙 이미지 저장소(도커 허브)에서 이미지를 내려받습니다# container create docker run -i -t ubuntu:14.04
- 컨테이너 중지
- 컨테이너 셸 안쪽에서 exit 혹은 Ctrl + D, 컨테이너를 종료시킴과 동시에 빠져나옵니다
- Ctrl + P, Q를 이용하면 단순히 컨테이너의 셸에서만 빠져나오기 때문에 컨테이너를 유지 가능
- 도커 이미지 내려받기
- 도커 공식 저장소(도커 허브)에서 이미지를 내려받습니다
# pull image docker pull centos:7
- 도커 공식 저장소(도커 허브)에서 이미지를 내려받습니다
- 내려받은 도커 이미지 확인
# check docker images docker images
- 컨테이너 생성
- docker create 명령어를 이용해 컨테이너를 생성만 하고 docker run과 달리 컨테이너 실행 및 내부로 들어가지 않습니다
- --name 옵션을 통해 컨테이너의 이름을 설정할 수 있습니다
# docker create docker create -i -t --name mycentos centos:7
- 이미지 상세정보 확인
- docker inspect 명령어를 이용해 해당 도커 이미지의 상세 정보를 확인할 수 있다
# select config to docker image docker inspect {docker image name}
- docker inspect 명령어를 이용해 해당 도커 이미지의 상세 정보를 확인할 수 있다
- 컨테이너 시작
- docker start 명령어를 통해 컨테이너를 시작하고 내부로 들어갈 수 있다
- docker attach 명령어를 통해 기시작된 컨테이너 내부로 들어갈 수 있다
=> container ID는 너무 길기 때문에 구분가능한 앞의 2~3글자만 입력해도 됩니다# start docker docker start {container name, container ID} # attach docker docker attach {container name, container ID}
- 컨테이너 목록 확인
- docker ps 명령어를 통해 정지되지 않은 컨테이너(시작된)만 확인할 수 있습니다
- -a 옵션을 통해 모든 컨테이너를 추가로 확인할 수 있으며, 컨테이너의 상태는 STATUS 컬럼을 통해 확인 가능합니다
# select docker container docker ps -a
- 원하는 정보의 컬럼만 출력하고 싶을때는 --format 옵션을 이용할 수 있습니다
# change docker ps format docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Image}}"
- 컨테이너 삭제
- docker rm 명령어를 이용해서 더 이상 사용하지 않은 컨테이너를 삭제할 수 있습니다
- 단 한 번 삭제한 컨테이너는 복구할 수 없으므로 삭제할 때 주의해야한다
- 실행중인 컨테이너는 바로 삭제가 불가능 하므로 docker stop을 통해 컨테이너를 멈추거나 docker rm 옵션중 -f를 추가하여 강제로 삭제할 수 있습니다
- 모든 컨테이너를 삭제하고 싶을때는 docker container prune 명령어를 이용할 수 있습니다
- 컨테이너에 /bin/bash 실행시키기
- 포그라운드로 사용자 입출력이 가능한 shell이 실행되지 않았을 경우 exec 명령어를 통해 /bin/bash를 생성하여 접근 가능
# exec docker exec -i -t {containerID/containerName} /bin/bash
- 포그라운드로 사용자 입출력이 가능한 shell이 실행되지 않았을 경우 exec 명령어를 통해 /bin/bash를 생성하여 접근 가능
도커 컨테이너 외부에 노출시키기
- 컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받습니다
- 도커는 기본적으로 컨테이너에 172.17.0.x의 IP를 순차적으로 할당한다 ( 왜...?? 아직 이유를 못찾았다.. )
- 기본적으로 도커는 외부에서 접근이 불가능하고, 도커가 설치된 호스트에서만 접근 가능합니다(예외로 docker for mac에서는 이 방식도 불가능 )
- 기본적으로 각 컨테이너는 eth0 인터페이스와 로컬 호스트인 lo 인터페이스가 생성된다
- docker 내부에서 ifconfig를 통해 생성된 eth0 인터페이스를 확인해보면 inet addr: 172.17.0.2로 할당된 것을 확인할 수 있다
- 외부로 컨테이너의 네트워크를 노출시키기 위해서는 eth0 인터페이스의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 합니다
- -p 옵션을 통해 컨테이너의 포트를 호스트의 포트와 바인딩(포트 바인딩)할 수 있습니다
# connect port docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04
- 다수의 -p 옵션을 통해서 여러 포트를 바인딩 할 수 있으며, 호스트의 특정 IP와 바인딩도 가능하다 ( 192.168.0.100:7777 )
- 바인딩할 호스트의 포트없이 -p 80 이런식으로 컨테이너의 80포트를 지정하게되면 호스트의 포트중 연결 가능한 포트와 알아서 연결된다. ( docker ps를 통해 연결된 port를 알아내야 한다 )
컨테이너 어플리케이션 구축
- 컨테이너화할때 여러 개의 애플리케이션을 한 컨테이너에 설치할 수도 있다
- 다만 컨테이너에 어플리케이션 하나만 동작시키면 컨테이너 간의 독립성을 보장함과 동시에 어플리케이션 버전관리 소스코드 모듈화등이 더욱 쉬워진다 ( 도커의 철학 )
- 호스트와 바인딩된 포트만 확인
# check docker port docker port {container name, container ID}
- -d 옵션
- -i, -t 옵션으로 run을 실행하면 표준 입출력이 활성화된, 상호작용이 가능한 셸 환경을 사용할 수 있다
- -d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다
- 컨테이너 내부에서 프로그램이 터미널을 차지하는 포그라운드로 실행돼 사용자의 입력을 받지 않습니다
- Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료된다
- 컨테이너는 각기 하나의 모니터를 기본적으로 가지고 있다
- ubuntu:14.04의 이미지로 /bin/bash를 포그라운드로 실행한 컨테이너 존재
- 서로 다른 터미널에서 해당 컨테이너로 attach를 실행하면 서로 모니터를 공유하는 것을 볼 수 있다
- 즉 컨테이너마다 하나의 모니터를 기본적으로 가진다
- -e 옵션
- 컨테이너 내부의 환경변수를 설정
- 컨테이너화된 어플리케이션은 환경변수에서 값을 가져와 쓰는 경우가 많으므로 자주 사용하는 옵션중 하나입니다
- --link 옵션
- A 컨테이너에서 B 컨테이너로 접근하는 방법 중 가장 간단한 것은 NAT로 할당받은 내부 IP를 쓰는 것입니다
- 172.17.0.X 의 IP를 차례대로 하나씩 부여받은 컨테이너의 IP로 직접 접근 할 수 있지만, 컨테이너를 시작할 때마다 재할당하는 것이므로 매번 변경되는 컨테이너의 IP로 접근하기는 어렵습니다
- --link 옵션은 내부 IP를 알 필요 없이 항상 컨테이너에 별명으로 접근하도록 설정합니다
# link ... --link {contaninerName}:{link alias} ...
- --link 옵션으로 입력된 컨테이너가 실행 중이지 않거나 존재하지 않으면 실패한다
- 현재 deprecated된 옵션이며 추후 삭제될 가능성이 존재.. 후에 docker bridge를 통한 통신을 설명하겟습니다
728x90
반응형
'Study > Docker' 카테고리의 다른 글
Day 3. 도커 볼륨이란? (0) | 2021.09.02 |
---|---|
Day 1. 도커(Docker)란? (0) | 2021.08.12 |