[Docker] 2. docker 기본 사용법
지난번에는 도커가 무엇인지, 왜 사용하는지에 대해 배워보았다. 이번 시간에는 도커에 대한 기초 사용법을 알아보겠다.
지난시간을 요약해보자면 Dockerfile을 build 하여 Docker Image를 만들 수 있고, Docker Image를 run 하여 Docker Container를 만들 수 있다. 이렇게 생성된 Container는 서로 독립적으로 만들 수 있고, 이미지가 존재하는 한 여러 번 만들 수 있다는 것이 장점이었다.
여기서 Dockerfile에 기본 이미지를 생성할 수 있는 일련의 과정들을 적으면 된다. terminal에서 작동시키는 방법을 먼저 설명하고 그 것을 Dockerfile에 어떻게 기술하는지 설명하겠다.
1. 도커 설치하기
만약 도커가 설치되어 있지 않다면 도커를 먼저 설치해야한다.
설치에서는 크게 어려운 것이 없다. 위 사이트에 접속하여 운영체제 버전에 올바른 파일을 설치해주면 된다. 나는 윈도우에 설치했기 때문에 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 |
---|