[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 포트로 들어가봤는데 안떠

좋아 그럼 다시 해본다.

https://stackoverflow.com/questions/53451285/connection-refused-on-docker-tutorial-get-started-part-4

아래 링크의 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 저장함을 있다.

You may also like...

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.