[Docker] 도커 튜토리얼 따라해보기
도커 설치
https://docs.docker.com/docker-for-mac/install/
Docker.dmg 받아서 설치
잘설치되었는지 버전 확인해봤다
$ docker —version
아래 명령어는 더 상세히 보기.
$ docker info
hello-world 실행해봤다
$ docker run hello-world
$ docker run –detach –publish=80:80 –name=webserver nginx
훌륭한 nginx페이지가 떴다.
아래 명령어로 서버 러닝 상태를 확인 가능하다
$ docker container ls -a
또한 아래 명령어로 이미지 stop 및 삭제가 가능
$ docker container ls
$ docker container stop webserver
$ docker container ls -a
$ docker container rm webserver
$ docker image ls
$ docker image rm nginx
도커 for mac 18.06 이상에서는 독립형 쿠버네티스가 포함되어 있으므로 쿠버네티스에서 도커 부하를 테스트할 수 있다.
없으면 설치하도록 (설정에서 Enable 및 Default 설정 체크 풀어준다)
$ brew install kubectl
docker-for-desktop 컨텍스트로 전환한다.
$ kubectl config get-contexts
$ kubectl config use-context docker-for-desktop
도커 hub에서 이미지 땡겨오기
$ docker image pull ${name}
$ docker image pull alpine
ls -l을 실행시키면서 도커 alpine 컨테이너를 실행시켜라~(컨테이너 안에서 명령어 실행한거임)
$ docker container run alpine ls -l
$ docker container run alpine echo “hello from alpine”
컨테이너안에서 좀 인터렉티브하게 실행할때 아래 명령어로 응용하면 ㅇㅋ
$ docker container run -it alpine /bin/sh
도커허브 계정 로그인하기
$ docker login
도커 태그붙이기
docker tag 이미지 사용자이름/저장소:태그명
$ docker tag hello-world htrucci/hello-world:get-started
푸시 떄려버림 도커허브에 태그가 지정된 이미지 업로드 된다.
$ docker push htrucci/hello-world:get-started
이제부터 원격에서 저장소 땡겨서 이미지 실행가능
$ docker run -p 4000:80 htrucci/hello-world:get-started
Dockerfile로 앱 만들어보자. https://docs.docker.com/get-started/part2/#apppy
아무 폴더나 생성해서 아래파일 세개 생성
Dockerfile app.py requirements.txt
아래 빌드 명령어를 돌리고 나면
$ docker build –tag=friendlyhello .
friendlyhello 이미지가 생성된걸 볼 수 있다.
$ docker image ls
돌려보기
$ docker run -p 4000:80 friendlyhello
그런데 백그라운드 모드로 돌려줄 필요 있음.
$ docker run -d -p 4000:80 friendlyhello
http://localhost:4000/ 접속해보면 페이지 확인 가능
$ docker tag friendlyhello htrucci/get-started:part2
확인했으면 다시 죽이자
$ docker container stop gracious_liskov
일단 저장소 올릴거임
$ docker push htrucci/get-started:part2
docker-compose.yml 파일을 만들거임.
version: “3”
services:
web:
# replace username/repo:tag with your name and image details
image: htrucci/get-started:part2
deploy:
replicas: 5
resources:
limits:
cpus: “0.1”
memory: 50M
restart_policy:
condition: on-failure
ports:
– “4000:80”
networks:
– webnet
networks:
webnet:
인스턴스 5개를 호출하여 각 이미지가 CPU의 최대 10% 및 RAM 50M로 제한된 서비스 실행
서비스가 죽으면 즉시 다시시작할 것이며 4000포트를 80포트에 맵핑할거임
webnet으로 로드밸런싱을 사용하도록
로드밸런싱 실행하기 전
$ docker swarm init
실행해보기. getstartedlab으로 이름을 지정해줬음
$ docker stack deploy -c docker-compose.yml getstartedlab
web:Pending 쫌 오래걸리네…
Htrucci-MBP-2018:Docker Htrucci$ docker stack deploy -c docker-compose.yml getstartedlab
top-level network “webnet” is ignored
service “web”: network “webnet” is ignored
Waiting for the stack to be stable and running…
web: Pending [pod status: 0/18 ready, 18/18 pending, 0/18 failed]
아래 명령어 치면 서비스ID를 얻을 수 있다는데 안나오는데?
$ docker service ls
도커–쿠버네티스 설정에서 두번째 Default옵션 풀어서 해결했음.
5개의 서비스 단일 컨테이너(태스크) 확인해보기
$ docker service ps getstartedlab_web
http://localhost:4000 접속해보면 로드밸런싱 되어 각 컨테이너ID가 라운드 로빈 방식으로 로드밸런싱 됨을 확인할 수 있다.
이제 앱 죽이자
$ docker stack rm getstartedlab
swarm도 leave하자
$ docker swarm leave –force
스웜 클러스터로 묶이면 노드라고 불리운다.
[스웜 클러스터 만들기]
우선 버츄얼박스를 설치하시죠
https://www.virtualbox.org/wiki/Downloads
vm 2개 생성
$ docker-machine create –driver virtualbox myvm1
$ docker-machine create –driver virtualbox myvm2
VM 실행중인 리스트 한번 보자
$ docker-machine ls
웜에 가입시키기 위해 Swarm init하기
$ docker-machine ssh myvm1 “docker swarm init –advertise-addr <myvm1 ip>”
실행하면 swarm에 join하는 명령어를 만들어서 보여준다.
$ docker-machine ssh myvm2 “도커가 만들어준 명렁어“
스웜의 노드 확인해보기
$ docker-machine ssh myvm1 “docker node ls”
myvm1의 환경 확인해보기
$ docker-machine env myvm1
myvm1을 명령 active 상태로 만든다
$ eval $(docker-machine env myvm1)
Active에 별표있는지 확인
$ docker-machine ls
myvm1에 앱배포
$ docker stack deploy -c docker-compose.yml getstartedlab
잘 올라갔는지 확인
$ docker stack ps getstartedlab
vm리스트에서 확인한 ip로 접속하면 위에서 띄운 앱이 들어가지겠지만, 네트워크 포트 오픈 문제인지 들어가지지 않는다.
$ docker-machine ls
어떻게하는진 알았으니 스웜에서 다시 떼어내자
$ docker stack rm getstartedlab
machine active처리한것도 다시 해제하자
$ eval $(docker-machine env -u)
머신 시작시키는 명령어
$ docker-machine start <machine-name>
새 서비스를 추가시켜보기 위해
yml 수정 https://docs.docker.com/get-started/part5/#recap-optional
머신 다시 러닝 및 활성화 시키고
$ eval $(docker-machine env myvm1)
다시 앱 배포
$ docker stack deploy -c docker-compose.yml getstartedlab
서비스 떠있는거 확인하고
$ docker service ls
머신ip:80/8080 포트로 들어가봤는데 안떠
좋아 그럼 다시 해본다.
아래 링크의 iso이미지를 받는다
https://github.com/boot2docker/boot2docker/releases/tag/v18.06.1-ce
우선 스택오버플로에 있는 이미지로 머신을 다시 생성해줬음 (영향이 있는지는 모르겠으나)
$ docker-machine rm myvm1
$ docker-machine rm myvm2
$ docker-machine create –driver virtualbox –virtualbox-boot2docker-url ./boot2docker.iso myvm1
$ docker-machine create –driver virtualbox –virtualbox-boot2docker-url ./boot2docker.iso myvm2
생성된거 확인하고
$ docker-machine ls
활성화 해주고
$ eval $(docker-machine env myvm1)
Swarm init하는데 eth 둘중 하나 선택하란다. 아까 이거 때문에 안됐나??
$ docker swarm init
그럼 192.168…로 시작하는 eth1로 지정해주지
$ docker swarm init –advertise-addr eth1
myvm2를 swarm에 join해주고.. 다시 앱 배포하고
$ docker-machine ssh myvm2 “조인 명령어”
$ docker stack deploy -c docker-compose.yml getstartedlab
서비스상태, IP다시 확인해보고 브라우저로 80, 8080 들어가봤다.
$ docker stack ps getstartedlab
$ docker service ls
$ docker-machine ls
이제야 잘 나온다.
이제 레디스를 붙여보자
yml수정하기
https://docs.docker.com/get-started/part5/
myvm1에 ./data 디펙토리 생성
$ docker-machine ssh myvm1 “mkdir ./data”
다시 배포
$ docker stack deploy -c docker-compose.yml getstartedlab
서비스 ls해보면 _redis추가되어 돌고있음을 확인할 수 있다.
8080포트에 접속해서 Visualizer로 봐도 알 수 있다
$ docker service ls
myvm1 IP를 브라우저로 접속하면 Visit카운트를 Redis에 저장함을 볼 수 있다.
최근 댓글