본문 바로가기
IT/오픈소스

Docker란?

by 모띠 2023. 3. 26.

Docker

서비스 운영환경을 묶어서 손쉽게 배포하고 실행하는 경량 컨테이너 기술(go언어로 개발됨)

도커를 지원하는 환경은 현재 리눅스밖에없음(그러므로 맥 & 윈도우는 리눅스기반의 경량 가상머신을 띄워놓고 그안에서 컨테이너를 띄우는것)

도커는 이미지를 받고, 실행중인 이미지를 컨테이너라고함

기본적으로 자원제한을 해주지않으면 호스트컴퓨터의 전체자원을 다 사용함

 

컨테이너

컨테이너는 가상머신?

vitural box / vmware 처럼 각각의 가상머신을 띄우는거랑 다른가?

→ 다르다

  • 가상머신은 하드웨어 자체를 가상화
  • 컨테이너는 하드웨어 가상화가 아님(os에서 지원하는 기능을 사용)
  • 격리되는 환경에서 실행되는 프로세스라고 생각하면 편함

리눅스라면 실제로 컨테이너 = 호스트의 프로세스 이지만,

맥 & 윈도우는 리눅스 기능을 쓸수없으므로 가상화 기능이 필요.

윈도우쪽에서는 hyper-v나 wsl2를 이용.

(맥 & 윈도우라면 컨테이너 = 가상머신에서 띄운 프로세스)

이미지

특정프로세스가 실행되기 위한 환경

  • 파일들의 집합이라고 생각하면 편함.
  • 어떤 프로그램을 띄우기위해서 해야하는 선행작업을 명령어&파일로 모아둔것이 이미지 → 이미지를 사용하면 다른컴퓨터에서도 누구든 같은환경이됨.

이미지는 작동되는 상태가 보장됨.

 


설치

linux :

curl -s http://get.docker.com/ | sudo sh

sudo wget -qO- http://get.docker.com/ | sh <- 이렇게 해도되고(자동설치방법)

 

centos 라면

#Install

sudo yum install docker

 

#Docker 서비스 실행

sudo service docker start

 

#부팅시 자동 실행 설정

sudo chkconfig docker on

 

docker version 쳐서 클라이언트 / 서버 둘다나오면 설치완료

 

mac & window : docker for .. 설치 였는데, 윈도우쪽은 부분유료화로 wsl2로 까는게 좋음

 

도커 컨테이너에 운영체제 설치

  • centos : docker run -it centos:7 /bin/sh ← 이미지가 없으면 알아서 받고 실행
  • ubuntu : docker run -it ubuntu:16.04 /bin/sh
  • alpine : docker run -it alpine:latest /bin/sh (핵심기능만 필요하면 초경량 alpine 이미지 사용- 5mb)

 

도커 컨테이너에 vi설치

#docker exec -it [container_id] bash

#apt-get update

#apt-get install vim

 

도커는 Hyper-V기반 가상화로 돌아서 ip가 부팅마다 계속 달라짐

 

명령어

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] : 도커실행 / 명령어를 안치면 기본적으로 켰다꺼지지만, 이미지안에 명령어가 들어가있는것들도있음.

 

옵션 설명

-d detached mode 흔히 말하는 백그라운드 모드 -p 호스트와 컨테이너의 포트를 연결 (포워딩)

-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)

-e 컨테이너 내에서 사용할 환경변수 설정

--name 컨테이너 이름 설정(설정안해주면 도커가 알아서 랜덤으로 생성함)

--rm 프로세스 종료시 컨테이너 자동 제거(진짜 삭제)

-it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션

–link 컨테이너 연결 [컨테이너명:별칭]

docker run -d -p 3305:3306 -e  =true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
도커를 실행하는데 백그라운드 옵션으로 로컬포트 3305을 도커포트 3306로 연결. 
~~값 환경변수에 설정. 컨테이너명은 mysql로. /var/lib/mysql파일에 저장되는걸 /my/own/datadir파일에도 저장(업데이트할때 데이터가 전부사라지는걸 방지). 
mysql:5.7이라는 이미지 실행 (없으면 받는다).

docker exec -it mysql /bin/sh  

docker ps (-a): 컨테이너 목록 확인 (실행됐다가 종료된것도 표시)

docker stop [옵션] 컨테이너 : 실행중인 컨테이너 중지 (컨테이너 id는 ps로 확인) -> 종료일뿐 삭제는 아님!

docker start 컨테이너 : 전에 종료한 컨테이너를 다시 실행

docker restart 컨테이너 : os재실행 처럼 컨테이너 재실행

docker rm [옵션] 컨테이너 : 종료된 컨테이너 완전히 제거

docker images [옵션] : 도커가 다운로드한 이미지 목록보기

docker pull [옵션] 이미지 : 이미지 다운로드

docker rmi [옵션] 이미지 : 다운로드한 이미지 삭제

docker logs [옵션] 컨테이너 : 컨테이너 로그 확인 (--tail 10 맨밑에 10줄만) / (-f 실시간 로그확인)

docker attach 컨테이너 : 컨테이너에 접속하기. (명령을 실행한후 엔터를 한번 더 치면 bash쉘이 표시됨)

docker exec [옵션] 컨테이터 COMMAND [ARG...] : 실행중인 컨테이너에 들어가서 컨테이너파일 명렁어 실행(외부에서 컨테이너 명령 실행)

docker diff 컨테이너id - 첨받은 이미지를 기준으로 실행중인 컨테이너는 어떤 변화가 있는가.

docker tag 이미지명:태그명 새로운이미지명:태그명 : 도커 이미지명 변경(실제로 바꾸진않고 하나더생김)

(예를들어 우분투를 받고 그안에다가 깃을깔았다면 깃이 변경사항이되는것)

 

run명령어는 새로 컨테이너를 만들어서 실행 / exec는 실행중인 컨테이너에 명령어를 내림.

docker build [옵션] [경로-도커파일이 있는 폴더에서 실행하면 필요없음] 만들이름 . : 이미지를 빌드

 

docker run -d -p 3305:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7

 

위 명령어를 실행하여 컨테이너를 올려도 되지만 아래와 같이 docker-compose.yml 파일로 만들어서 실행할 수 있다.

  • 장황한 도커 옵션을 한눈에 볼 수 있어 편하다.
version: "3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:8.0.17 # 사용할 이미지
    container_name: jmlim-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부(내컴):컨테이너 내부(도커))
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: "password"  # MYSQL 패스워드 설정 옵션
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/jmlim/datadir:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)

 

실행 docker-compose 파일 실행

  • docker-compose.yml 작성한 위치에서 실행
  • 백그라운드로 실행 시 옵션 -d 붙이면 됨.
    • 자세한건 옵션 참고
docker-compose -f 컴포즈파일 up -d

 

 

예시

version: '3.8'
services:
    local-mysql:
        image: 'mysql:5.7'
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 654654
            MYSQL_DATABASE: testDB
            MYSQL_USER: shin
            MYSQL_PASSWORD: 654654
            TZ: Asia/Seoul
        ports:
            - "3307:3306"
        container_name: local-mysql
		    command:
		      - --character-set-server=utf8
		      - --collation-server=utf8_general_ci

docker volume prune 안쓰는 볼륨 삭제

도커는 기본 디렉토리가 /var/lib/docker인데 여기가 용량 할당된게 별로없어서 바꿔줘야함

참조(https://fliedcat.tistory.com/113)


도커 이미지 생성하기

지금까지는 다 만들어진 이미지만 사용했는데, 내가 원하는 이미지를 생성할 수 도 있다.

예를들어, 우분투 이미지는 git이 포함되어있지않지만, git을 포함시킨 우분투이미지를 만들어서 배포도 가능.

도커는 레이어형식으로 이미지가 구성되어있기때문에, 우분투에 git 레이어를 추가하여 이미지를 만들면됨.

  1. 우분투 이미지를 다운받고
  2. 우분투 컨테이너에 접속하여 git 설치
  3. diff떠봐서 git이 설치되었는지 확인(생략가능)
  4. 'docker commit 컨테이너id 레파지토리명:태그명' ex) docker commit 92de ubuntu:git
  5. docker images로 새롭게 만들어진 이미지 확인가능
  6. 그다음에 docker run -it ubuntu:git bash 으로 컨테이너를 만들면 그안에는 git이 들어가있다..

근데 실제로 위처럼 commit명령어를 쓸일은 거의없고 도커파일을 만들어서 실행함.

Dockerfile

이미지 생성과정을 기술한 도커전용 DSL (즉, 위의 과정을 파일로 정의해놓은것)

// 베이스 이미지 지정
FROM ubuntu:latest

// 파일추가 (=COPY 뭐가 압축도풀고 차이일꺼임)
ADD data.txt /temp/data.txt    data.txt를 도커컨테이너의 temp/data.txt로 추가해라 (현재디렉토리 아래만 참조가능)    

// 컨테이너 안에서 명령어 실행
RUN apt-get update
RUN apt-get install -y git

// 작업디렉토리 변경 (RUN명령어가 실행되는 디렉토리를 변경)
WORKDIR /tmp 

// 환경변수 기본값 지정
ENV AWESOME_VAR FOOBAR

// 컨테이너로 실행시 노출시킬 포트 (-P옵션을 같이사용해야함)
EXPOSE 3315

// 이미지를 실행시 기본으로 실행할 명령어 설정 (ubuntu 같은경우에는 기본명령어가 없어서 명령어를 안치면 자동종료됨 / mysql은 기본명령어가 있어서 자동종료안됨)
CMD 명령어

docker build -t ubuntu:git02 '도커파일이 위치한경로'

'IT > 오픈소스' 카테고리의 다른 글

JPA - 기본 개념  (1) 2024.01.30
카프카(Kafka) - 활용정리  (0) 2023.09.12
카프카(Kakfa) 개념정리  (1) 2023.09.11
네티(Netty) 기본정리2  (0) 2022.02.22
네티(Netty) 기본정리  (0) 2022.02.06

댓글