나는매일가운데

Docker (1) - Docker 사용하기 본문

Docker & Kubernetes/Docker

Docker (1) - Docker 사용하기

전로찡 2023. 4. 28. 17:37
반응형

0. 시작하기전...

- 도커는 도구일 뿐이다 최대한 사용법에 익숙해지자

 

1.  도커 리터러시

- 리터러시 : 어떤 분야에 대한 지식과 이해를 가지고 그것을 활용할 수 있는 능력 

 

(1) 컨테이너

- 배경 :

과거 항해 시 화물마다 다른 무게, 선적 방법으로 인해 선적 과정에서 발생하는 비용, 기간이 길어졌다. 

=> 컨테이너를 통해 이를 규격화시킴 => 선적 과정 단축으로 인해 비용, 기간 단축환적이 쉬워졌다.

 

과거 개발 환경을 통일 시키기 위해 다양한 app, 환경변수 설정하기 까지에 기간이 길게 걸렸다. 또한 오픈소스의 치명적인 단점인 버전 이를 해결해야 했었다.  

 

이 처럼 컨테이너의 개념은 개발 환경, 배포를 규격화 시킴으로 인해 개발 비용, 배포, 기간이 단축되었다.

 

- 개념 : 

  • 도커의 아키텍쳐

- VM : 가상 컴퓨터 => HostOS를 사용하여 동작 => 다른 OS를 가상 머신에 설치하여 프로세스가 작동한다.

- 하이퍼 바이저 : 별도의 가상 컴퓨터를 만드는 것을 지원해주는 것.

 

- Docker :

HostOS와 Container를 Docker Engine을 통해 분리하여 외부 환경으로 부터 격리된 공간에서 프로세스가 동작한다.

 

 

  • 가상 서버 Vs 컨테이너

- Docker : Guest OS를 사용하지 않는다 -> 가볍다

- VM : Guest OS를 사용 -> 무겁다.

- 이미지 : Java에서 class

- 컨테이너 : Java에서 Instance

- 유니온 파일 시스템 : 도커에 적층식으로 이미지 생성이 가능 => 여러개의 파일 시스템을 계층적으로 쌓아 컨테이너 이미지의 크기를 줄이는 파일 시스템

- Open Container Initiative : 컨테이너 표준 사양 책정 단체

 

 

(2) 도커

  • 도커의 구성

- 컨테이너를 이미지화 하여 여러 물리 서버에서 사용이 가능하다. 

 

  • 도커 이미지

- 이미지 : 컨테이너를 생성하기위한 틀(?) => 실행되는 것이 아닌 데이터의 형태 => 컨테이너로 전환되어야 실행이 가능하다.

 => 컨테이너에 Modifier하고 이미지로 재생성해서 배포 할 수 있다.

 

- Repository

 

  • 도커 허브

- 앱스토어와 유사 -> 이미지만 가져와서 run시킬 수 있다.

- public Repository

 

  • 도커의 특징

- 독립된 환경 : 여러 개의 프로그램을 띄울 수 있고, 똑같은 app도 여러개 만들어 띄울 수 있다.

 

- 이미지를 만들 수 있다. : 다른 환경에서 동일한 개발 환경으로 사용이 가능하다. 따라서 환경이동이 편리하고 어플리케이션을 배포하기 쉽다.

 

- 커널이 없다 => 컨테이너는 이미지에 OS를 가지지 않으므로 가볍고 배포판을 쉽게 변경할 수 있다. 

 

- 도커 레지스트리가 있다. => 도커 허브라는 레지스트리가 있기 때문에 이미지를 직접 만들지 않아도 다양한 이미지를 내려받을 수 있다. 하나의 컨테이너에 하나의 SW만 관리하면 교체가 편리하다.

 

  • 도커 사용

- 동일한 개발환경 제공

- 새로운 버전의 테스트 환경 구축 가능 => 여러 대 만든다음 각각 다른 테스트를 시도할 수 있다.

- 동일 서버가 여러 대 필요한 경우


2. 도커 명령어들

  • 도커 데몬 확인 방법

sudo systemctl status docker

  • 도커 기본 명령방법

- ex) docker container run

 

 

(1) 컨테이너 조작 관련 커맨드

- container를 생략해도 명령어 인식 가능하다.

 

 

(2) 이미지 조작 관련 커맨드

- 이미지를 내려 받거나 검색하는 등 이미지와 관련된 기능을 실행한다.


3. 도커 컨테이너 다루기

 

 

(1) 이미지 -> 컨테이너

- 명령어 입력 시 클라이언트에서 명령어를 수행 => 이미지가 없으면 도커 허브에서 puling 후 이미지를 컨테이너화 한다.

 

(2) 컨테이너 생애주기 (Container Life Cycle)

- docker container run => docker pull (이미지 내려받기) + docker create(컨테이너 생성) + docker start (컨테이너 실행)

즉, run을 통해 컨테이너를 생성하고 실행 할 수 있다.

 

- 컨테이너가 실행중이면 이미지를 제거 할 수 없다.

 

 

(3) 컨테이너 통신

- 컨테이너 간 통신을 할 수 있다. (포트포워딩을 통해)

 

 

- 포트 포워딩 :

네트워크에서 하나의 호스트로 들어오는 패킷을 다른 호스트로 전달하는 네트워크 전송 방식

컨테이너 뿐만 아니라 외부에서 들어오는 패킷또한 컨테이너의 포트와 맵핑시켜 통신을 가능하게 한다.

 

docker run --name ex001 -p 8080:80 -d httpd

docker run --name ex001 -p 8081:80 -d mysql

// 이 경우 호스트의 포트를 다르게 지정하였기 때문에 충돌이 나지 않지만, 호스트 포트를
동일하게 지정할 경우 충돌이 난다. 따라서 호스트 포트는 다르게 지정해 주어야 한다.

ex) 8080(호스트 포트 / 컨테이너 외부에서 접근하는 포트) : 80(컨테이너 포트) => 8080 포트로 접근하는 패킷을 컨테이너 포트인 80으로 포트 포워딩 => 외부에서 접근 가능. 

 

  • 통신 컨테이너 실습 -1
(1)
docker run --name apa000ex2 -d -p 8080:80 httpd


// 이미 생성한 컨테이너에 포트포워딩 하려면...
docker container update --publish 8080:80 mycontainer
//혹은 삭제하고 다시 만들기


// (2) 여러 아파치 서버 컨테이너 생성 후 확인
docker run --name ex003 -p 8080:80 -d httpd
docker run --name ex004 -p 8081:80 -d httpd
docker run --name ex005 -p 8082:80 -d httpd

 

(1) 포트 지정 후 해당 포트로 접근했을 때 도커에서 돌고있는 컨테이너가 작동하는 것을 확인할 수 있다.

 

 

(실습2) 여러개의 컨테이너 생성 후 작동 확인


 

// mysql 실행하기

docker container run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql

// -dit : 백그라운드에서 실행 및 키보드를 통해 컨테이너 내부의 파일 시스템을 조작한다.
// -e : 이 컨테이너를 만들때 접근하기 위한 환경을 지정해준다.


* docker container prune => 정지된 컨테이너 일괄 삭제

mysql 컨테이너 생성된것을 확인 할 수 있다.


(4) 여러개의 컨테이너 연동

- 각각의 컨테이너는 도커 네트워크로 연결하여 통신하고 데이터를 주고 받는다.

- Docker Compose를 이용하여 여러개의 컨테이너를 띄워 컨테이너 간 네트워크를 설정하여 관리할 수 있다.

- Docker Compose : 컨테이너를 정의하고 실행하는 도구로, 컨테이너 간의 연결을 정의한다. 컨테이너들의 이름, 이미지, 포트, 환경변수 볼륨 등을 정의한 파일

- Dockefile : 도커 이미지를 생성하기 위한 빌드 파일

 

  • 실습

 

//여러개의 컨테이너 연동하기 실습


// (1) 네트워크 생성
docker network create wordpress000net1

// (2) MySql 컨테이너 생성
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass 
-e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass 
mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 
--default-authentication-plugin=mysql_native_password

// (3) 워드프레스 컨테이너 생성
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 
-e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db 
-e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

// (4) 컨테이너 및 네트워크 확인
docker ps

// (5) 정리

여러개의 컨테이너 연동 결과


  • 실습 2 레드마인 설치하기
네트워크 설정
docker network create redmine000net2

Mysql 설정
docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmibne000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

레드마인 설치하기
docker run -dit --name redmine000ex14 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmibne000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine

레드마인 연동 결과

 

  • 실습 3 mySQL -> mariaDB 변경
네트워크 생성
docker network create redmine000net3

MariaDB 컨테이너 생성 및 실행
docker run --name mariadb000ex15 -dit --net=redmine000net3 -e MYSQL_ROOT_PASSWORD=mariarootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASWORD=rkunpass mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

레드마인 설치하기
docker run -dit --name redmine000ex16 --network redmine000net3 -p 8087:3000 -e REDMINE_DB_MYSQL=mariadb000ex15 -e REDMINE_DB_DATABASE=redmibne000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine

 

(5) 볼륨

docker container exec -it (컨테이너 이름) => 컨테이너 내부로 접속

컨테이너 내부는 리눅스 환경이다.

 

  •  도커 컨테이너 내부에 파일 넣기

컨테이너 내부에 작성한 index.html 삽입 결과...

 

 

  • 볼륨 

- 볼륨 : 스토리지의 한 영역을 분할한 것 (부피) ≒ 파티션(?)

   => 논리적인 저장소의 영역

 

  • 볼륨 마운트 / 바인드 마운트

- 볼륨 마운트 : 도커 엔진에 위치함 즉, 도커에서 관리

 

- 바인드 마운트 : 운영체제 위에 존재함 / 이미 생성한 파일 또는 폴더를 바인딩함 =>  네트워크 볼륨을 사용하는 것과 비슷

 

- 도커에서 볼륨 커맨드

반응형