docker 사용법
구조
기존 VM 은 호스트 OS에 하이퍼바이저가 올라가며 하이퍼바이저(VMM)가 게스트OS에 사용할 하드웨어를 에뮬레이팅 후 그 위에 게스트OS를 설치하는 방식이다. 그렇기 때문에 게스트OS에 대한 제약이 없다.
ex) VMWare, Parallels, QEMU, VirtualBox
Docker는 호스트 운영체제 위에서 도커 엔진이 실행되고, 도커엔진이 실행환경을 분리하여 원하는 서비스를 설치하는 방식이기 때문에 모든 컨테이너들이 동일 OS 커널을 공유하고, 윈도우나 맥에서 사용하기 위해서는 경량형 hypervisor가 함께 설치된다.
레지스트리 : 도커 이미지 저장소
이미지 : 서비스 운영에 필요한 서버 프로그램, 소스코드, 실행파일을 묶은 형태
컨테이너 : 이미지를 실행한 상태
클라이언트 : docker run, docker build등의 명령을 입력하면 Server에 전송하고 도커데몬이 수행한다.
도커데몬 : 도커명령(api)을 수신하고, 이미지, 컨테이너, 네트워크, 볼륨등 오브젝트를 관리한다. 다른 데몬과 통신을 통해 서비스 관리 가능
네트워크
도커의 브릿지 네트워크는 호스트가 IP MASQUERADE(=NAT) 해주면서 사설 ip를 가진 컨테이너들이 호스트의 공인ip를 타고 밖으로 나가는 NAT와 동일한 기능을 수행하도록 iptables에 세팅해주는것이다. 하지만 이것은 NAT 세팅만 해준것이지 패킷에 대한 방화벽을 열어준게 아니기 때문에 방화벽 규칙에서 제외시켜줘야한다.
컨테이너에서 docker0으로 핑이 안되고, docker0(hostPC)에선 컨테이너로 핑이 가능한 상황이 있었는데
호스트는 도커에서 브릿지를 사용하게되면 docker0 이라는 인터페이스를 추가하고, 방화벽은 모든 인터페이스의 바로 뒤에 있기 때문에 인터페이스를 거쳐 들어오는건 방화벽을 통한다.
tcpdump로 docker0 인터페이스를 확인해봐도 request는 제대로 받지만 reply가 안되고 있는것을 확인할 수 있다.
호스트pc 입장에서는 컨테이너가 방화벽에서 차단을 해야되는 ip인지, 아닌지 알 수 없기 때문에 (내부아이피라도 차단해야되는 경우가 있음) 호스트에서 브릿지로 연결된 컨테이너의 방화벽을 열어주면 외부 통신이 가능해진다.
명령어
docker search centos : 이미지 검색
docker pull centos:lastest : 이미지 다운로드
docker images : 이미지 목록 보기
docker run <option> <REPOSITORY or IMAGE ID> <runfile>
-d : runfile을 실행시키기 위해 컨테이너 생성 및 실행이 된것이기 때문에, 실행파일이 종료되면 컨테이너도 종료된다. 컨테이너가 종료되지 않도록 데몬프로세스 형태로 실행하는 옵션
-i : 사용자가 입출력을 할 수 있는 상태로 실행한다.
-t : 가상 터미널 환경을 에뮬레이션 하는 옵션. 쉘을 사용하려면 이 옵션을 사용해야한다. 설정하지 않으면 명령은 사용할 수 있지만, 셸이 표시되지 않는다.
--name <name> : 컨테이너 이름 설정
-p "HOST_PORT:Docker_PORT" : 포트포워딩 설정
-h <hostname> : 컨테이너 호스트네임 설정
docker ps -a : 컨테이너 목록 확인. -a옵션으로 종료된 컨테이너도 확인가능
docker start <container id> : 종료된 컨테이너를 시작한다.
docker attach <container id> : 실행중인 컨테이너에 접속한다.
docker stop <container id> : 컨테이너 종료
docker rm <container id> : 컨테이너 삭제
docker build --tag testtag <dockerfile path> : dockerfile에 정의된 내용으로 이미지를 생성하는 명령어. dockerfile 경로에서 실행하면 dockerfile path를 . 으로 둘 수 있다.
docker exec -it [container] [command] : 컨테이너에서 명령어 실행. command에 bash입력하면 쉘 접근가능
docker network inspect bridge : 브릿지 네트워크에 연결된 아이피, 컨테이너 확인
ip link ls
brctl show
ip route : 라우팅테이블 확인
기본 패키지 설치
apt-get update
* there is no public key 에러 발생 시
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <require KEY IDs>
미러서버 변경
$ sed -i 's/kr.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list # 한국
$ sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list # 미국
$ sed -i 's/ports.ubuntu.com/ftp.harukasan.org/g' /etc/apt/sources.list # 라즈베리 파이
apt-get install net-tools : ifconfig
apt-get install iputils-ping : ping
apt-get install gcc
apt-get install ssh -> https://parktest0325.tistory.com/189
apt-get install sudo -> usermod -a -G sudo test1
curl, git, traceroute, man, vim,
계정생성
useradd -s /bin/bash -m -p [PW] [ID]
도커에서 설치한 우분투는 재시작 시 root의 bash쉘이 한번 실행된다.
그래서 /root/.bashrc 에 실행할 명령어를 맨밑에 두면 재부팅 시 자동으로 실행한다.