Dockerfile

Docker 이미지를 만들게 해주는 파일

DockerHub 에 올려놓은 Docker 이미지와는 다르다. 

 

베이스 이미지를 생성하는 FROM

컨테이너를 특정 초기 이미지(베이스 이미지)를 생성하는 역할.

컨테이너를 생성할 시 추가적인 셋팅을 할수 있게 해주는 역할

 

예를 들어, 컴퓨터나 랩탑을 사면 기본적으로 설치되어 있는 프로그램들이 있다. 이러한 것들이 베이스 이미지와 똑같다.

 

도커의 경우에는 컨테이너를 새로 띄워서 미니 컴퓨터 환경을 구출할 때

필요에 따라 설치하고 싶은 기본 프로그램을 선택하는 옵션이라고 볼 수 있다.  

 

<사용방법>

FROM (이미지명) # 최신버전 사용
FROM (이미지명):(태그명) # 태그명 버전 사용

 

Dockerfile 을 이용하여 베이스 컨터이너 띄우기

  • Dockerfile 생성
From node

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어

     - ENTRYPOINT : 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 뜻한다. 쉽게 설명하자면 미니 컴퓨터의 전원을 키고나서 실행시키고 싶은 명령어를 적으면 된다. 

  • 이미지 만들고 컨테이너 띄우기
$ docker build -t my-node-server . # 이미지 생성
$ docker run -d my-node-server # 이미지를 기반으로 컨테이너 생성
$ docker ps # 실행 중인 컨테이너 조회
$ docker exec -it [컨테이너 ID] bash # 컨테이너 접속

$ node -v # Node 설치되어 있는 지 확인

 -  docker build -t my-node-server .

      -  my-node-server : 이미지 이름

      -  .  : Dockerfile 이 존재하는 디렉터리 경로

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

1. MySQL 이미지를 바탕으로 컨테이너 실행시키기
    
    [mysql - Official Image | Docker Hub](https://hub.docker.com/_/mysql)
    

 $ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
  • (참고)
    • run 을 사용하면 로컬에 이미지가 없으면 Dockerhub으로부터 이미지를 알아서 다운받아서 실행
      • `docker pull` 과정은 생략해도 상관없다
    • - e : 옵션은 컨테이너의 환경 변수를 설정하는 옵션이다.
      • Dockerhub의 MySQL 공식 문서를 보면 환경 변수로 `MYSQL_ROOT_PASSWORD`를 정해주어야만 정상적으로 컨테이너가 실행된다고 적혀져 있다.
    • -p :  옵션은 port mapping 을 설정하는 옵션

   

아래의 명령어로 컨테이너로 들어가서 환경 변수를 직접 눈으로 확인

$ docker exec -it [MySQL 컨테이너 ID] bash

 

  • docker exec : 실행 중인 Docker 컨테이너 안에서 명령어를 실행할 때 사용하는 Docker 명령어
  • -i : 입력(interactive)을 의미하며, 사용자의 입력을 컨테이너에 전달할 수 있도록 해주는 옵션
  • -t : 터미널(tty)을 활성화하여, 컨테이너 안에서 셸 환경을 사용할 수 있도록 해주는 옵션
  • bash: 컨테이너 안에서 bash 셸을 실행하라는 의미

- bash 에서 실행할 명령어들

 

$ echo $MYSQL_ROOT_PASSWORD # MYSQL_ROOT_PASSWORD라는 환경변수 값 출력
$ export # 설정되어 있는 모든 환경변수 출력


2. 컨테이너가 잘 실행되고 있는 지 체크

$ docker ps


3. 컨테이너 실행시킬 때 에러 없이 잘 실행됐는 지 로그 체크

$ docker logs [컨테이너 ID 또는 컨테이너명]


4. DBeaver에도 연결시켜보기

URL: localhost:3306  입력

 

 

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

도커의 동작방식

- 이미지를 다운로드하여 컨테이너를 실행하는 방식

- 기존에 실행 중인 컨테이너에 업데이트 사항이 있으면, 필요한 이미지를 생성하여 새로운 컨테이너를 실행한다.

( 즉, 컨테이너의 파일 시스템이 초기화된다. 기존의 컨테이너를 수정하지 않음)

 

→ 업데이트를 할시 MySQL과 같은 데이터베이스에 저장된 데이터가 있으면 손실되는 문제가 발생

 

Volume 이라는 방식을 도입

도커에서 볼륨이란 :

  • 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법
  • 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태

명령어

$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]

 

명령어 작동 방식

  • [호스트의 디렉토리 절대 경로] 에
    • 디렉토리가 이미 존재할 경우 : 
      • 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.
    • 디렉토리가 없는 경우:
      • 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만든다
      • 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사해온다.

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

 

먼저 예시로 Nginx가 아래 코드를 이용하여 실행되고 있다고 가정

$ docker run -d nginx

 

실행중인 컨테이너 정보 확인

$ docker ps

 

확인된 컨테이너 ID 를 이용하여 아래 코드 실행

$ docker exec -it [컨테이너 ID] bash

 - 해당 컨테이터 내부로 들어가게 된다.

  • -it : 이 옵션을 사용해야 명령어를 입력하고 결과를 확인 가능하다. 이 옵션이 없으면 명령어를 1번만 실행시키고 종료된다.
  • bash : shell 의 일종

 

아마 아래와 같이 뜰것이다.

root@컨테이너ID:/#

 

여기서 아래와 같이 리눅스 커맨드를 이용가능하다.

 ls # 내부 파일 조회

 

종료를 하고 싶을 때는

Control + D 혹은 exit 를 입력

 

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

< 특정 컨테이너의 모든 로그 조회>

$ docker logs [nginx가 실행되고 있는 컨테이너 Id/ 컨테이너 이름]

# 최근 10줄만 조회
$ docker logs --tail 10 [nginx가 실행되고 있는 컨테이너 Id/ 컨테이너 이름]

 

<생성되는 로그를 실시간으로 확인>

# 기존 로그와 함께 조회
$ docker logs -f [컨테이너 명/ 컨테이너 id]

# 기존 로그는 조회하지 않기
$ docker logs --tail 0 -f [컨테이너 명/ 컨테이너 id]
  • -f : follow

 

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

+ Recent posts