Docker

실제 선박의 컨테이너라함은 여러가지 물자들은 하나의 컨테이너에 싦어
부피,인력,물자 이동 등 엄청난 장점을 가져왔다.

소프트웨어 측면에서도 배포하는 과정을 편하게 사용하고 여러 장점을 가지기 위해
애플리케이션을 컨테이너화할 수 있는 도커가 등장했다.
즉, 컨테이너 방식의 애플리케이션이라는 뜻은 실행환경에
구애받지 않고 실행시킬 수 있다는 뜻이다.

가장 많이 듣는 용어를 적어본다.

  • 컨테이너
    애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고
    도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자이다.
    즉, 도커에 의해 관리/제공되는 애플리케이션 단위이다.

  • 이미지
    모든 컨테이너는 이미지로 부터 생성된다.
    이미지를 이용해 여러개의 컨테이너를 생성할 수 있고, 애플리케이션
    수평확장이 가능하다. 즉, 도커 컨테이너를 생성하는데 사용되는 템플릿이다.

  • 레지스트리
    이미지는 레지스트리에 저장된다. 대포적으로
    Docker Hub, Amazon ECR등이 있다.
    즉, 도커 이미지를 저장하고 배포/공유하는데 사용한다.


Docker 컨테이너 방식의 장점

1). 의존성 충돌 문제를 해결
컨테이너 기술을 바탕으로 한 컴퓨터 안에 여러대의 컨테이너가 있다.
애플리케이션 실행 환경이 격리되어있다는 뜻이므로
각자 고유의 의존성을 포함하고 있다.

그렇다면, 어떤 자원을 독립적으로 가지고 있는지 알아보자

  1. 프로세스
    -. 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 가능
    -. 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향 X
  2. 네트워크
    -. 기본으로 컨테이너 하나에 하나의 IP 주소가 할당
  3. 파일 시스템
    -. 컨테이너 안에서 사용되는 파일 시스템은 구획화 되어있다.
    그래서 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한 할 수 있다.


2). 개발과 배포 환경을 일치 시켜준다.
Docker를 사용하면 OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있다.
그리고 개발 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에
개발을 진행할 수 있다.

3). 수평 확장을 쉽게 해준다, 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다.
컨테이너 기술의 가장 큰 장점은 실행 환경의 일치이다.
엄청난 트래픽을 요구하는 애플리케이션들은 단하나의 서버가 아니라
트래픽을 분산하기 위해 프록시 서버를 운영한다고 한다.

프록시 서버는 여러 대의 동일한 서버 중 한군데를 이용할 수 있도록 돕는데
동일한 서비스가 여러 컴퓨터에서 작동하기위해서 편리하게 사용하는 기술이 컨테이너 기술이다.


Docker 설치

현재 나는 MacOS를 사용하고 있기때문에
Docker Mac install를 접속해 도커를 설치할 수 있다.

image

도커 설치를 완료하면 위와 같은 애플리케이션 GUI 확인이 가능하다.

docker --version

실제로 CLI로 버젼을 입력할 경우 정상적으로 설치되었으면
현재 설치된 버전이 나올 것이다.


Docker 사용전 명령어 보기

Docker GUI를 이용하지 않고
CLI를 통한 연습을 진행해보려한다.

그전에 선행되어야하는 것이 명령어를 먼저 알아야한다.

1). 이미지 관련 명령어

✅ 설치된 이미지 조회하는 명령어이다.

docker image ls


✅ 이미지를 설치하는 방법이다.

docker image pull 이미지이름:tag


✅ 설치되어 있는 이미지를 삭제하는 방법이다.

docker image rm 이미지이름

만약 이미지를 컨테이너에 사용할 경우 삭제가 불가능하다.
컨테이너를 종료시키고 삭제 후 에 이미지를 삭제해야한다.


2). 컨테이너 관련 명령어

✅ 설치되어 있는 이미지를 삭제하는 방법이다.

docker container run --name 컨테이너이름 -p 8080:80 이미지이름

컨테이너 이름은 우리가 정하면 된다.

이미지 이름은 설치한 이미지의 이름을 적어주면되는데
만약 해당 이미지으 tag가 있다면 이미지이름:tag 를 적어줘야한다.
여기서 tag라 함은 latest, 2.0이라든가의 버젼을 의미한다.

또한 포트번호는 8080:80이라고 적어두었는데
첫번쨰 포트는 내부포트이고 두번쨰 포트는 외부포트이다.
외부에서 통신을하기 위한 통신 포트를 요청하면
컨테이너의 내부포트로 forwarding 하겠다는 의미이다.
즉, 8080포트로 요청할 경우 80으로 포트포워딩 하겠다는 뜻이다.
Port Forwarding 참고 - ooeunz님 블로그


✅ 컨테이너 리스트 출력

docker container ps -a


✅ 실행중인 컨테이너 리스트 출력

docker container ls

컨테이너 리스트 출려과는 다르다. 현재 start되어있는 컨테이너만 출력되어진다.


✅ 컨테이너 실행

docker container start 컨테이너이름

컨테이너를 백그라운드 상태로 실행시킬 수 있는 명령어이다.


✅ 컨테이너 중지

docker container stop 컨테이너이름

살행 중인 컨테이너를 종료하는 명령어이다.


✅ 컨테이너 삭제

docker container rm 컨테이너이름

컨테이너를 중지시킨다음, 해당 컨테이너가 필요없을 경우
해당 명령얼 컨테이너를 삭제할 수 있다.


✅ 컨테이너 내부 접근

docker exec -it 컨테이너이름 bash

선택한 컨테이너를 bash CLI로 접근할 수 있다.


✅ 현재 폴더의 파일을 컨테이너의 경로에 복사하기

docker container cp ./ 컨테이너이름:/경로


✅ 구동중인 컨테이너를 지정해 이미지로 만들기

docker container commit 컨테이너이름 이미지이름:tag


✅ 이미지 빌드하는 방법

docker build --tag 이미지이름:tag . 

Dockerfile을 만들고, Dockerfile 대로 이미지를 build하는 방법이다.

FROM httpd:2.4 
COPY ./ /usr/local/apache2/htdocs/

와 같은 형식으로 Dockerfile을 만든다.
위에 내용을 해석하자면 베이스 이미지르 httpd로 사용
현재경로에(./) 있는 파일들을 특정경로(/usr/local/apache2/htdocs/)로 이동한다.

이렇게 빌드된 이미지를 이제 컨테이너로 사용할 수 있다.


Docker 사용해보기

순서는 레지스트리에서 이미지를 받고 컨테이너를 만들면된다.
그리고 해당 컨테이너 주소로 접속해 우리가 하려고하는
애플리케이션의 테스트가 가능하다.

Hello docker

우선 만들어 놓은 프로젝트가 없으니
간단한 이미지 부터 사용해보려한다.

dockerhub에서 여러가지 이미지를 받을 수 있다.

image

그 중 귀여운 고래화면을 띄워주는 docker/whalesay를 검색해보자
검색해보면 오른쪽에 커맨드로 도커를 가져올 수 있는 명령어가 있고
사용 방법에 대한 내용이 쭉 나와 있다.

docker pull docker/whalesay

를 입력해주면 해당 이미지를 다운 받는다

그리고 컨테이너를 시작시켜주는 명령어를 사용하면 된다.
해당 이미지에선 사용하는 방법을 설명해준다.

docker run docker/whalesay cowsay boo

를 입력하게 되면

 _____
< boo >
 -----
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

이러한 귀여운 고래 모습을 볼 수 있다.

이제 간단한 이미지를 다운받아 사용까지 해보았다.
삭제를 하려면 컨테이너에서 먼저 삭제한다음
이미지를 삭제해주면 된다.


httpd 사용해보기

이제 본격적으로 사용해보자 homebrew httpd를 사용하듯
Apache HTTP Server인 httpd 이미지를 이용해
웹서버를 띄워 볼 수 도 있다.

docker container run --name test -p 818:80 httpd

test라는 이름의 컨테이너로 818포트를 80포트로 포워딩하게 해두었다.
httpd의 기본포트는 80번으로 설정되어있다.

해당 컨테이너를 실행한 후에 http://localhost:818로 접속하면

image

기존에 Apache HTTP Server를 띄우는 것처럼
기본 html인 It works!가 확인이 가능하다.


httpd 서버에 프로그램 올리기

이제 여기서 우리가 해당 컨테이너에 프로그램을 넣을 수 있다.
예를 들어 팩맨 게임을 해당 웹서버에 올린다고 가정하자.
(해당 게임 프로그램은 pacman github에서 클론 받을 수 있다.)

방법은 2가지 정도가 있다.
첫번째 방법은 현재 컨테이너에다가 파일을 복사하는 방법과
두번째 방법은 Dockerfile을 이용해 이미지를 다시만든다음에 컨테이너로 만들면된다.

첫번째 방법 부터해보자
현재 만들어둔 test 컨테이너 안에 httpd 경로에 파일을 복사하면된다.
실제로 컨테이너를 접속해보면 /usr/local/apache2/htdocs/경로에
index.html파일이 있는 것을 볼 수 있다. 해당 파일은 It works! 파일이다.
해당 경로에 내가 올리려는 팩맨 게임index.html과 여러 파일들을 넣어주면 된다.

docker container cp ./ test:/usr/local/apache2/htdocs/

이제 내가가지고 있는 프로그램 파일 경로로 접속해
해당 명령어를 입력해주면 해당 경로에 있는 파일들이
전부 test 컨테이너의 해당 경로로 복사되어진다.

그리고 다시 컨테이너를 시작해준다면

docker container start test

백그라운드로 실행 될 것이다.

image

팩맨 게임이 실제로 동작하는 것을 볼 수 있다.


두번째 방법으로는 팩맨 게임폴더에 Dockerfile이라는
이름의 파일을 만든다. 그리고 해당 파일 안에는

FROM httpd:2.4
COPY ./ /usr/local/apache2/htdocs/

와 같은 내용을 넣어준다. (설명은 명령어에서 설명했으므로 생략)

그리고 build 명령어를 이용해서 이미지를 빌드할 수 있다.
명령어를 실행할때는 Dockerfile 경로에서 입력해야한다.

docker build --tag pacman:2.0 .

build 명령어를 실행하면, 이미지 파일이 생성되고
해당 이미지 파일로 이제 컨테이너를 실행시키면 된다.

docker run --name pacmangametest -p 818:80 pacman:2.0


이렇게 CLI로 명령어로 docker를 사용하는 방법을
간단하게 알아보았다. 실제로 우리가 만든 이미지와 컨테이너들을
처음에 설치했던 GUI에서 확인이 가능하다.

image



오늘은 이렇게 짧지만 docker를 공부했다.
계속 연습하다보니까 어느정도 이해가 되었다.
이렇게 이미지로 만들어 팀원들과 배포환경을 동일하게
사용할 수 있을 것 같다.

이제 곧 프로젝트인데 프로젝트할 때 적용해보도록 해봐야겠다!!

오늘 공부는 여기서 끝 !!


오늘의 커피량: ☕️ ☕️
오늘의 점심: 삼첩분식