개요

도커 명령어 일일히 치는게 부담스럽기 때문에 쉘로 실행할 수 있도록 한다. 그렇게 수행하면서 생긴 여러 삽질 내용 기록물.

 

명령어순서

1. 도커 이미지 빌드

  • --no-cache : 캐시 삭제 후 빌드
  • --tag : tag 네임 설정, 이미지 네임이랑 태그 값을 설정해서 빌드
  • --build-arg : Dockerfile 의 ARG 변수 값을 오버라이딩해서 빌드

2. 도커 컨테이너 실행

  • --publish(= -p) : 컨테이너 포트 및 앱 포트 설정
  • --detach(= -d) : 컨테이너를 detached mode (분리상태) 에서 실행시킨다. 컨테이너를 백그라운드에서 실행시킴과 동시에 컨테이너 ID 를 출력한다.
  • --name {name} : 도커 이미지의 실행 컨테이너 명을 {name} 으로 설정한다.
  • --volumn(= -v) {host-directory}:{container-directory} : 데이터 볼륨을 호스트 특정 디렉토리와 연결시킨다. Dockerfile 에 volume 명령어를 추가해주어야 한다.
  • --mount type={type-name},source={volume-name},target={container-target-dir}
    • type : bind, volume, tmpfs 등 마운트 유형을 선택한다. (나는 volume 을 선택)
    • source(=src) : 볼륨의 이름을 정의. 익명 볼륨의 경우 필드는 생략된다. (나는 추후에 볼륨을 만들고 해당 볼륨 source 에 설정해두었다.)
    • target(=dst, destination) : 파일 또는 디렉토리가 컨테이너에 마운트 된 경로를 값으로 사용한다. 컨테이너 내에 파일이 저장될 위치를 설정값으로 /static/imags 라 경로를 잡고 target 의 값도 동일하게 /static/images 라 잡아둔다.

 

3. 기타 명령어

  • docker ps : 현재 실행 중인 모든 컨테이너 목록을 출력하는 명령어
  • docker ps --no-trunc : docker ps 명령어를 사용하면서 command 가 전체 다 보이도록 한다.
  • docker images -f "dangling=true" -q : docker images 조회 시, <none> 인 이미지 ID 전체 조회
  • docker rmi $(docker images -f "dangling=true" -q) : <none> 이미지 전체 삭제

 

도커 볼륨?

도커의 이미지로 컨테이너 생성시, 이미지는 읽기 전용(writable)이라 쓰기가 불가능하다. 따라서 컨테이너 계층에 변화되는 데이터들이 저장되는데 이럴경우 컨테이너가 삭제되면 그 동안의 저장된 운용데이터가 삭제된다. 결국 컨테이너 삭제시 데이터의 영속성을 보장할 수 없는 문제가 발생한다.

 

나스 내 도커 플러그인을 통해 컨테이너 지울 시 이렇게 나온다.

그래서 위의 문제점때문에 도커 볼륨 마운트를 하기위한 방법이 여러가지가 아래와 같이 존재한다. 각각의 방법에 대한 장단은 다른 기타 블로그를 참고하고. 나는 2번을 선택

 

1. Dockerfile volume command

2. docker run 명령어 수행 시 -v option 을 통한 호스트 특정 디렉토리 매핑

3. docker run 명령어 수행 시 -v option 을 통한 volume create 이용

4. volume container 이용

 

일단 무작정 하기

1. 도커 볼륨 생성

2. 생성된 볼륨 조회

3. 볼륨 정보 획득

4. 도커 실행시 볼륨 마운트 명령어 입력

docker run -d -p 9090:8080 --name {cotainer-name} --mount type=volume,source={volume-name},target={container-dir} {image-name}
  • --mount 옵션 이용. 관련 내용은 도커 공홈에 잘 나와있어서 그대로 따라 타이핑.
  • docker 가 실행시킬 이미지 파일의 이름은 가장 마지막에 둔다.\

원래 마운트가 완료되고 이후에 docker inspect {volume-name} 을 수행하면 공홈처럼 아래와 같이 나와야 하는데 나는 나타나지는 않고 파일 저장만 정상적으로 수행되었다. 이에 대한 정확한 이유는 모르겠다.

 

5. 앱단에서 파일 저장 수행 및 volume 마운트 연결 확인

 

6. 이미지 등록 이후 마운트되고 저장된 파일 확인.

 

eagle deploy file (도커 배포 파일)

#!/bin/sh

latest_jar=$(ls -dt movie* | sort -V  | tail -n 1)
tag_name="latest"
container_name="masterpiece-club-1st"

############################################################
# [docker build command]
############################################################
image_build_command="sudo docker build --no-cache --tag $latest_jar:$tag_name --build-arg JAR_FILE=$latest_jar ."
printf "=================================================\n" 
printf "| Docker image build !!\n"
printf "=================================================\n" 
printf "| JAR_FILE :: $latest_jar\n"
printf "| TAG_NAME :: $tag_name\n"
printf "=================================================\n"
printf "| $image_build_command\n"
printf "=================================================\n"

$image_build_command


############################################################
# [stop container by name or container-id]
############################################################
stop_container_command="sudo docker stop $container_name"
printf "\n"
printf "=================================================\n"
printf "| $stop_container_command\n"
printf "=================================================\n"

$stop_container_command


############################################################
# [remove container by name or container-id]
############################################################
remove_container_command="sudo docker rm $container_name"
printf "\n"
printf "=================================================\n"
printf "| $remove_container_command\n"
printf "=================================================\n"

$remove_container_command

############################################################
# [docker container run command]
############################################################
container_run_command="sudo docker run -d -p 9090:8080 --name $container_name --mount type=volume,source=test-vol,target=/static/images $latest_jar:$tag_name"
printf "\n"
printf "=================================================\n"
printf "| Docker container running !!\n"
printf "=================================================\n"
printf "| $container_run_command\n"
printf "=================================================\n"

$container_run_command

 

도커 명령어 참고링크

 

 

Posted by doubler
,