Docker 시작하기
포스트
취소

Docker 시작하기

본 문서는 docker 공식문서 - Get Started를 바탕으로 작성된 자료입니다.

필요한 자료는 링크 에서 다운로드 할 수 있습니다.

build

  • docker build 명령어를 통해 작성된 Dockerfile을 바탕으로 도커 이미지(docker image)를 생성할 수 있습니다.
  • 도커 이미지는 [registry명]/[image명]:[버전]을 기본으로 하며 각각 생략할 경우 ‘registry명’은 ‘dockerhub’, ‘버전’은 ‘latest’로 인식합니다.
1
2
3
4
5
6
7
8
# Dockerfile
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
1
2
# 이미지 생성
docker build -t getting-started .
  • -t: docker image의 이름 지정.
  • .: Dockerfile의 경로.

run

docker run 명령어를 통해 ‘build’ 또는 ‘pull’한 도커 이미지를 컨테이너로 실행합니다.

1
2
# 컨테이너 실행
docker run -d -p 80:80 --name tutorial docker/getting-started
  • -d: detached 모드(백그라운드에서 컨테이너 실행).
  • -p: [host-port]:[container-port]. 호스트의 포트 80을 컨테이너의 포트 80에 포트포워딩.
  • --name : 컨테이너 이름 설정.
  • docker/getting-started: 사용할 도커 이미지.

rm

rmrmi 명령어를 통해 도커 컨테이너/이미지를 삭제할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 현재 실행 중인 컨테이너 확인
docker ps
docker container ls (-al)

# 도커 이미지 확인
docker images
docker image ls 

# 실행 중인 컨테이너 중지
docker stop <컨테이너 Id/Names>

# 컨테이너 삭제
docker rm <컨테이너 Id/Names>

# 실행 중인 컨테이너 강제 삭제
docker rm -f <컨테이너 Id/Names>

# 이미지 삭제
docker rmi [image Id/Names]
docker image rm [image Id/Names]

tag & push

  • docker hub와 같은 registry를 사용하면 도커 이미지를 공유할 수 있습니다.
  • docker registry는 private과 public 환경으로 모두 생성 가능합니다.
  • docker tag 명령어를 통해 registry명을 변경해 도커 이미지를 ‘push’할 수 있습니다.
1
2
3
4
5
6
7
8
# docker 로그인
docker login

# registry명 변경
docker tag getting-started <Your-dockerhub-id>/getting-started

# 이미지 push
docker push <Your-dockerhub-id>/getting-started

Volume

  • 실행된 docker 컨테이너에 추가되는 데이터들은 별도의 RW(Read and Write) 레이어에 저장되게 됩니다. 그래서 컨테이너를 삭제하는 경우 데이터도 같이 삭제가 됩니다.
  • DB 관련 컨테이너의 경우 이러한 현상은 데이터가 없어지기 때문에 문제가 되는데, 이러한 문제는 DB 컨테이너가 동일한 host의 디렉토리를 바라보게 설정해서 데이터를 보존할 수 있습니다.
  • -v 옵션을 통해 volume을 지정한 container경로에 mount 할 수 있습니다.
1
2
3
4
5
6
7
8
9
# named volume
# Volume 생성
docker volume create todo-db

# Volume 정보 확인
docker volume inspect todo-db

# DB 연결
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

Networking

  • 컨테이너 간 통신을 위해서는 network 작업이 필요합니다. 2가지의 방법을 통해 네트워크를 지정할 수 있습니다.
    1. 컨테이너 실행시 네트워크를 지정하는 방법.
    2. 만들어진 컨테이너에 네트워크를 연결하는 방법.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# network 생성
docker network create todo-app

# MySQL 컨테이너 시작
# amd-architecture
docker run -d \
     --network todo-app --network-alias mysql \
     -v todo-mysql-data:/var/lib/mysql \
     -e MYSQL_ROOT_PASSWORD=secret \
     -e MYSQL_DATABASE=todos \
     mysql:5.7

# arm-architecture
docker run -d \
     --network todo-app --network-alias mysql \
     --platform "linux/amd64" \
     -v todo-mysql-data:/var/lib/mysql \
     -e MYSQL_ROOT_PASSWORD=secret \
     -e MYSQL_DATABASE=todos \
     mysql:5.7

# MySQL 접속
docker exec -it mysql -u root -p
1
2
# todos 데이터베이스 확인
SHOW DATABASES;
1
docker run -it --network todo-app nicolaka/netshoot

docker-compose

  • 일반적으로 컨테이너를 실행할 때 (예제처럼) 여러 옵션을 줘야하는 경우가 많습니다. 이러한 옵션들을 커맨드라인으로 직접 입력하는 것은 매우 번거로우며, 컨테이너 관련 정보를 관리하는데도 불편한 점이 있습니다.
  • ‘docker-compose’는 커맨드라인으로 입력하던 컨테이너의 세부사항을 yml 파일을 통해 일괄적으로 정의하고 관리할 수 있게 지원합니다.
  • docker-compose 설치는 링크를 참조하시면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# docker-compose.yml
version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "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
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:
1
2
3
4
5
# docker-compose 실행
docker-compose up -d

# docker-compose 중지
docker-compose down

기타

1
2
# Security scanning
docker scan getting-started
1
2
# Image layering
docker image history getting-started
1
2
# Image Search
docker search [image명]
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.