'Docker'에 해당되는 글 8건

  1. 2019.02.22 Docker : 이미지 편
  2. 2019.02.15 Docker : 컨테이너 편 (1)
  3. 2019.01.31 Docker : 설치 편
  4. 2019.01.16 Docker : 기초 편 (2)

Docker : 이미지 편

Docker 2019. 2. 22. 15:00

Docker 이미지 개요


이번 편에서는 도커 이미지의 생성과 삭제, 이미지의 구조를 알아보려고 한다.


파일에 대한 분산버전관리를 웹 호스팅으로 지원하는 GitHub에서는 계정만 있으면 본인의 프로젝트를 push 할 수 있고 공개된 프로젝트라면 누구나 업로드 된 프로젝트를 pull 할 수 있다.



이와 마찬가지로 도커에서는 Docker Hub라는 중앙 이미지 저장소를 제공하고 있고 도커 계정이 있다면 누구나 업로드, 다운로드가 가능하다는 점에서 GitHub와 비슷하다고 볼 수 있다.


지난 컨테이너 편에서 컨테이너 생성 전에 docker pull 명령어로 묻지도 따지지도 않고 ubuntu 이미지를 내려 받았었다. docker pull 명령을 입력하면 기본적으로 도커 허브(Docker Hub)라는 중앙 이미지 저장소를 바라보고 해당 이미지가 있다면 내려받는다.




Docker 이미지 생성과 삭제


도커 이미지는 지난 컨테이너 편에서 한번 내려받았으므로 먼저 이미지 삭제 후 다시 내려받을것이다.

이미지 삭제는 컨테이너를 지우는 것 만큼 간단하게 할 수 있다. 지난시간에 만든 이미지 목록을 docker images 명령을 입력하여 확인해보자.


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE ubuntutest_img latest b5d9797d2234 7 days ago 216 MB docker.io/ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 MB



apache2가 설치된 ubuntutest_img와 도커허브에서 내려받은 공식버전 ubuntu 14.04버전이 목록에 출력 되었다. docker rmi 명령어로 이미지를 삭제한다. (Deleted: sha256:b5d9797d22340d....와 같은 해시코드는 잠시 후 이미지 구조에서 설명하겠다.)


# docker rmi b5d9797d2234 Untagged: ubuntutest_img:latest Deleted: sha256:b5d9797d22340d09f6d3f1ad3bd324e32709c8c79193419ce182dc4241b57685 Deleted: sha256:9fc4083d26906a29c77640dea07a396d3cd8d23536d3a4a9a80249ab8272fe12

# docker rmi 5dbc3f318ea5

Untagged: docker.io/ubuntu:14.04 Untagged: docker.io/ubuntu@sha256:cac55e5d97fad634d954d00a5c2a56d80576a08dcc01036011f26b88263f1578 Deleted: sha256:5dbc3f318ea50ea06fca865425e7d2b47fa2baa6094d3cb3760a1721f828a0ae Deleted: sha256:5dfbfe35dbdbb50d4c55416c4f87d870243f1ab00c42c8df3a77fa6169babf5f Deleted: sha256:22ec73a9fd69b430b5e164916e6476bf7fc0963897c4af32e6c3857d3357f023 Deleted: sha256:28df65e350302192e76c49c6157d8c9925c65e9f2f7f882900f42915fa487a02 Deleted: sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6



이미지가 잘 지워졌다.


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE



이제 콘솔에 docker images 명령어를 아무리 외쳐봐도 텅 빈 Repository만 출력 될 뿐이다.

공허함에 사무쳐 오늘도 눈물을 흘린다.


(저쪽 세상에서도 행복해야해!!)




는 테스트를 위해 재빨리 새로운 이미지를 내려받도록 하자


# docker run -i -t ubuntu:14.04

Unable to find image 'ubuntu:14.04' locally Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu e53f134edff2: Pull complete efbbd466a715: Pull complete e11368b8e0c7: Pull complete 7dab2de7692b: Pull complete Digest: sha256:cac55e5d97fad634d954d00a5c2a56d80576a08dcc01036011f26b88263f1578 Status: Downloaded newer image for docker.io/ubuntu:14.04




Docker 이미지의 구조



도커 이미지는 Layer라는 계층구조를 가지고 있다. ubuntu 이미지를 내려받은 시점부터 어떤 변화가 일어나면 도커는 그 내용을 Layer라는 항목으로 저장한다.



도커 이미지의 Layer 정보를 확인하려면 inspect 명령으로 확인 할 수 있다. 방금 다운로드 받은 ubuntu 이미지의 Layer를 확인 해보자.

총 4개의 Layer가 확인 되었다. 


# docker inspect ubuntu:14.04 ...

"Layers": [ "sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6", "sha256:d1b9ba926eff7fe934a15b295c9d86e899aa0d9ebdd9064501ffe28ae6ab3f7f", "sha256:8f9b85d7bbd37cd511f70bb4d25078177cd7f0d2b7644cd7f545b60e084d6b09", "sha256:40f4c1f68b3783868af0759c34c67d7338b0a640b3a452275dd34541424a7f24" ]


Layer가 추가되는 과정을 확인 해보기위해 새로운 컨테이너를 생성하고 docker commit 명령어로  두 개의 이미지를 더 생성한다.


# docker run -i -t --name layer_test ubuntu:14.04

root@c73025587f2b:/# exit exit # docker commit layer_test layer_test:first sha256:48f47ef8257da1311d3bd68d0874b5078075760c5162042b674c009a005e22c8 # docker run -i -t --name layer_test2 layer_test:first

root@d33a60d75c45:/# echo layer_test2 >> test2 root@d33a60d75c45:/# exit exit

# docker commit layer_test2 layer_test:second

sha256:127ab2a395852fb94f21a165c0848961c40b3c098c06dfbb215220953accd5a0



이제 Layer가 어떻게 늘어났는지 각 이미지들의 정보를 확인해보자


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE layer_test second 303124b8ac57 2 minutes ago 188 MB layer_test first 48f47ef8257d 2 minutes ago 188 MB docker.io/ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 MB

# docker inspect layer_test:first


...


"Layers": [ "sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6", "sha256:d1b9ba926eff7fe934a15b295c9d86e899aa0d9ebdd9064501ffe28ae6ab3f7f", "sha256:8f9b85d7bbd37cd511f70bb4d25078177cd7f0d2b7644cd7f545b60e084d6b09", "sha256:40f4c1f68b3783868af0759c34c67d7338b0a640b3a452275dd34541424a7f24", "sha256:2e3b0a26611390fb38e16eda5c942b8fa0a8db41097cf57286b3d530b240e809" ]


# docker inspect layer_test:second

...

"Layers": [ "sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6", "sha256:d1b9ba926eff7fe934a15b295c9d86e899aa0d9ebdd9064501ffe28ae6ab3f7f", "sha256:8f9b85d7bbd37cd511f70bb4d25078177cd7f0d2b7644cd7f545b60e084d6b09", "sha256:40f4c1f68b3783868af0759c34c67d7338b0a640b3a452275dd34541424a7f24", "sha256:2e3b0a26611390fb38e16eda5c942b8fa0a8db41097cf57286b3d530b240e809", "sha256:257c7e092ad9a30f4ee28ba63bd7bf296d2ef55244f6cc4ca7952c06e911e666" ]



파란색은 원본인 ubuntu:14.04, 노란색은 layer_test:first, 연두색은 layer_test:second이다.

컨테이너 생성 후 docker commit으로 새로운 이미지가 생성 될 때 마다 레이어가 추가 된 모습을 볼 수 있다.

이해를 돕기 위해 이것을 그림으로 나타내면 아래와 같다. 필자는 이것을 변화의 레이어 화 라고 하겠다.






그런데 여기서 한 가지 의문이 드는 부분이 있다. 이미지 size가 생성 할 때 마다 188MB씩 늘어나고 있는데 그렇다면 매번 commit 할 때마다 용량이 늘어나는것인가? 


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE layer_test second 303124b8ac57 2 minutes ago 188 MB layer_test first 48f47ef8257d 2 minutes ago 188 MB docker.io/ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 MB



결론부터 말하자면 용량이 증분 형태로 늘어나지는 않는다. 말 그대로 Layer를 생성하여 이미지 위에 덧 붙인다고 생각하면 쉽다. 원본 ubuntu:14.04의 용량 188MB에 layer_test:first의 용량 1MB 미만, layer_test:second의 용량 1MB미만이라고 보면 된다. 



그럼 layer_test:second는 layer_test:first기반으로 만들어진 이미지인데 layer_test:first가 삭제되면 layer_test:second는 어떻게 되는 것인가?


# docker rmi layer_test:first (?)


이 경우 layer_test:first를 기반으로 두고 있는 layer_test:second가 아직 살아 있기 때문에 layer_test:first의 Layer의 내용은 보존 된 채로 layer_test:first라는 이미지 이름만 사라지게 된다.



여기까지 도커 이미지의 생성과 삭제 그리고 도커 이미지의 구조까지 간략히 살펴보았다. 

도커 이미지의 Layer 구조는 포토샵에서 쓰이는 Layer 기능과 비슷하다고 생각하면 이해가 쉬울 것이다.

이상으로 Docker : 이미지 편을 마치겠다.

(급하게 마치는 감이 없지않아 있는데 절대 시간에 쫓겨서 쓴 글이 아니다.)




Docker : 이미지 편
끝.

'Docker' 카테고리의 다른 글

Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : Dockerfile 편  (0) 2019.03.07
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Docker : 기초 편  (2) 2019.01.16
Posted by DevStream

댓글을 달아 주세요

Docker : 컨테이너 편

Docker 2019. 2. 15. 15:49

[Docker : 기초 편]

[Docker : 설치 편]

[Docker : 컨테이너 편]



Docker 컨테이너 개요



지난 Docker : 설치 편에 이어 이번 내용은 도커 핵심기술인 컨테이너에 대한 설명을 하고자 한다.

컨테이너라고 하면 무엇이 떠오르는가?



사무실의 전경





일반적으로 컨테이너라고 하면 대형 선박에 싣는 규격화 선적물을 떠올릴 수 있다.

도커에서 컨테이너는 독립적이고 규격화된 프로세스를 의미한다.





Docker 이미지



도커 컨테이너와 도커 이미지는 뗄래야 뗄 수 없는 사이 이므로 컨테이너를 설명하기 전 도커 이미지에 대해 간략히 알아보도록 하자 먼저 도커 이미지는 도커 컨테이너의 기반이 되는 읽기전용 데이터라고 생각하면 이해가 쉽다. 마치 가상 드라이브에 마운트 시키는 iso파일과 비슷한 개념이라고 보면 된다.

(맨 끝의 어플리케이션들은 각각의 Linux OS를 기반으로 생성한 각각의 컨테이너다.)



도커엔진을 통해 컨테이너를 생성하기위한 이미지를 내려받고 그 이미지를 기준으로 여러 컨테이너들을 생성 할 수 있다. 예를들어 Ubuntu기반의 Apache를 실행하기 위해서는 Ubuntu 이미지를 내려받고 도커를 통해 이미지에 접근 및 컨테이너 생성 후 Apache, MariaDB 등 원하는 응용프로그램을 내려받아 설치 할 수 있다.




Docker 컨테이너 생성



그럼 지금부터 Ubuntu 도커 이미지를 내려받고 아파치 설치 후 80포트로 접근이 되는지 확인하는 간단한 실습을 진행하겠다. 우선 지난 Docker : 설치 편의 마지막 명령은 도커 설치명령만 수행 한 상태로 마무리 되었으므로 도커 명령을 실행 해도 바로 실행 할 수 없을 것이다. 먼저 도커 서비스를 활성화 시켜주도록 하자


# systemctl start docker # systemctl status docker

● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2019-02-14 18:39:46 KST; 18min ago Docs: http://docs.docker.com Main PID: 19866 (dockerd-current) Tasks: 17 Memory: 309.0M CGroup: /system.slice/docker.service ├─19866 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/... └─19870 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/contain...



도커 서비스 활성화가 완료 되었으면 



묻지도 따지지도 않고 Ubuntu 이미지를 내려받도록 하자.


(물론 강요는 아니며 이미지는 각자 편의에 따라 사용하기를 추천한다 CentOS가 더 편하다면 CentOS로 내려받도록 하자.) 필자는 docker pull ubuntu:14.04 명령을 통해 이미지를 내려받았다.


# docker pull ubuntu:14.04

Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu e53f134edff2: Pull complete efbbd466a715: Pull complete e11368b8e0c7: Pull complete 7dab2de7692b: Pull complete Digest: sha256:cac55e5d97fad634d954d00a5c2a56d80576a08dcc01036011f26b88263f1578 Status: Downloaded newer image for docker.io/ubuntu:14.04


다운로드 받은 이미지 목록을 확인하려면 다음 명령을 수행한다.
IMAGE ID는 이미지의 고유 번호로 이미지를 삭제하려면 해당 IMAGE ID를 알고 있어야 한다.


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu 14.04 5dbc3f318ea5 3 weeks ago 188 MB



이제 다운로드 받은 이미지를 통해 컨테이너를 생성하고 접근해보자

컨테이너 생성과 동시에 해당 컨테이너의 고유값이 출력 되며 이 16진수 해시값으로 명령을 수행할때 사용할 수 있다.


# docker create -i -t --name ubuntutest docker.io/ubuntu:14.04

b0c51e1ead4b1e4234537ec00394837144ce83f64c2d3c2e1eb7cbabcec8af41

# docker start ubuntutest // 컨테이너 활성화

# docker attach ubuntutest // 컨테이너로 접근



attach 명령을 통해 컨테이너 내부로 접근하고 ls 명령을 사용하여 디렉토리들을 확인 해보자 일반적인 Ubuntu Root 경로와 같다는것을 확인 할 수 있다. 


root@b0c51e1ead4b:/# ls

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var



이제 아파치를 설치 해보자.

먼저 apt-get update 명령으로 패키지를 최신화 시켜주고 최신화가 완료되면 apt-get install apache2 -y 명령으로 아파치를 설치 해준다.


# apt-get update

...

# apt-get install apache2 -y

Reading package lists... Done Building dependency tree Reading state information... Done

...

invoke-rc.d: policy-rc.d denied execution of start. Setting up ssl-cert (1.0.33) ... Processing triggers for libc-bin (2.19-0ubuntu6.14) ... Processing triggers for sgml-base (1.26+nmu4ubuntu1) ... Processing triggers for ureadahead (0.100.0-16) ...




Docker 컨테이너 접근



이제 Host OS에서 도커 컨테이너에 설치 된 아파치에 접근 해볼것이다.

이해를 돕기 위해 우리가 구축한 VM 기반의 구조에 도커가 설치된 모습을 그림으로 설명하면 아래와 같다.

Docker : 기초 편에서 설명했던 Virtual Machine 구조와 Docker Engine의 구조가 합쳐져있는 모습이라고 보면 된다.





그런데 지금 당장 도커 컨테이너의 Apache에 접근하는데 영 좋지않은 문제가 있다. 도커는 컨테이너를 생성하는 순간 포트설정을 해주지 않으면 외부에서 컨테이너로 접근할 수 없고, 한번 생성된 컨테이너는 추가로 포트오픈이 불가능하다. 


(안돼!!)


때문에 docker run (또는 create) 명령으로 컨테이너를 생성하는 순간에 포트설정을 해야 한다.


필자는 docker run 명령을 수행하면서 옵션으로 80포트끼리 포트포워딩 하였다.

(포트포워딩에 대한 개념이 이해가 잘 가지 않는다면 Docker : 설치 편을 참고하기 바란다.)


# docker run -i -t --name ubuntu_apache -p 80:80 docker.io/ubuntu:14.04

root@d9f0845cc1b5:/# exit


docker run 명령어는 docker pull, docker create명령과 docker start, docker attach축약해둔 명령어로 이미지를 내려받고 컨테이너를 생성함과 동시에 컨테이너 내부로 진입 하였다. 여러모로 편리한 명령어 이므로 자주 사용하게 될 것이다.


그런데 아무리 생각해봐도 가슴 한켠이 너무 허전하다는 느낌이 든다.

어떻게 만든 ubuntutest 컨테이너인데.. 무려 Apache2까지 설치한 컨테이너를 이대로 지우기에는 너무 억울하다.



기존 컨테이너에서 작업 된 내용을 보존하면서

다시 새로운 컨테이너를 생성하는 방법은 없을까?



물론 있다. docker commit 명령어를 사용하면 쉽게 해결 할 수 있다.

docker의 commit 명령어는 현재까지 작업 된 컨테이너의 내용을 보존하여 이미지화 시키는 기능으로 간단히 설명하면 순수 windows만 들어있던 iso 파일로 OS를 설치하고 그 곳에 jdk 1.8을 설치한 후 이것을 다시 iso로 만들었다고 보면 된다. 이 iso는 어떤 PC에서 설치를 해도 windows OS와 jdk 1.8이 설치 된 상태로 구동 될 것 이다.


이제 commit 명령을 실행 해보자.

docker commit <복사할 컨테이너명> <새로 만들 이미지명> 을 입력하여 이미지를 생성하고 docker images 명령을 사용하여 이미지가 잘 생성되었는지 확인해보자.


# docker commit ubuntutest ubuntutest_img

sha256:b5d9797d22340d09f6d3f1ad3bd324e32709c8c79193419ce182dc4241b57685

# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE ubuntutest_img latest b5d9797d2234 21 seconds ago 216 MB docker.io/ubuntu 14.04 5dbc3f318ea5 3 weeks ago 188 MB



확인이 완료 되었으면 방금 복사된 따끈따끈한 ubuntutest_img를 통해 새로운 컨테이너를 생성해보도록 하자 docker run 명령을 통해 ubuntutest_new라는 새로운 컨테이너를 생성 하였다.


# docker run -i -t --name ubuntutest_new -p 80:80 ubuntutest_img



아까 ubuntutest에서 Apache2까지만 설치하고 중단 된 상태였다.

apache2 -v 명령어로 아파치가 설치되어있는지 확인해본다.


root@99a9f9e493ba:/# apache2 -v Server version: Apache/2.4.7 (Ubuntu) Server built: Nov 28 2018 00:08:50



설치가 잘 되어있다. 이제 apache2 서비스를 올려보자


root@99a9f9e493ba:/# service apache2 start root@99a9f9e493ba:/# service apache2 status * apache2 is running



apache2 서비스가 올라갔으면 이제 Host OS의 80포트를 Guest OS의 80포트로 포트포워딩 해주는 작업이 필요하다.

Virtual Box에서 'Settings' -> 'Network' -> 'Port Forwarding' 을 차례로 눌러준다.





Apache2 접근을 위해 80번 포트를 Port Forwarding 처리 해준다.




자 이제 현재의 상황을 그림으로 나타내면 다음과 같다.



우리는 지난 Docker : 설치 편에서 Host OS(192.168.64.1)와 Guest OS(10.0.2.15)의 80번 포트를 포트포워딩 해두었다. Guest OS와 도커 컨테이너의 80번 포트를 포트포워딩 하는 작업은 docker run을 통해 이루어 졌으므로 이제 HostOS에서 VM을 통하여 도커 컨테이너에 설치 된 Apache 80번 포트에 접근이 가능해졌다.

브라우저에서 192.168.64.1:80번 포트로 접근하면 도커 컨테이너에 설치된 Apache를 호출하고 기본페이지 화면을 마주할 수 있게 되었다. (아래 이미지가 뜬다면 Apache 정상 설치 및 정상 접근이 된 것이다.)






Docker 컨테이너 삭제



아쉽지만 정들었던 컨테이너와 작별할 시간이다.

인생은 돌고 도는 것. 언젠가 다른 컨테이너로 태어나 여러분과 다시 만나게 될 것이다.


docker rm 명령을 통하여 컨테이너를 삭제 해보자.

컨테이너를 삭제하기 위해서는 먼저 컨테이너를 종료 해야한다 exit 명령으로 빠져나가도록 한다.

그리고 docker ps -a 명령을 입력하여 삭제 할 목록을 확인 해보자.


root@99a9f9e493ba:/# exit # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 193f30bb8c38 ubuntutest_img "/bin/bash" 55 minutes ago Exited (0) 4 seconds ago ubuntutest_new d9f0845cc1b5 docker.io/ubuntu:14.04 "/bin/bash" About an hour ago Exited (0) About an hour ago ubuntu_apache b0c51e1ead4b docker.io/ubuntu:14.04 "/bin/bash" About an hour ago Exited (0) About an hour ago ubuntutest



docker rm <컨테이너명> 순으로 입력하여 하나씩 지워주도록 한다.

컨테이너가 잘 지워진것이 확인 되었다.


[root@localhost testuser]# docker rm ubuntutest_new ubuntutest_new [root@localhost testuser]# docker rm ubuntu_apache ubuntu_apache [root@localhost testuser]# docker rm ubuntutest ubuntutest [root@localhost testuser]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost testuser]#



오늘 설명한 Docker : 컨테이너 편 에서는 도커 이미지 내려받기, 컨테이너 생성, 어플리케이션 설치, 포트포워딩, 컨테이너 삭제까지의 간단한 개요 설명과 실습이 진행 되었다. 도커의 기초 개념과 포트포워딩에 대한 설명이 더 필요한 독자분들께는 Docker : 기초 편Docker : 설치 편을 다시 한번 보는것을 추천 드린다.




Docker : 컨테이너 편

끝.


'Docker' 카테고리의 다른 글

Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : Dockerfile 편  (0) 2019.03.07
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Docker : 기초 편  (2) 2019.01.16
Posted by DevStream

댓글을 달아 주세요

  1. 우왕 2019.03.11 13:22  댓글주소  수정/삭제  댓글쓰기

    쉽게 쏙쏙

Docker : 설치 편

Docker 2019. 1. 31. 16:45

[Docker : 기초 편]

[Docker : 설치 편]

[Docker : 컨테이너 편]



Docker 설치 준비



도커는 기본적으로 Linux OS에서 구동되며 타 OS(Windows, Mac 등)에서는 도커 실행에 필요한 Docker Tool Box 또는 Docker for OS(Windows, Mac) 을 설치하거나 VMWare와 VirtualBox 같은 가상환경에서 Linux OS 설치 하여 도커를 구동 할 수 있다. 이번 Docker : 설치 편에서는 VirtualBox에서 Linux OS를 설치 해보고 Port Forwarding을 통해 HostOS에서 GuestOS로의 SSH접근 및 도커 설치 라고쓰고 리눅스설치 편이라 읽는다. 를 진행 해보도록 하겠다.


먼저 가상환경을 만들기 위한 VirtualBox를 다운로드 한다. (https://www.virtualbox.org/) 다운로드 후 설치를 진행하며 설치가 되는 동안 Linux 설치용 이미지도 함께 받도록 한다. 필자는 CentOS 7을 사용하였다. (https://www.centos.org/download/)

VirtualBox의 설치 과정은 비교적 간단하여 생략하며, 설치 후 실행 시 VT-x is not available 이라는 메세지가 뜰 경우 인텔 가상화기술(AMD의 경우 보안 가상머신 SVM)을 바이오스에서 활성화 시켜주어야 한다.





VirtualBox를 통한 CentOS 7 설치



설치 순서는 선 설명 후 이미지 순으로 VirtualBox에서의 CentOS 7 설치를 진행하겠다.

먼저 VirtualBox 설치가 끝났다면 실행 후 New 아이콘을 눌러 가상OS명과 간단한 스펙을 지정 해준다. CentOS를 입력하는 순간 빨간모자 아이콘의 Red Hat(Pizza Hut) 리눅스가 기본으로 잡히게 되는데 CentOS의 모태가 RHEL이라 그런지 Red Hat 리눅스로 자동 할당 된다. 목록 중 Other Linux를 설정해도 설치에는 무리가 없으니 적당히 선택하도록 한다. 메모리는 기본값이 1GB 였으나 필자는 2GB를 할당 해주었다. 메모리 설정이 끝나면 Create a virtual hard disk now 를 선택 후 Create버튼을 눌러 다음으로 이동한다.





CentOS 7 에 할당 할 가상 하드디스크의 용량을 설정 해준다. 기본값은 8GB이나 아무리 테스트용 OS라도 용량이 적은편이므로 넉넉하게 40GB정도 할당 해주도록 하자 Hard disk file type은 VDI, Storage on physical hard disk는 Dynamically allocated를 설정 해준다. 이 옵션은 40GB만큼을 논리적으로 할당하고 사용하는만큼 용량이 늘어나게 하겠다는 옵션이다.





생성이 완료되면 마우스 우 클릭 후 Settings 메뉴로 진입한다.





Storage 탭 클릭 후 Attributes란의 디스크 모양의 아이콘을 클릭하여 다운로드 받은 CentOS 7 iso 이미지를 부팅디스크로 설정한다.





부팅이 정상적으로 이루어지면 아래와 같은 설치 메뉴가 나타난다.

Install CentOS 7을 선택하고 엔터를 눌러 다음으로 이동한다.





한글을 사용 할 필요가 없다면 기본값으로 두고 다음 화면으로 넘어가도록 한다.





우선 Timezone부터 설정 해주도록 하자





테스트 할 때 파일이나 디렉토리의 생성 시간이 뉴욕 기준으로 되어있다면 충분히 헷갈릴 수 있으므로 서울 기준으로 변경 해주었다.





다음은 SOFTWARE SELECTION 메뉴로 이동한다.





SOFTWARE SELECTION은 어떤 기본환경으로 설치 할 것 인지 확인하는 메뉴인데 필자는 딱히 GUI가 필요하지 않고 간단한 테스트 용도로만 사용할 것이므로 최소설치를 선택 하였다.





다음은 파티션 설정과 디스크 할당 메뉴로 넘어간다.





파티셔닝을 위해서 Local Standard Disks에서 아까 VirtualBox에서 할당한 40GB짜리 하드디스크 아이콘을 클릭 한다. 체크 모양이 표기되면서 아래의 Other Storage Options가 활성화 되며 파티션 설정을 위해 I will configure partitioning을 선택 후 Done 버튼을 누른다.





이제 파티션을 설정 하도록 하자 Standard Partition을 선택 후 아래의 '+' 버튼을 눌러준다.





Mount Point에 swap을 입력 또는 선택 후 2GB를 할당 해준다. 보통 메모리가 2GB라면 2배인 4GB를 설정 해주지만 메모리가 넘칠만큼 과도한 테스트를 진행하는것이 아니므로 2GB만 주도록 하자.





다시 '+' 버튼을 눌러서 마운트 지점을 '/' 로 입력 후 용량은 비워둔채로 Add mount point 를 눌러준다.

용량입력란을 공백으로 두면 나머지 모든 용량을 할당하겠다는 의미이다.





파티션과 용량 할당이 완료되면 Done을 눌러 준다.





Accept Changes를 눌러 설정을 완료한다.





네트워크 연결을 위해 NETWORK & HOST NAME 메뉴로 이동한다.





우측의 버튼을 눌러 네트워크를 황성화 시키고 Done을 눌러 적용한다.





설정이 완료 되었다면 설치를 시작한다.





설치가 진행되는 동안 ROOT PASSWORD와 USER를 생성 할 수 있다.





ROOT 계정이므로 패스워드는 잊어버리지 않도록 대략 적절하게 설정해주자





ROOT 패스워드 설정이 완료 되었으면 유저를 생성 해준다.





유저 아이디와 패스워드 역시 대략 적절하다는 느낌이 들도록 설정 해준다.





설치가 완료되면 재부팅한다.





설치가 완료 된 모습이다.

방금 전 생성한 유저 아이디와 패스워드를 입력하여 로그인한다.




여기까지 VirtualBox에서 CentOS 7 설치의 과정이 모두 끝났다.

필자는 Windows OS를 이용중이고 작업을 하다보면 콘솔에 복사/붙여넣기를 해야 할 때가 많다. 

때문에 SSH를 통한 원격 접속으로 콘솔 명령을 수행하려 한다. 





Port Forwarding 설정



이제 SSH 를 통해 VirtualBox에서 구동되는 CentOS에 접속해보자.

먼저 GuestOS의 ip주소를 확인한다. ip addr 명령을 입력 해보자 10.0.2.15로 확인이 되었다.





HostOS의 ip주소는 192.168.64.1이다.





HostOS와 GuestOS의 ip 주소를 확인 했으면 SSH를 접속하기 위한 포트포워딩을 설정 해준다.





HostOS의 IP 와 GuestOS의 IP 그리고 포워딩 해줄 Port 번호를 입력 후 OK를 눌러 저장한다.






포트포워딩에 대한 개요를 설명하자면 일단 Host OS와 Guest OS간 포트를 공유하기 위한 연결된 선이라고 보면 된다.
Host OS와 Guest OS의 22번 포트가 연결되면서 SSH접속이 가능해지게 되는 원리이다.

(이미지에서는 VirtualBox 부분을 제외하였다.)

꼭 동일 포트만 설정 해야되는것은 아니다. 8080:22와 같은 형태로도 설정이 가능하며 이렇게 설정 했을 경우 Host OS에서 SSH접속 시 포트는 8080이 된다. 8080포트를 호출하면 Guest OS의 22번 포트로 연결 되면서 SSH접속이 가능해질 것이다.






포트포워딩 설정이 완료 되었으면 SSH를 통해 VirtualBox의 CentOS에 연결해본다.

(필자는 mRemoteNG를 사용하여 SSH접속 테스트를 진행 했다.)

접속이 잘 되었다. 이제 도커 설치해보도록 하겠다.






Docker 설치



여기까지 오느라 정말 수고 많았다. 이제 대망의 도커 설치파트이다.

먼저 패키지 목록 업데이트를 위해 yum update 명령을 실행하도록 한다.

목록 업데이트가 완료되면 yum install -y docker 명령으로 꿈에 그리던 도커를 설치하도록 하자


# yum update # yum install -y docker

Installed: docker.x86_64 2:1.13.1-88.git07f3374.el7.centos Dependency Installed: PyYAML.x86_64 0:3.10-11.el7 atomic-registries.x86_64 1:1.22.1-26.gitb507039.el7.centos audit-libs-python.x86_64 0:2.8.4-4.el7 checkpolicy.x86_64 0:2.5-8.el7 container-selinux.noarch 2:2.74-1.el7 container-storage-setup.noarch 0:0.11.0-2.git5eaf76c.el7

...

Complete!


설치가 잘 되었다.









Docker : 설치 편

끝.


'Docker' 카테고리의 다른 글

Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : Dockerfile 편  (0) 2019.03.07
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Docker : 기초 편  (2) 2019.01.16
Posted by DevStream

댓글을 달아 주세요

Docker : 기초 편

Docker 2019. 1. 16. 19:42

[Docker : 기초 편]

[Docker : 설치 편]

[Docker : 컨테이너 편]



Docker란?


Docker(이하 도커)는 운영체제 급(Operation System Level)의 가상화를 수행하는 컴퓨터 프로그램이다.

여기서 운영체제 급 가상화 컨테이너 화(Containerization) 라고도 한다.



도커는 어플리케이션을 가상머신기반 게스트OS를 통해 구동되는 방식에서 도커엔진 기반의 컨테이너에서 구동 되도록

설계함으로써 게스트OS 없이 어플리케이션을 구동 할 수 있게 되었다. 

도커를 설명하기에 앞서 먼저 가상화 개념에 대한 설명부터 하고자 한다.





가상화(Virtualization)란?



가상화는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 단어로, 

쉽게 설명하면 컴퓨터 속에 가상의 컴퓨터를 만들어내는 기술이다.





가상화는 왜 사용하는걸까?


세 대의 서버가 있다고 가정 해보자 각각의 서버는 메일, 인증, 그룹웨어 서비스가 가동되고 있다.

자원은 각 서버별로 25%, 30%, 20%씩 사용하고 있고 서버별 자원 활용률이 90%가 최대치라고 가정 한다면 현재 65%, 60%, 70%의 자원이 놀고 있는 상태가 된다.


일단 구조는 아래와 같다. 각 서버에 OS가 설치 되어 있고 그 위에서 서비스가 가동중이다.


그렇다면 어떻게 자원낭비를 없앨 수 있을까?




"그냥 3개의 서비스를 하나의 OS로 몰아주면 될 것 같은데?"



좋은 생각이다. 그런데 여기서 미처 생각하지 못한 부분이 있다. 다음 예를 보자


메일 서비스에 신규 기능이 추가 되었다. 이 기능을 사용하려면 OS버전의 업데이트가 필요한 상황이다.

인증 서비스와 그룹웨어는 OS업데이트가 불필요한 상황이고 오히려 업데이트를 하면 OS버전 호환 문제로 서비스에 지장을 주게 된다.

결국 OS업데이트로 인하여 3개 서비스의 호환성을 모두 확인하고 서비스를 수정하는 작업이 발생하게 되었다.


다른 예로 A부서에서만 쓰던 서버를 B부서에서도 쓰겠다고 한다. 마침 A부서와 B부서는 별도의 인증 서비스를 운영하고 있었다. 

하필이면 서비스명이 같고 설정도 많이 겹친다. 어떤 일이 벌어질까?


"포트 겹치는건 기본이고 바꿔야 할 설정들이 너무 많습니다."



최악의 경우에는 서비스의 설정들을 모두 바꿔야 하는 일이 생겨버린다.

혹은 Host OS가 Windows Server 였는데 리눅스 서버가 필요한 상황이라면? 서버 한대로는 도저히 답이 안나온다.

그럼 각 OS와 서비스가 독립적일수는 없을까?


이러한 경우 가상화 기술을 사용하여 해결 할 수 있다.

한 대의 서버에서 하이퍼바이저를 통한 물리자원의 논리적 분할로 여러개의 Virtual Machine에서 각각의 Guest OS를 생성 할 수 있다.

생성된 Guest OS는 독립적으로 운용이 가능하다. 3개의 각 Virtual Machine에서 Guest OS를 3개 생성한다면 서버 한 대로 세 대의 서버를 가진것이 된다. 3천원어치같은 천원어치 떢볶이를 떠올리면 된다.



이제 서비스의 간섭과 충돌에서 자유로워졌다.

그러나 다른 문제가 또 있으니...




왜 Docker를 사용해야 하는가?


앞서 설명한 Virtual Machine 기반에서 Application을 구동 하려면 Guest OS가 필요하다.

기본적으로 OS에만 소모되는 자원이 상당하고 가상 OS를 통한 Application의 실행은 무겁고 느려서 실제 운영환경에 효율이 상당히 떨어졌다.


그 후 도커가 출시 되었다.

도커는 컨테이너를 기반으로한 가상화 플랫폼으로 컨테이너는 프로세스를 격리 시키는 기술이다.


Virtual Machine 기반의 Guest OS에서 Apache와 Mysql이 실행중이라고 할 때

도커 엔진이라면 하나의 컨테이너에 Apache 프로세스가, 또 다른 컨테이너에는 Mysql 프로세스가 독립적으로 실행 된다.

즉 Guest OS의 의존 없이 격리된 하나의 프로세스를 만들 수 있게 되었는데, 이는 성능향상뿐만 아니라 엄청난 비용절감 효과를 가져올 수 있다.




Virtual Machine 대비 도커 컨테이너의 장점 요약


1. 가볍다

Virtual Machine 기반에서 Application을 구동하기 위해서는 반드시 Guest OS가 존재 해야하므로 그만큼 이미지의 사이즈도 커진다. 반면 도커 컨테이너는 Host OS에서 도커엔진을통해 구동되고 필요한 만큼의 자원만 사용하므로 Virtual Machine 대비 매우 가볍다.



2. 빠르다

Virtual Machine 기반에서는 무조건 Guest OS를 경유하여 Application을 실행 해야만 했다. 때문에 처음부터 하나의 Application을 실행하기 위해서는 Guest OS부터 구동해야 하는데 부팅시간은 최소 분 단위이다. 도커 컨테이너는 Guest OS를 경유하지 않으므로 몇 초만에 실행된다.



3. 배포가 용이하다

Virtual Machine에서 이미지 배포를 위해서는 Guest OS가 필요하므로 이를 포함하여 이미지로 만든 후 배포 해야한다. OS 기본설치만 해도 기가단위의 용량이 넘어가므로 이미지 배포는 용량이 적은 도커 컨테이너와 비교하면 매우 비효율적이다. 도커 컨테이너는 필요한 Application의 용량만큼을 이미지로 만들어 배포하므로 효율적이다.





Docker : 기초 편

끝.

'Docker' 카테고리의 다른 글

Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : Dockerfile 편  (0) 2019.03.07
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Docker : 기초 편  (2) 2019.01.16
Posted by DevStream

댓글을 달아 주세요

  1. MJ 2020.06.16 12:08  댓글주소  수정/삭제  댓글쓰기

    VM기반의 Guest OS에서 Application을 실행시키는 게 그 실행하고자 하는 어플리케이션이 Guest OS에 의존적이기 때문아닌가요? 만약 Windows OS만 지원하는 Application인 경우에는 Docker 엔진에서는 가동할 수 있나요? 만약 그렇다면 어떻게 가동할 수 있나요??

    • DevStream 2020.06.18 15:12 신고  댓글주소  수정/삭제

      "VM기반의 Guest OS에서 Application을 실행시키는 게 그 실행하고자 하는 어플리케이션이 Guest OS에 의존적이기 때문아닌가요?"
      -> 맞습니다. 실행하고자 하는 어플리케이션은 OS에 의존적입니다. 예를들어 윈도우즈용 exe파일을 리눅스에서 그냥 실행하면 실행이 되지 않습니다. 해당 어플리케이션이 Windows OS에 종속적이기 때문입니다. (물론 리눅스에서 exe프로그램을 아예 실행할 수 없는건 아닙니다만 wine이라는 별도의 패키지를 설치해야 하는 등 우회에 가까우므로 이것은 논외로 하겠습니다.)

      "만약 Windows OS만 지원하는 Application인 경우에는 Docker 엔진에서는 가동할 수 있나요? 만약 그렇다면 어떻게 가동할 수 있나요??"
      -> 가능합니다. Windows OS에서 도커엔진을 통해 Windows 컨테이너를 생성할 수 있습니다. Windows OS전용 어플리케이션이므로 Windows OS에 설치된 도커엔진을 기반으로 구동됩니다.

      아래 링크는 1809버전의 도커엔진으로 간단한 웹 서버를 구현하는 예제입니다.
      https://stefanscherer.github.io/how-to-run-lightweight-windows-containers-on-windows-10/

      덧붙여서..
      각 어플리케이션들은 각각의 OS에 종속적입니다. 예를들어 nginx 웹서버 어플리케이션은 윈도우즈용, 리눅스용 두 가지 버전을 지원합니다. 윈도우즈에서 리눅스용 nginx는 일반적으로는 실행할 수 없습니다. 이것을 가능하게 하려면 네이티브 리눅스환경을 구축하거나 윈도우즈OS에서 VM을 통한 리눅스OS 환경을 만들거나 윈도우10에서 지원하는 WSL을 이용해야 합니다.