Docker의 개념과 사용

haram·2022년 9월 26일
0

도커란?

리눅스 환경위에서 이미지 파일을 컨테이너화 시켜 프로세스를 운영체제에 종속받지 않도록 만들어 이식성을 증가시킨다.
(리눅스 환경위에서 도커를 동작시켜야 하지만 도커를 설치함과 동시에 도커가 윈도우 또는 맥에서 리눅스 가상운영체제를 구축하기 때문에 사용자는 리눅스 환경을 구축하기 위한 신경을쓸 필요가 없다)

WSL(windows subsystem from linux) – 윈도우 에서 리눅스를 사용하기 위한 시스템

도커 컨테이너

이미지(Image)를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다.

컨테이너의 사용이유는?

Software A와 B가 동일한 Library를 사용하지만 서로 다른 버전을 필요로 하는 경우라던지 두 software의 운영 체제가 다를 경우 등 다양한 경우에서 문제가 발생할 수 있기 때문에 이러한 문제점을 해결하기 위해 사용한다.

도커파일

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSLDomain-specific language언어를 이용하여 이미지 생성 과정을 적는다.

도커의 이미지

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라한다. 다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일을 의미한다. 예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle 이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port 정보 등을 모두 가지고 있다.

도커 이미지 계층

이미지는 컨테이너를 실행하기 위한 소스, 환경설정등 모든 정보를 담고 있기 때문에 수백MB가 넘어갈 수 있다. 하지만 소스코드가 수정될 때마다 매번 수백MB를 다운받게 된다면 효율성이 매우 떨어지기 때문에 이미지를 레이어(계층)으로 구성하여 필요한 레이어만 수정 할 수 있게한다.

도커 이미지를 만드는법

  • 도커파일을 작성에 build 명령어를 통해 이미지를 생성하는 방법

  • 현재 실행되는 컨테이너를 commit 명령어를 통해 캡처하여 이미지를 생성하는 방법

도커의 사용

도커 명령어 - [ ] 은 옵션이므로 생략가능

실행하기
docker run [OPTIONS] IMAGE[:TAG|@DIGEST][COMMAND] [ARG...]

컨테이너 목록 확인
docker ps [OPTIONS]

컨테이너 제거
docker rm [OPTIONS] CONTAINER [CONTAINER...]

이미지 목록 확인
docker images [OPTIONS]REPOSITORY[:TAG]]

이미지 다운로드 하기
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

이미지 삭제하기 – 컨테이너가 실행중인 이미지는 삭제되지 않음
docker rmi [OPTIONS] IMAGE [IMAGE...]

컨테이너 명령어 실행하기 – 실행중인 컨테이너에 들어가 컨테이너 관리
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

컨테이너 로그 보기
docker logs [OPTIONS] CONTAINER

도커의 사용예시

(톰캣 – 웹프로그램 – Mysql)구조의 업무를 구축하기

  1. 톰캣 이미지 다운 – docker pull tomcat (https://hub.docker.com)

  2. 새로운 컨테이너 생성하기
    1) 새로운 컨테이너 실행

  • docker run -d --name tomcat1 -p 8080:8080 tomcat
    (--name은컨테이너 이름 붙이기 -p로컬포트와 컨데이너 포드를 포워딩, 컨테이너도 자체 IP와 port를 가지고 있음)

포워딩이란? 로컬8080포드로 입력이 들어오면 컨테이너의 80번 포트로 연결시킴

2) 이미 생성된 컨데이너실행하기

  • 실행 – docker start tomcat1
  • 중지 – docker stop tomcat1

아래의 옵션추가가능

  • -d : 백그라운드로 실행, 터미널을 빠져나와도 여전히 컨테이너는 실행됨
  • -it : 컨테이너를 종료하지 않고 계속 터미널에 입력

오류 - 2번 과정을 수행하고 로컬의8080포트에 접속을 했음에도 톰캣으로 연결되지 않는 오류

원인 - 일반적으로 톰캣은 8080포트에서 대기하고 있는데 80포트로 접속을 하면 당연히 연결되지 않는다. 마찬가지로 컨테이너를 하나의 물리머신으로 보았을 때 80포트로 포워딩하였기 때문에 접속이 되지 않았음

  1. 톰캣이 실행할 war파일 넣기
    로컬 war 파일을 컨테이너로 복사, 주소를 반대로 하면 컨테이너에서 로컬로 이동
docker cp C:\Users\SampleWebApp.war tomcat1:/usr/local/tomcat/webapps/ROOT.war
  1. 컨테이너 터미널 접속방법
  • docker exec -it tomcat1 bash – 컨테이너에 접속하여 명령어를 입력
    (-it를 입력해야 컨테이너 터미널에 입력가능)
  • 터미널 종료시 exit

컨테이너에서 수정한 사항을 이미지로 저장하는법

docker commit tomcat1 tomcat2

  • 현재 컨테이너명, 새로만들기 원하는 이미지명 순으로 입력
  • 원본에서 복제된 새로운 이미지 tomcat2가 생겨있음

Mysql과 컨테이너 생성후 tomcat 컨테이너와 연결

  1. docker pull mysql

  2. docker run -d -p 3307:3306 -e MYSQLROOT_PASSWORD=root --name mysql1 mysql
    -e옵션은 컨테이너가 생성될 때 외부 파라미터를 입력받기 위해 사용되는 환경변수
    https://hub.docker.com/
    /mysql 에서 환경변수 확인가능

  3. docker exec -it mysql1 bash
    mysql1컨테이너에 접속, -it는 컨테이너를 종료하지 않고 터미널의 명령을 계속해서 컨테이너에 전달하기 위해 사용한다.

  4. 로그인후 테이블 생성과정 – 기존 mysql사용방식과 동일하다.
    mysql -uroot -proot
    create database testdb;
    use testdb;
    create table test( name varchar(20) primary key, age int );
    insert into test values('hwangharam', 24);

  5. tomcat와 mysql의 ip주소체크 – docker inspect “컨테이너 이름”

  • 컨테이너, 도커엔진(가상리눅스), 호스트의 네트워크 환경도
  • war파일 생성
    Web의 jsp파일에서 mysql연결 주소로는 "컨테이너 IP주소":"포트번호"/testdb 입력(mysql컨테이터의 주소와 컨테이너 자체포트번호)
    웹프로젝트에 jdbc드라이버 설치 - jdbc드라이버 jar파일을 src/webapp/WEB-INF/lib 에 넣고 war파일생성

0개의 댓글