Docker 기본 명령어

sobu·2020년 12월 9일
0

Intro

매우 자주 쓰는게 아니다 보니 가끔 까먹는 Docker 명령어들이 있다. 정리해 보도록 하자. 완전 기본 명령어인 docker pull, docker attach, docker images등은 본 글에서 제외한다.

Docker command

컨테이너를 생성할 때: Run

사실 run 명령어가 Docker의 꽃이라고 생각한다. run 명령어의 각종 파라미터를 자유자재로 다루어야 Dockerfile을 만들때도 느낌이 올 것이다.

docker run --restart=always # Docker daemon이 켜지면 Container가 자동 실행되기를 원한다면..
docker run -rm # 일시적으로 Container를 만들고 싶다면..
docker run -i # Keep STDIN open even if not attached (Attach 안되있어도 표준스트림을 열어 놓아라)..
docker run -t # Allocate a pseudo-TTY (가상터미널을 할당해 놓아라)..
docker run -d # Detached 된 상태로 Container를 생성해라..
docker run -e HOME=/home # 환경변수를 입력으로 줄때

컨테이너를 이미지로 만들 때

docker commit -m "commit_message" container_name image_name:tag # Container를 Image로 만든다. 
docker save -o myfile.tar my_container_name:my_tag # Image를 Binary파일로 만든다.
docker load -i some.tar # save 명렁어로 만들어진 tar을 Image로 Load한다.
docker build --tag image_name:tag . # 현재경로의 Dockerfile 기반으로 Image를 생성

기타

docker exec -it container_name command # Container안에 특정 명령을 수행시킨다. 
docker inpect image_name:tag # Show detail image infomation
docker cp some.txt mycontainer:/some.txt # Container안에 특정 파일을 복사한다. 

Dockerfile

배포하려고 Image를 다 만들었는데, 몇가지를 빼먹었을 때 쓰는 꼼수이다. 특히, Container가 실행시 어떤 명령어를 수행해야한다면 좋은 방법이다.

# Dockerfile
FROM my_image:my_tag
COPY run.sh /run.sh
RUN chmod +x /run.sh
ENTRYPOINT ["/run.sh"]

Dockerfile은 위와 같이 작성하고, 아래와 같이 run.sh shell script를 작성한다. 아래는 특정 앱을 띄우기 위한 내가 만든 예시다.

#!/bin/sh
service ssh restart;
tmux new-session -d -s "my_app" /start_my_app.sh;
# Execute the CMD
exec "$@";
sleep infinity; # Container가 꺼지면 안되는 상황일 때? 추가해둔다. 원본 이미지에 따라 필요 없는 경우도 있다. 

나의 경우는 openssh-server가 Container 실행시 자동으로 실행되지 않는 문제가 있어 주로 위와같이 ENTRYPOINT로 임시 해결한다.
그 후 위에서 언급한 docker build ...으로 이미지를 다시 만들어 배포하면 된다.

#!/bin/sh

이거는 중요하다. 없으면 standard_init_linux.go:211: exec user process caused "exec format error“ 이런 에러가 발생할 수 있는데, 컨테이너에서 지정된 파일을 어떤 프로그램을 이용하여 실행해야 하는지 모를 경우 발생하는 에러다. 꼭 추가하도록 하자.

exec "$@"; sleep infinity;

이거는 가끔 특정 버전의 리눅스 컨테이너가 만들자마자 아무것도 실행되고 있지 않으면 꺼지는 현상이 발생해서 추가한다.

Outro

오늘은 임시로 Kubernetes에 올릴 이미지를 생성하기 위해 여러가지 시도를 한 것을 정리하여 보았다. 위의 방법이 정석적인 방법은 아니므로 참고하길 바란다.

profile
Maybe, Am I human?

0개의 댓글