도커 로고

 

1. 도커 복습

1.1 컨테이너

  • 도커 컨테이너는 도커 이미지를 기반으로 실행되는 프로세스이다.
  • 도커 컨테이너에는 BORA(Build Once, Run Anyware) 컨셉트가 있다.

 

1.2 컨테이너 설계

도커 컨테이너를 생성할 때  주로 주의해야 할 점은 다음 네가지

  • 1 컨테이너당 1 프로세스
  • 변경 불가능한 인프라(Immutable Infrastructure) 이미지로 생성한다.
  • 경량의 도커 이미지로 생성한다.
  • 실행 계정은 root 이외의 사용자로 한다.

 

1.3 파일 작성법

  • Dockerfile 을 사용해 컨테이너를 생성한다.
  • 컨테이너가 실행되기 까지 실행할 명령어를 처리 후 이미지를 생성하고, 생성한 이미지를 기반으로 컨테이너를 생성한다.

 

예제)

# Alpine 3.7 버전 golang 1.10.1 이미지를 사용
FROM golang:1.10.1-alpine3.7

# 8080 포트 오픈
EXPOSE 8080

# 빌드할 머신에 있는 main.go 파일을 컨테이너에 복사
COPY ./main.go ./

# 컨테이너 내부에서 명령어 실행
RUN go build -o ./go-app ./main.go

# 실행 계정을 nobody로 변경
USER nobody

# 컨테이너가 기동할 때 실행할 명령어 정의
ENTRYPOINT ["./go-app"]

 

위의 예제에서는 alpine 이미지를 사용했는데, 이미지 종류에 따라 용량과 용도가 다르다.

 

이미지 명 이미지 사이즈
scratch 최소 (0 bytes)
alpine 작다
distroless 작다
ubuntu 크다
centos 크다
Universal Base Image 크다

 

scratch 이미지의 경우 정적인 프로그램만 실행이 가능하고, 쉘이 없기 때문에 로그인도 되지 않는다.

좀 더 도커에 익숙해지면, docker-compose.yml 을 사용하여 이미지 로드 및 컨테이너 실행까지 한번에 가능하게 된다.

 

더보기

해당 예제는 도커 공식 튜토리얼을 마치면 나오는 docker-compose.yml 파일이다.

version: "3.8"

services:
  app:
    image: node:12-alpine
    container_name: getting-started-on-mac
    command: sh -c "apk add --no-cache python2 g++ make && yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    container_name: mysql-5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

volumes:
  todo-mysql-data:

 

실행은

docker-compose -f docker-compose.yml up -d

 

중단은

docker-compose -f docker-compose.yml down

 

으로 간편하게 사용이 가능하다.

 

1.4 이미지 빌드

  • 위의 Dockerfile 이 있는 곳에서 docker image build -t [태그명] . 를 사용하여 이미지로 빌드가 가능하다.
  • 생성된 이미지는 docker image ls 로 확인 가능하다.
  • 이미지 삭제는 docker image rm [레퍼지토리:태그] 으로 삭제 가능하다.
    • 혹은 docker rmi [레퍼지토리:태그]

 

1.6 도커 레지스트리로 이미지 업로드

  • 이미지를 빌드하고 나면 자신의 도커허브에 (마치 깃허브 처럼) 자신의 이미지를 올릴 수 있다.

 

# 도커 허브 로그인
docker login

# 이미지 태그 변경
docker tag docker101tutorial {userName}/docker101tutorial

# 도커 허브에 이미지 업로드
docker push {userName}/docker101tutorial

# 도커 허브 로그아웃
docker logout

 

해당 예제는 기존에 작성한 글에서 가져왔다.

 

1.7 컨테이너 기동

  • docker container run -d -p [자신의 포트]:[컨테이너의 포트] [레퍼지토리:태그]
    • -d : background 실행
    • -p : port 지정

 

기존에 https://blog.rgbplace.com/406 작성한 글과 조금 겹치는 부분이 많지만 복습을 위해 다시 정리해 보았다.