일반적으로 개발사 등에서 제공되는 docker image 들은 운영에 필요한 최소한의 바이너리들만 담는 경우가 많기 때문에 컨테이너에 문제가 생기거나, 컨테이너 내부의 프로세스를 확인하고자 하는 경우에 ps 명령이 없어서 프로세스 확인이 불가능하거나, ping 명령이 없어서 연결 여부 확인이 안된다거나 하는 경우가 있을 수 있다. 또 docker 명령을 이용해 컨테이너에 진입하여 작업을 하는 것이 이래저래 불편해서 ssh의 아쉬움을 느끼는 경우도 왕왕 있을 것이다.
이 포스트에서는 특정한 도커 이미지에 운영에 편의를 위한 패키지들을 설치하고 SSH 서버도 추가하여 이미지를 새로 만들 것이다.
dockerfile 예제
실제 docker image build를 위한 예제이다.
세부 내용은 주석을 참고하면된다.
# base가 될 이미지 # bitnami/jupyter-base-notebook # 최신의 이미지에 append 하는 형태로 빌드하고자 한다면 latest tag 를 붙여준다. # FROM haedongg.net/library/jupyter/pyspark-notebook:latest FROM haedongg.net/library/jupyter/pyspark-notebook:spark-3.2.0 # 레이블. 없어도 된다. LABEL comment "essential tools & configuration" # 아래 작업들을 수행할 계정 # USER ACCOUNT 다음 라인은 별도로 USER를 변경하는 작업이 없다면 모두 ACCOUNT 계정으로 작업이 수행된다. USER root ENV DEBIAN_FRONTEND=noninteractive \ TZ=Asia/Seoul # 편의를 위해 기본적으로 필요한 것들 # 프록시를 사용하는 경우 apt-get 앞에 다음을 추가한다. # RUN sudo https_proxy=PROXY_SERVER_HOST:PORT http_proxy=PROXY_SERVER_HOST:PORT RUN apt-get update RUN apt-get install -y openssh-server sudo procps curl vim git openssh-client telnet net-tools tcpdump htop --no-install-recommends # 컨테이너 이미지 파일의 크기를 줄이기 위해 apt 수행 중 생성된 임시 파일들을 삭제해준다. RUN apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* #### 여기부터 SSH RUN mkdir /var/run/sshd # root password 변경, $PASSWORD를 변경한다. RUN echo 'root:$PASSWORD' | chpasswd # ssh 설정 변경 # root 계정으로의 로그인을 허용한다. 아래 명령을 추가하지 않으면 root 계정으로 로그인이 불가능하다. RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config # 응용 프로그램이 password 파일을 읽어 오는 대신 PAM이 직접 인증을 수행 하도록 하는 PAM 인증을 활성화 RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config RUN mkdir /root/.ssh EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] ####여기까지 SSH # sudo 설정 # 사용자 추가, $USER 가 사용자 명, $PASSWORD 가 패스워드이다. RUN adduser --disabled-password --gecos "" $USER &&\ echo '$USER:$PASSWORD' | chpasswd &&\ adduser $USER sudo &&\ echo 'USER ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers # user 변경 USER $USER # alias를 추가하고 싶은 경우 RUN echo "alias ll='ls -lha'" >> /home/$USER/.bashrc # pip 패키지 인스톨 # 프록시를 사용한다면 RUN https_proxy=http://PROXY_SERVER_HOST:PORT http_proxy=PROXY_SERVER_HOST:PORT RUN pip --trusted-host pypi.org --trusted-host files.pythonhosted.org install --no-cache-dir s3fs py4j pytz toml xgboost==1.5.1 lightgbm==3.3.1 scikit-learn==1.0.1 mlflow mlflow-skinny sqlalchemy alembic sqlparse tqdm boto3 # 설정된 home directory의 권한 부여 RUN chown -R $USER /home/$USER
Build
# docker image build -t $TARGET_DOCKER_IMAGE_NAME:tag $dockerfile_location docker image build -t haedongg.net/library/new_haedong_image:v0.1 . docker image tag haedongg.net/library/new_haedong_image:v0.1 haedongg.net/library/new_haedong_image:latest
_-t 옵션 및 tag 옵션으로 지정하는 이미지 이름은 build에 사용한 원래 이미지의 이름, 경로와는 상관이 없다. 내가 사용하고자 하는 이름을 지정하면 된다.
단, local 이미지가 아닌 harbor나 docker hub 등의 외부 리포지터리에 업로드 하고자 한다면 정확한 이름을 지정해줘야 push가 가능하다._