[Docker] 2. docker 기본 사용법

2023. 1. 4. 01:26

지난번에는 도커가 무엇인지, 왜 사용하는지에 대해 배워보았다. 이번 시간에는 도커에 대한 기초 사용법을 알아보겠다. 

지난시간을 요약해보자면 Dockerfile을 build 하여 Docker Image를 만들 수 있고, Docker Image를 run 하여 Docker Container를 만들 수 있다. 이렇게 생성된 Container는 서로 독립적으로 만들 수 있고, 이미지가 존재하는 한 여러 번 만들 수 있다는 것이 장점이었다. 

여기서 Dockerfile에 기본 이미지를 생성할 수 있는 일련의 과정들을 적으면 된다. terminal에서 작동시키는 방법을 먼저 설명하고 그 것을 Dockerfile에 어떻게 기술하는지 설명하겠다. 

 

1. 도커 설치하기

만약 도커가 설치되어 있지 않다면 도커를 먼저 설치해야한다. 

https://www.docker.com/

 

Docker: Accelerated, Containerized Application Development

Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

설치에서는 크게 어려운 것이 없다. 위 사이트에 접속하여 운영체제 버전에 올바른 파일을 설치해주면 된다. 나는 윈도우에 설치했기 때문에 exe 파일을 실행했다. 

설치 완료 후 열면 이런 docker desktop이 실행된다. 나중에 container 등을 만들면 여기서 한 눈에 보고 관리할 수 있다. 

일단 나는 docker를 visual code 환경에서 실행하기로 했다. 그냥 가장 익숙하기도 하고, 추가 플러그인 중 docker 관리가 있어서 한눈에 보기 쉽다.

그리고 자료도 visual code 기준으로 설명 된 것이 많아서 단순히 선택한 것이니 익숙해지면 다른 환경에서도 자유롭게 사용할 수 있을 것이다. 

 

2. dockerfile 만들기

이번 글에서는 ubuntu 환경에다가 python http.server 를 이용해 localhost에 index.html을 올리는 간단한 과정을 dockerfile로 만들어 볼 것이다. dockerfile 없이 terminal로 처리하고 그것을 dockerfile에 적는 과정으로 설명할 예정이다. 

 

https://www.youtube.com/watch?v=0kQC19w0gTI 

실습과정은 위 영상을 따라 했으니 자세한 설명이 필요하다면 위의 영상 시청을 부탁한다.

 

(1) ubuntu 불러오기

가장 먼저 할 일은 ubuntu를 run 하는 것이다. ubuntu는 자체 image를 제공하기 때문에 따로 처리할 필요 없이 우리가 run 시켜주면 된다.

  • terminal 
docker run --name web-server -it ubuntu:20.04

여기서 --name 은 container의 이름을 의미하는 것이다. 이미 있는 container의 이름은 사용할 수 없으며, 컨테이너의 이름만 다르다면 같은 이미지로 여러개 만들 수 있다. -it option은 컨테이너를 종료하지 않고 터미널의 입력을 계속해서 컨테이너로 전해주기 위해서 사용한다. 컨테이너의 shell 이나 CLI 도구를 사용할 때 유용하게 사용할 수 있다. (아래에 옵션에 관해 정리해 두었다.)

실행하면  진짜 우분투 환경이 터미널에서 실행된다.

+) run의 옵션은 아래와 같다.

더보기

Options:
      --add-host list                  Add a custom host-to-IP mapping
                                       (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight),
                                       between 10 and 1000, or 0 to
                                       disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device
                                       weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the
                                       container
      --cgroupns string                Cgroup namespace to use
                                       (host|private)
                                       'host':    Run the container in
                                       the Docker host's cgroup namespace
                                       'private': Run the container in
                                       its own private cgroup namespace
                                       '':        Use the cgroup
                                       namespace as configured by the
                                                  default-cgroupns-mode
                                       option on the daemon (default)
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair
                                       Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair
                                       Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in
                                       microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in
                                       microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution
                                       (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution
                                       (0-3, 0,1)
  -d, --detach                         Run container in background and
                                       print container ID
      --detach-keys string             Override the key sequence for
                                       detaching a container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed
                                       devices list
      --device-read-bps list           Limit read rate (bytes per second)
                                       from a device (default [])
      --device-read-iops list          Limit read rate (IO per second)
                                       from a device (default [])
      --device-write-bps list          Limit write rate (bytes per
                                       second) to a device (default [])
      --device-write-iops list         Limit write rate (IO per second)
                                       to a device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --domainname string              Container NIS domain name
      --entrypoint string              Overwrite the default ENTRYPOINT
                                       of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --gpus gpu-request               GPU devices to add to the
                                       container ('all' to pass all GPUs)
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check
                                       (ms|s|m|h) (default 0s)
      --health-retries int             Consecutive failures needed to
                                       report unhealthy
      --health-start-period duration   Start period for the container to
                                       initialize before starting
                                       health-retries countdown
                                       (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to
                                       run (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container
                                       that forwards signals and reaps
                                       processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local
                                       addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g.,
                                       92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus
                                       swap: '-1' to enable unlimited swap
      --memory-swappiness int          Tune container memory swappiness
                                       (0 to 100) (default -1)
      --mount mount                    Attach a filesystem mount to the
                                       container
      --name string                    Assign a name to the container
      --network network                Connect a container to a network
      --network-alias list             Add network-scoped alias for the
                                       container
      --no-healthcheck                 Disable any container-specified
                                       HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000
                                       to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1
                                       for unlimited)
      --platform string                Set platform if server is
                                       multi-platform capable
      --privileged                     Give extended privileges to this
                                       container
  -p, --publish list                   Publish a container's port(s) to
                                       the host
  -P, --publish-all                    Publish all exposed ports to
                                       random ports
      --pull string                    Pull image before running
                                       ("always"|"missing"|"never")
                                       (default "missing")
      --read-only                      Mount the container's root
                                       filesystem as read only
      --restart string                 Restart policy to apply when a
                                       container exits (default "no")
      --rm                             Automatically remove the container
                                       when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the
                                       process (default true)
      --stop-signal string             Signal to stop a container
                                       (default "15")
      --stop-timeout int               Timeout (in seconds) to stop a
                                       container
      --storage-opt list               Storage driver options for the
                                       container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format:
                                       <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the
                                       container
      --volumes-from list              Mount volumes from the specified
                                       container(s)
  -w, --workdir string                 Working directory inside the container

이 중 자주 쓰인 것을 추려 보았다.

option 설명
-d 백그라운드에서 실행한다.
-p host와 컨테이너 간의 포워딩을 해준다.
-name 컨테이너 이름을 설정할 수 있다.
-it 터미널 입력을 위한 옵션이다.(i, t를 함께 사용한 것)
-rm 프로세스 종료시 컨테이너를 자동적으로 종료한다.
-link 컨테이너를 연결해준다.
-v 호스트와 컨테이너를 마운트 해준다.
-e 환경변수를 추가해줄 수 있다. 

 

  • Dockerfile

위에서 한 ubuntu run 과정을 Dockerfile에서 실행해보자. 우선, Dockerfile이라는 이름의 파일을 생성한다. 그리고 FROM 명령어를 이용해 image를 불러온다.

FROM ubuntu:20.04

 

(2) ubuntu에 python3 설치하기

일반적으로 처음 실행된 우분투에는 python이 없어 설치해주어야한다.

  • terminal

우분투 환경에서 파이썬을 설치하는 방법은 아래와 같다. 

apt update
apt-get install python3

그럼 update가 진행된 뒤 python3가 설치되는 모습을 볼 수 있다. 

 

  • dockerfile

dockerfile에서 terminal에 input 값을 넣기 위한 명령어는 RUN이다. 그래서 아래와 같이 Dockerfile에 입력해줄 수 있다. 

RUN apt update
RUN apt-get install -y python3

두번째 코드에 있는 -y 옵션은 실행할 때 사용자에게 설치여부에 묻는 과정을 자동으로 y를 입력해 넘어갈 수 있도록 도와주는 것이다. 위도 문제 없는 코드이나, 보통 여러개의 RUN 코드가 배치 될 때는 && 을 이용해 한 줄에 표현한다. 

RUN apt update && apt-get install -y python3

 

(3) /var/www/html 폴더 생성한 뒤 해당 폴더로 이동하기

  • terminal

뭐.. 굉장히 간단한 작업이다. 

mkdir -p /var/www/html
cd /var/www/html

-p 옵션은 중간 폴더가 없어도 모두 만들도록 하기 위해서이다. 

  • dockerfile
WORKDIR /var/www/html

WORKDIR로 원하는 디렉토리로 실행 시점을 옮길 수 있다. 이때, 없는 곳이면 새로 생성까지 하니 mkdir과 cd의 역할을 동시에 한다.

 

(4) index.html 파일 생성 후 python.http 실행하기

  • terminal

간단하게 테스트만 하는 것이니 그냥 echo 기능으로 index.html을 만들겠다. 뭐, 다른 html 파일이 있다면 그걸 사용해도 좋다.

echo "Hello <strong>Docker</strong>" > index.html

그 뒤 http.server를 실행해준다. 

python3 -m http.server

 

근데 나는 무슨 이유인지 저기 주소에 들어가도.. 해당 내용이 뜨지 않는다. 이 부분은 조금 더 공부하면서 알아보아야 겠다. 아니면 나중에 선배님들께 여쭈어 보아야겠다. 

  • dockerfile

가장 간단한 방법은 run을 이용해 실행하는 방법이다. 

RUN echo "Hello <strong>Docker</strong>" > index.html

이 방법 말고 더 편한 방법이 있다. Dockerfile이 있는 현재 폴더에 index.html을 만들어 두고 이를 image로 카피하는 형태로 실행할 수 있으면 개발이 훨씬 용이할 것이다. 그러기 위해서는 host의 index.html을 현재 디렉토리에 복사한 뒤 파이썬 서버를 실행시키면 된다.

CMD ["python3", "-u", "-m", "http.server" ]

 

이후 만들어진 dockerfile을 build하고 run 해주면 같은 손으로 하던 작업이 container로 묶에 자동화되는 모습을 확인할 수 있다. 

docker guild -t web-server-build .;
docker rm --force web-server;
docker run -p 8888:8000 --name web-server web-server-build;

 

 

오늘은 간단한 예제를 통해 도커의 사용법을 알아보았다. 한번만 제대로 익혀두면 굉장히 유용하게 사용할 수 있는 것 중 하나라는 생각이 들었다. 그래서 지금 조금 와닿지 않고 어렵게 느껴져도 여러번 연습해서 꼭 익혀나가야겠다. 아마 앞으로 올라오는 docker 관련 글은 학습 위주가 아닌 프로젝트 실습 관련 시행착오와 같은 이야기지 않을까 싶다.

'Web > Docker' 카테고리의 다른 글

[Docker] 1. Docker란?  (0) 2023.01.03

BELATED ARTICLES

more