Infra/Docker

Docker의 기본 2

자라선 2020. 7. 28. 12:15
1.Docker Command
 
  • Image : 변하지않는 빌드 된 셋팅 이미지
  • Container : Image를 run 하였을때 생성된 컨테이너 박스
    • run = Create + Start + Attach
    • exec = Create
    • attach = Attach
 
Docker Command 
 
이미지 생성
docker run <이미지 명> : 해당 이미지로 컨테이너 생성 후, 실행
docker exec <이미지 명> : 해당 이미지로 컨테이너 생성
  • -i : STDIN OPEN
  • -t : 가상의 tty에 접근
  • -d : backgroud로 실행 (not attach)
  • --restart=always : 종료해도 항상 재부팅
 
이미지 제거
docker rmi <이미지 명> : 이미지 제거
 ※ 단! 이미 해당 이미지로 구동중인 컨테이너가 있다면, 제거 불가능!  -f 를 사용하여 강제 제거해야함
  • -f : 강제 제거
  • $( 명령어 ) : <이미지 명> 매개변수에 명령어로 대입하여 응용제거 가능, 예) docker rmi $(docker images -q) : 현재 모든 이미지 강제 삭제
 
Docker-hub에 이미지 가져오기 (pull)
docker login : docker-hub 아이디로 로그인, private 서버 접속시 default port : 5000
docker pull <가져올 계정 ID>/< Repositoy >:<tag> : docker-hub에서 image 다운로드 (단! Public Repositoy 만)
예) docker pull tony950620/week_docker:nginx_v1
 
Docker-hub에 이미지 올리기 (push)
docker tag <원본 이미지 명>  <계정 ID>/< Repositoy >:<tag> : 기존 이미지에 태그를 추가로 붙혀 태그를 붙힌다. (이미지 ID가 같게 만들어진다.)
예) docker tag ubuntu tony950620/week_docker:ubuntuTest
 
docker push <계정 ID>/< Repositoy >:<tag> : 해당 이미지를 push 하여 docker-hub에 올린다.
예) docker push tony950620/week_docker:ubuntuTest
 ※ 자기만의 Repositoy에 들어가서 확인 가능
 
이미지 검색
docker search <이미지 명> : 현재 docker-hub에 게시 되어있는 image 검색
 
이미지 정보
docker image inspect <이미지 명> : 해당 이미지의 상세정보
docker inspect --format="{{ .Os}}" <이미지명>                                     : 해당 이미지의 OS 정보
docker inspect --format="{{.Architecture}}"  <이미지명>                      : 해당 이미지의 아키텍처 정보
docker inspect --format="{{.ContainerConfig.Image}}"  <이미지명>    : 해당이미지의 digest(DCT)
 
cd /var/lib/docker/overlay2 : 현재 이미지들의 저장되어있는 디렉토리
 
컨테이너 로그 조회
docker logs <컨테이너 명> : 해당 컨테이너의 쉘 로그를 조회할수있다.
  • -f : 실시간으로 조회
  • -t : 로그를 한화면으로 출력
 
 
Docker Network
Docker server는 docker0 라는 virtual ethernet bridge를 가지고있다. 
$ ifconfig
 
컨테이너를 생성하거나 브릿지를 따로 설정해주지 않으면 기본으로 docker0에게 사설 ip를 부여받아 사용하게된다.
docker0 는 위와같이 172.17.0.1 이므로 할당 받은 컨테이너들의 ip들은 172.17.0.2 ~ 3, 4 ,5 .... 으로 끝자리가 +1으로 자리잡게된다.
 
만약 일반적인 방법으로 다른 ip 대역대로 잡고싶다고 한다면 보통은 물리적인 공유기나 라우터등을 구축하여 물리적인 비용이 늘게되는데 이를 docker는 단 하나의 명령어로 새로운 네트워크 환경을 만들어낼수 있다.
또한 mac 이나 DNS, host, port를 추가로 설정할수 있다.
 
docker run -d --dns=192.168.1.1 nginx    :    DNS서버 설정 후 run
docker run -d --mac-address="92:d0:c6:0a:29:33" centos    :    MAC Address 설정후 run
docker inspect --format="{{ .Config.MacAddress}}" <컨테이너ID>    :    MAC Address 조회
docker run -it --add-host=test.com:192.168.1.1 centos    :    호스트명과 IP Address 설정 후 run
docker run -it --hostname=www.test.com --add-host=node.test.com:192.168.1.1 centos    :    호스트명과 추가 호스트명설정
 
   Docker Create Network
        docker run -it --net=host centos:6    :    host를 그대로 사용한다.
 
        docker network create -d bridge webap-net    :    새로운 virtual ethernet bridge를 만든다.
        docker container run --net=webap-net -it centos     :    만든 bridge로 컨테이너 생성
        yum -y install net-tools && ifconfig
        docker network ls
        brctl show
        ip route
 
docker inspect webap-net
새로운 virtual ethernet bridge를 생성하여 새로운 게이트웨이를 볼수 있다.
 
Virtual etherner bridge Image
 
Docker Container 간에 SSH BYPASS    :    https://drive.google.com/open?id=1_xm4NgmIn31ZMK88h0gl_WeHyAlRPVnl
 
 
Docker Container Resource Limit
docker의 container는 CPU, Memory, Dist에 대한 제한을 따로 설정해두지 않으면 100%가 default로 설정된다.
 
google에서 linux용 Container Resource monitoring tools cadvisor를 지원해주고있다.
 
sudo docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest
 
linux Monitoring tools - htop 
 
Memory Limit
    sudo vi /etc/default/grub
    GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
    sudo update-grub
    sudo reboot
    docker run -d --memory=1g --name=nginx_mem_1g nginx
 
커널 설정상의 문제로 에러나 나는 경우 1~2라인을 통해 설정을 바꿔줘야한다.
 
CPU Limit
 docker run -d --name cpuset2 --cpuset-cpus=0-3 alicek106/stress stress --cpu 1    :    cpu 부하 0부터시작 - 1,4