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 URL : https://cloud.docker.com/u/tony950620/repository/docker/tony950620/week_docker
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 --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