본문 바로가기
반응형

<시작하세요! 도커/쿠버네티스> 책을 보며 공부한 자료 정리하여 게시하고 있습니다.

책 내용의 100프로를 다 공부하지도 않고, 모든 내용을 다 올리지는 않으니 더 많은 자료는 책을 참고하시길 바랍니다..

 

1. 도커 Run 명령어

$ docker run -i -t ubuntu:14.04

docker run 명령어를 입력하면 해당 이미지(ubuntu:14.04) 를 받아 컨테이너를 생성하고 실행하는 역할

이후 자동으로 이미지 내부로 들어가 게된다.

-i -t 옵션은 컨테이너와 상호 입출력을 가능하게 함 (interactive)

---> -t 옵션으로 상호 입출력, -t 옵션으로 tty를 활상화하여 배시 셸 사용

 

이미지 내부에서 다시 밖으로 나가기 위해선

exit

를 입력해준다.

 

 

2. 내려받은 이미지 확인

root@k8s-node1:~# docker images
REPOSITORY                               TAG               IMAGE ID       CREATED         SIZE
mysql                                    5.7               daff57b7d2d1   8 weeks ago     430MB
wordpress                                latest            a11fafff58cd   8 weeks ago     609MB
jennifer                                 latest            a6b7c5b874f8   2 months ago    195MB

docker images 로 이미지를 local 에 받은 이미지 리스트를 확인할 수 있다.

 

 

3. docker create, run 차이

 

docker run 명령어는 아래의 절차를 수행한다.

1) docker pull (이미지 없을 때 인터넷에서 이미지 다운로드)

2) docker create (이미지로 컨테이너 생성)

3) docker start (컨테이너 시작)

4) docker attach (해당 컨테이너로 접근 -i -t 옵션을 사용했을 때)

 

반면 docker create 명령어는 위 항목 중 2번까지만 수행한다. 대개 생성함과 동시에 시작하는 편이 많으므로 run 을 많이 쓰게 될 것이다.

 

 

4. 컨테이너 삭제

# docker ps -a 
(현재 어떤 컨테이너가 떠있는지 확인)

# docker stop ${CONTAINER ID 혹은 NAMES}
(삭제 전 컨테이너 우선 종료)

# docker rm ${CONTAINER ID 혹은 NAMES}
(rm 명령어로 컨테이너 삭제)

# docker images
(어떤 이미지들이 받아져있는지 확인)

# docker rmi ${IMAGE_ID}
(rmi 명령어로 이미지 삭제 가능)

 

만약 모든 컨테이너를 한번에 내리고 지우고 싶다면 다음 명령어를 입력 하면 된다

(실제 운영 환경에서 사용해서는 안되며, 개인테스트 공간에서 사용 권장)

# docker stop $(docker ps -a -q)

# docker rm $(docker ps -a -q)

$(docker ps -a -q) 를 인자로 받아서 실행되며, -q 옵션은 CONTAINER_ID 값만 출력시켜주는 옵션이다.

 

또는 

root@k8s-node1:~# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

prune 명령어를 이용해 컨테이너를 다 삭제할 수 있다.

 

 

5. 컨테이너 생성시 네트워크 설정

 

컨테이너를 생성하면 도커가 설치된 host PC에서만 접근이 가능하다. 외부에서도 접근이 가능하게 하려면 외부 포트와 바인딩을 시켜주어야 한다.

 

# docker run -i -t -p 7001:7001 -p 192.168.100.37:7900:80 ubuntu:14.04

-p 옵션을 이용해 [host PC Port] : [Container Port] 바인딩을 할 수 있다.

-p 옵션을 여러개 적용하면 동시에 여러 포트를 바인딩 할 수 있다.

 

위의경우 호스트(192.168.100.37)의 7001 번으로 접근하면 내부 도커 컨테이너의 7001번 포트랑 바인딩 되어 컨테이너 내부로 접근이 가능해진다.

 

 

6. 볼륨 공유

 

컨테이너의 데이터를 다른 컨테이너 또는 호스트와 공유할 때 사용한다.

호스트와 볼륨을 공유할 수 있고, 아예 볼륨용 컨테이너를 생성할 수도 있고 도커가 관리해주는 볼륨을 생성할 수도 있다.

 

1) 호스트와 볼륨 공유

root@k8s-node1:/home# echo test1 > test
root@k8s-node1:/home# echo test2 > test2
root@k8s-node1:/home# docker run -i -t --name host_volume -v /home/test:/test -v /home/test2:/test2 ubuntu:14.04

(컨테이너 안으로 진입됨)
root@e519257a2b13:/# pwd     
/
root@e519257a2b13:/# cat test && cat test2
test1
test2
root@e519257a2b13:/#

-v [host]:[container] 로 볼륨매핑을 할 수 있다.

완전히 같은 파일(또는 디렉토리매핑시 디렉토리)로 볼 수 있다.

 

--name 옵션은 해당 컨테이너 이름을 설정하는 옵션 (docker ps 에서 name 을 확인할 수 있다)

 

2) 볼륨 컨테이너로 공유

root@k8s-node1:/home# docker run -i -t --name volumeContainer -v /home/test:/test ubuntu:14.0
root@61d8b44e7865:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
(test 파일이 잘 공유[볼륨매핑]되었는지 확인)
root@61d8b44e7865:/# exit
exit

root@k8s-node1:/home# docker run -i -t --name fromVolumeContainer --volumes-from volumeContainer ubuntu:14.04
root@eab5d2510af8:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
(새로 만든 컨테이너에 volumes-from 옵션으로 test파일이 잘 공유되었는지 확인)

위에서 만든 test 파일을 이용하였다.

--volumes-from 옵션으로 -v 옵션을 그대로 따와 적용할수 있다.

 

 

3) 도커 볼륨 활용

root@k8s-node1:/home# docker volume create --name myvolume
myvolume
root@k8s-node1:/home# docker volume ls
DRIVER    VOLUME NAME
local     myvolume

docker volume create 를 이용하여 도커 볼륨 생성

 

root@k8s-node1:/home# docker run -i -t --name myvolumeTest -v myvolume:/root/ ubuntu:14.04

root@0ef80610c8bc:/# echo myVoluem TEST >> /root/volumeTEST
root@0ef80610c8bc:/# cat /root/volumeTEST
myVolume TEST

root@0ef80610c8bc:/# exit
exit

생성한 myvolume(도커 볼륨)을 이용하여 컨테이너 생성 후

공유한 폴더(/root) 아래에 파일 생성해봄.

 

root@k8s-node1:/home# docker inspect myvolume
[
    {
        "CreatedAt": "2022-10-20T11:09:54+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]

root@k8s-node1:/home# ls /var/lib/docker/volumes/myvolume/_data/
volumeTEST
root@k8s-node1:/home# echo volumeHost TEST >> /var/lib/docker/volumes/myvolume/_data/volumeHostTEST

docker inspect (자세한 정보 출력하는 명령어) 로 도커 볼륨에 자세한 정보 출력

 

mountpoint 를 확인하여 해당 위치에 위에서 생성한 파일이 있나 확인

host 에서도 파일을 하나 생성해봄

 

root@k8s-node1:/home# docker run -i -t --name myvolumeCheck -v myvolume:/root/ ubuntu:14.04
root@4e6eec2ace1a:/# ls /root/
volumeHostTEST  volumeTEST
root@4e6eec2ace1a:/# cat /root/volumeHostTEST && cat /root/volumeTEST 
volumeHost TEST
myVolume TEST

새로운 컨테이너 myvolumeCheck 를 만들어 myvolume 도커볼륨이 잘 공유되는지 확인해본다.

 

 

 

* -v 옵션을 이용해 볼륨을 만들면 자동으로 docker volume create 가 수행되어 볼륨이 만들어진다.

3번의 경우 따로 볼륨의 이름을 지정해 관리를 더 수월하게 할 수 있다.

 

 

사용하지 않는 볼륨을 지우려면

# docker volume rm ${볼륨이름}

# docker volume prune
(사용되지 않는 볼륨들 전부 삭제)

 

볼륨을 사용하여 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하게 설계한 것을 stateless 하다고 하며, 컨테이너가 데이터까지 저앟가오 시는 경우는 stateful 하다고 한다.

stateful 한 컨테이너는 지양하는 것이 좋다.

728x90
반응형

한걸음 한걸음

개인적인 기록