[Docker] 도커 시작하기

아현·2022년 12월 21일
1

Kubernetes

목록 보기
2/9

출처

개념 정리



1. 이미지 받아서 실행하기


  • root 계정으로 전환
sudo su #root 계정으로 전환



1) 도커 이미지 다운로드 받기


  • 도커는 이미지를 만들거나 받아서 호스트에 저장한 후 컨테이너로 run해서 프로세스로 만든다.

    • 즉, 무언가 실행하려면 이미지가 필요한 셈이다.
    1. 이미지를 직접 만드는 방법

    2. docker hub를 이용해서 공식 이미지나 다른 사용자들이 만들어놓은 이미지를 다운로드 받는 방법

  • Docker Hub에서 이미지를 받는 방법이다.

    • 우분투 리눅스 이미지를 받아보겠다.
  • docker pull <이미지 이름>:<태그> 형식이다.

    • latest를 설정하면 최신 버전을 받는다.

    • latest 대신 16.04, 18.04를 입력해서 태그를 지정해 줄 수도 있다.

  • 이미지 이름에서 username/imagename:tagname 형식을 사용하면 공식 이미지가 아닌 사용자 이미지를 받는다.

docker pull ubuntu:latest

  • docker images 명령어를 통해 이미지를 출력하여 도커 이미지가 잘 받아졌는지 확인

docker images



2) 도커 실행하기


  • 형식

    • docker run <옵션> <이미지 이름> <실행할 파일>
  • 옵션

    • it

      • 실행된 Bash 쉘에 입출력을 할 수 있다.
    • --name

      • 컨테이너 이름을 지정해줄 수 있고, 지정하지 않으면 자동으로 이름을 부여한다.

  • ubuntu 이미지를 컨테이너로 생성 후 이미지 안의 /bin/bash를 실행

    • 이미지 이름 대신 이미지 ID를 사용 가능

docker run -it --name hello ubuntu /bin/bash


이제 Host OS와 완전 격리된 공간이 생성되었다. cd, ls 명령으로 확인해보면 완전 분리된 공간임을 알 수 있다.

  • exit를 입력하면 Bash 쉘에서 빠져나온다.
    (도커 -> HostOS)

    • 저기서 만든 컨테이너에서 exit를 입력하면 /bin/bash파일을 직접 실행했기 때문에 컨테이너가 정지상태로 바뀐다.



컨테이너 관련 명령어



docker ps -a #모든 컨테이너 출력(정지 컨테이너 포함)

docker ps #실행 중인 컨테이너만 출력

docker start hello #hello 이름의 컨테이너 시작

docker restart hello #hello 이름의 컨테이너 재시작(재부팅)

docker attach hello #컨테이너에 접속(bash 쉘 접속)

docker stop hello #hello 이름의 컨테이너 종료

docker rm hello #hello 이름의 컨테이너 삭제

docker rm -f hello #hello 이름의 컨테이너 강제삭제



2. 나만의 이미지 생성하기(ft. Dockerfile)


Container에서 필요한 프로그램들을 다운로드 받고 commit 명령어를 사용해서 이미지를 만들어도 될텐데, 왜 굳이 Dockerfile을 bash 명령어를 써가며 이미지를 빌드해야 되는지 몰랐다.

  • commit 명령어를 사용해서 이미지를 생성하는 방법은 실무에서 거의 쓰이지 않는다고 한다.
    • 패키지 업데이트도 힘들고, 버전 관리도 까다로워서 Dockerfile을 파일화해서 관리하는 것이 버전 관리나 패키지 업데이트 등의 면에서도 우월하다는 것이다.

Dockerfile 만들기


  • Dockerfile은 Docker 이미지 설정 파일이다. 이 파일에 설정된 내용대로 이미지를 생성한다.

  • 먼저 example 디렉토리를 생성한 뒤 해당 디렉토리로 이동한다. 모든 빌드와 관련된 파일들이 한 폴더(example)에서 이루어진다.


mkdir example
cd example

  • 이번에 다루는 이미지 빌드는 모든 과정을 Dockerfile과 쉘 스크립트 파일로 통합하는 방법이다.

    • 그러면 build-run.sh 파일을 만들고 인자를 전달해서 실행하면 이미지를 만들고 컨테이너로 run까지 one-click으로 할 수 있게 된다.



Dockerfile 관련 명령어


  • FROM

    • 어떤 이미지를 기반으로 할지 설정한다.

    • Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성한다.

    • 만약 완전히 새로운 이미지를 생성하고 싶으면(“맨 땅에서 시작한다”) FROM scratch를 쓰면 된다.

  • MAINTAINER

    • 메인테이너(제작자) 정보이다.

      • Author(저자)라고 생각하면 된다.
  • RUN

    • 쉘 스크립트/명령을 실행한다.

    • 이미지 생성 중에는 사용자 입력을 받을 수 없다. 그래서 apt-get install 명령어를 사용할 경우 -y 옵션을 붙여야 한다.

  • VOLUME

    • 호스트와 공유할 디렉터리 목록이다.

    • docker run 명령어에서 -v 옵션으로 설정할 수도 있다.

  • ADD

    • 빌드시에 주어진 컨텍스트에서 첫번째 인자로 주어진 파일, 폴더를 두번째 인자로 주어진 컨테이너 경로에 추가한다.
  • CMD

    • 컨테이너가 시작되었을 때 실행할 실행 파일/쉘 스크립트이다.
  • EXPOSE

    • 호스트와 연결할 포트 번호이다.

      • 외부와 통신을 가능하게 노출시켜 준다.
    • 기본적으로 컨테이너 실행시 docker run -p 옵션을 주게 되면 암묵적으로 EXPOSE가 된다.



  • Dockerfile

FROM ubuntu:18.04
#set root password
RUN echo "root:ubuntu" | chpasswd
# install packages
RUN apt-get update \
    && apt-get install --yes --force-yes --no-install-recommends \
        sudo \
        software-properties-common \
        xorg \
        xserver-xorg \
        xfce4 \
        gnome-themes-standard \
        gtk2-engines-pixbuf \
        file-roller \
        evince \
        gpicview \
        leafpad \
        xfce4-whiskermenu-plugin \
        ttf-ubuntu-font-family \
        dbus-x11 \
        vnc4server \
        vim \
        xfce4-terminal \
        xrdp \
        xorgxrdp
# add the user and designate sudo authority
RUN adduser ubuntu
RUN echo "ubuntu:ubuntu" | chpasswd
RUN echo "ubuntu ALL=(ALL:ALL) ALL" >> /etc/sudoers
#set the port number of xrdp
RUN sed -i 's/3389/port_number/' /etc/xrdp/xrdp.ini
#install xubuntu-desktop
RUN apt-get install --yes --force-yes --no-install-recommends \
        xubuntu-desktop \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# insert entrypoint.sh and set ENTRYPOINT
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh

  • sed 명령어는 파일에 있는 특정 단어를 찾아서 다른 단어로 바꾸는 역할을 한다.
RUN sed -i 's/3389/port_number/' /etc/xrdp/xrdp.ini
cs
  • ENTRYPOINT 명령어는 컨테이너가 처음 실행될 때(run/start 시) 한번 수행되는 스크립트를 지정한다.

    • 따라서 이미지를 빌드하고 컨테이너로 run하면 entrypoint.sh 쉘 스크립트가 실행된다.
ENTRYPOINT /entrypoint.sh



  • entrypoint.sh

    • dbus, xrdp 서비스를 위한 entrypoint 설정이다.

#!/bin/bash
# create a dbus system daemon
service dbus start
# create the sock dir properly
/bin/sh /usr/share/xrdp/socksetup
# run xrdp and xrdp-sesman in the foreground so the logs show in docker
xrdp-sesman -ns &
xrdp -ns &
# run shell for interface
/bin/bash



  • build-run.sh

    • docker run에 필요한 최종 파일

#!/bin/bash
#edit the port number in Dockerfile
sed -i 's/port_number/'$1'/' ./Dockerfile
#start building image from Dockerfile
docker build -t $2 .
#run container from built image
docker container run -d -it --name $3 -p $1:$1 $2
docker container start $3
#return Dockerfile into first state
sed -i 's/'$1'/port_number/' ./Dockerfile


./build-run.sh [포트번호] [이미지 이름] [컨테이너 이름]
  • 위 명령어를 실행하게 되면 해당 포트 번호, 이미지 이름, 컨테이너 이름으로 이미지 빌드, 실행(run)까지 완료하게 된다.

    • 이미지 빌드에는 시간이 다소 걸린다. 잘 참고 기다리면 나만의 이미지가 생성된다.

./build-run.sh 2022 ubuntu second
Sending build context to Docker daemon  17.92kB
Step 1/10 : FROM ubuntu:18.04
 ---> 251b86c83674
Step 2/10 : RUN echo "root:ubuntu" | chpasswd
 ---> Using cache
 ---> e632b86526d4
Step 3/10 : RUN apt-get update     && apt-get install --yes --force-yes --no-install-recommends         sudo         software-properties-common         xorg         xserver-xorg         xfce4         gnome-themes-standard         gtk2-engines-pixbuf         file-roller         evince         gpicview         leafpad         xfce4-whiskermenu-plugin         ttf-ubuntu-font-family         dbus-x11         vnc4server         vim         xfce4-terminal         xrdp         xorgxrdp
 ---> Using cache
 ---> f78637311607
Step 4/10 : RUN adduser ubuntu
 ---> Using cache
 ---> 751c49e19cb1
Step 5/10 : RUN echo "ubuntu:ubuntu" | chpasswd
 ---> Using cache
 ---> 4d3bffb5b8fd
Step 6/10 : RUN echo "ubuntu ALL=(ALL:ALL) ALL" >> /etc/sudoers
 ---> Using cache
 ---> 5ca80c2c9b61
Step 7/10 : RUN sed -i 's/3389/2022/' /etc/xrdp/xrdp.ini
 ---> Using cache
 ---> 30d9aad27755
Step 8/10 : RUN apt-get install --yes --force-yes --no-install-recommends         xubuntu-desktop     && apt-get clean     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 ---> Using cache
 ---> 5cf2020e84b2
Step 9/10 : ADD entrypoint.sh /entrypoint.sh
 ---> Using cache
 ---> fd133f80adbd
Step 10/10 : ENTRYPOINT /entrypoint.sh
 ---> Using cache
 ---> eceb9609c6af
Successfully built eceb9609c6af
Successfully tagged ubuntu:latest
65021f1f32ccc3bbfc6ca40b8d09b07665d904b2cbd4d1ea67f9eef826611a14
second
root@akim-virtual-machine:/home/akim/example#



3. 도커 살펴보기 (이미지, 컨테이너 관련 명령어)


history


  • 이미지 이름 대신 ID를 사용할 수도 있다.

  • 형식
docker history <이미지 이름>:<태그>
  • 예시

    • docker history hello:0.1



cp


  • 호스트 경로에 컨테이너 내부 파일 nginx.conf 파일이 복사된다.

  • 형식
docker cp <컨테이너 이름>:<경로> <호스트 경로>
  • 예시

    • docker cp hello:/etc/nginx/nginx.conf ./



commit


  • 컨테이너의 변경 사항을 이미지 파일로 생성한다.

  • 형식
docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그>
  • 옵션

    • -a 옵션은 커밋한 사용자 정보

    • -m 옵션은 로그 메시지를 설정한다.

  • 예시

    • docker commit -a "zini <zinirun.blogspot.com>" -m "add hello.txt" hello hello:0.2

    • hello 컨테이너를 hello:0.2 이미지로 생성하게 된다.



diff


  • 변경된 파일 목록을 출력

  • 형식
docker diff <컨테이너 이름> or <컨테이너 ID>
  • 예시

ubuntu@zini-01:/home/zini/doc_ex$ docker diff hello
C /run
A /run/xrdp
A /run/xrdp/sockdir
A /run/dbus
A /run/dbus/pid
A /run/dbus/system_bus_socket
C /tmp
A /tmp/.X11-unix
C /var
C /var/log
C /var/log/xrdp.log
C /var/log/xrdp-sesman.log
  • A는 추가된 파일, C는 변경된 파일, D는 삭제된 파일이다.



inspect


  • 이미지나 컨테이너의 세부 정보를 출력한다.

  • ID를 사용해도 가능


  • 형식
docker inspect <이미지 or 컨테이너 이름>
  • 예시

    • docker inspect hello



4. DockerHub 사용하기


Docker Login


  • docker 계정으로 docker hub에 로그인 한다.
docker login



로컬에 이미지 저장하기


  • Docker 레지스트리 서버도 Docker Hub에 이미지로 제공된다.

  • 먼저 레지스트리 이미지를 받는다.

    • registry:latest 이미지를 컨테이너로 실행한다.
docker pull registry:latest
  • 다음 명령어를 실행하면 이미지 파일이 호스트의 /tmp/registry 디렉터리에 저장된다.
docker run -d -p 5000:5000 hello-repository \
    -v /tmp/registry:/tmp/registry \
    registry:latest

  • run 명령어

    • 컨테이너 실행

    • 옵션

      • i: 사용자가 입출력 할 수 있는 상태

      • t: 가상 터미널 환경을 에뮬레이션 하겠다.

      • d: 컨테이너를 일반 프로세스가 아닌 데몬프로세스로 실행하여 프로세스가 끝나도 유지되도록 한다.

      • e: 환경변수 설정, 옵션을 사용하면 Dockerfile의 ENV 설정도 덮어써지게 된다.

      • p: 호스트 컴퓨터에서 설정한 포트

      • h: 컨테이너의 호스트 이름을 설정한다.

      • --link: Docker 컨테이너끼리 연결할 때는 docker run 명령에서 --link 옵션을 사용

      • --rm: 컨테이너를 일회성으로 실행할 때 주로 쓰이는데, 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거해준다.


docker run [옵션] [이미지이름 or 이미지ID] [실행할 파일] -v <host path> : <mounting point path in container>
  • -v 옵션을 사용해 docker run할 때 이미지만 변경하고 같은 볼륨을 마운트 하는 식으로 사용한다. 출처



profile
For the sake of someone who studies computer science

0개의 댓글