인프런 subicura님의 도커 기초 강의를 듣고 정리한 내용임을 미리 밝혀둡니다.
도커는 프로세스를 독립된 컨테이너에서 실행한다. docker run 명령어가 실행되면 컨테이너 프로세스는 독립된 환경에서 그것만의 파일 시스템, 네트워킹, 그리고 host로부터 분리된 프로세스 구조를 가진다.
기본 형태
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run 명령어는 아래 네종류의 옵션을 가진다.
- detacted or foreground running
- container identification
- network settings
- runtime constraints on CPU and memory
각 옵션 종류에 대해서 알아보자.
Detacted or foreground running
도커 컨테이너를 실행할 때 background 모드로 실행할지, foreground 모드로 실행할지 결정해야한다.
Detached (-d)
-d 옵션을 통해 detached 모드로 실행한다. root 프로세스가 종료되면 해당 프로세스도 종료된다.
$ docker run -p 3308:3308 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mariadb:10.9
2022-11-10 04:33:21+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.9.3+maria~ubu2204 started.
2022-11-10 04:33:21+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-11-10 04:33:21+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.9.3+maria~ubu2204 started.
2022-11-10 04:33:21+00:00 [Note] [Entrypoint]: Initializing database files
2022-11-10 4:33:21 0 [Warning] mariadbd: io_uring_queue_init() failed with ENOMEM: try larger memory locked limit, ulimit -l, or https://mariadb.com/kb/en/systemd/#configuring-limitmemlock under systemd (262144 bytes required)
2022-11-10 4:33:21 0 [Warning] InnoDB: liburing disabled: falling back to innodb_use_native_aio=OFF
...
mariadb를 background 모드로 실행하지 않는 명령어를 쳐보면 위와 같이 로그가 쭉쭉 뜬다.
Foreground
컨테이너와 동적으로 상호작용하고 싶으면 foreground 모드를 사용한다. 자주 사용하는 옵션은 아래와 같다.
- -t : pseudo-tty을 할당함
- -i : STDIN을 열어둠
공식 문서에서는 컨테이너 내부에서 터미널을 통해 명령어를 날리고 싶으면 -i -t를 같이 쓰라고 말한다. 같이쓰면 -it로 쓴다.
For interactive processes (like a shell), you must use -i -t together in order to allocate a tty for the container process.
$ docker run -it ubuntu:20.04
root@961d3eccb128:/ ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
Container identification
컨테이너의 이름을 짓는다. 운영자는 컨테이너를 크게 세가지 방법으로 알아낼 수 있다.
- UUID long identifier: "f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778"
- UUID short identifier: "f78375b1c487"
- Name: "evil_ptolemy"
$ docker run -it --name TAG ubuntu:20.04
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cea92099315 ubuntu:20.04 "bash" 4 seconds ago Up 3 seconds TAG
$ docker stop
$ docker kill
TAG라는 이름으로 이미지라 올라가 있는 것을 확인할 수 있다. 이름을 이용해서 나중에 컨테이너를 중지하거나 이미지를 삭제하고 싶으면 다시 이름을 사용하면 될 것 같다.
Runtime constraints on CPU and memory
컨테이너를 실행할 때 퍼포먼스 파라미터, 메모리, cpu 등을 설정할 수 있다.
- -m, --memory= : 메모리 제한
- --cpus=0.000 : CPU의 수 0.000은 제한이 없다는 뜻.
- 기타 다른 설정은 공식 문서를 참고하자
$ docker run -it -m 500M --cpus 2 --memory-reservation 200M ubuntu:20.04 /bin/bash
기타 명령어
Clean up (--rm)
기본값으로 컨테이너의 파일 시스템은 컨테이너가 종료된 이후에도 계속 존재한다. 이는 기본값으로 모든 데이터를 다 얻을 수 있게 하므로 디버깅을 쉽게 해준다. 하지만 짧은 기간 동안 foreground 프로세스를 실행한다면, 이 컨테이너의 파일 시스템은 계속 쌓이게 될 것이다. 이런 상황에서 --rm을 통해 컨테이너가 종료되면 자동으로 파일 시스템을 없앨 수 있다.
-p
호스트와 컨테이너 간의 포트(port) 배포(publish)/바인드(bind)를 위해서 사용된다. 호스트 컴퓨터에서 컨테이너에서 리스닝하고 있는 포트로 접속할 수 있도록 설정한다.
-v
호스트와 컨테이너의 디렉토리를 연결하는 옵션이다.
도커 컨테이너가 삭제되면 기본적으로 컨테이너가 가진 정보는 모두 날라간다. 중요한 정보는 남겨둘 필요가 있는데, -v 옵션을 통해 컨테이너와 호스트 디렉토리를 연결하고 컨테이너의 정보를 호스트 디렉토리에도 남김으로써 중요한 정보를 보존하는 것이다.
$ docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--network=app-network \
--name mysql \
-v /Users/shinbo/personal/docker/mysql:/var/lib/mysql \
mariadb:10.9
-e
이미지로부터 컨테이너를 생성할 때, 환경변수를 설정한다. --env-file ENV 옵션을 통해 환경 변수 파일 자체를 통재로 넣을 수도 있고 개별 옵션으로 -e를 이용해서도 넣을 수 있다. 아래는 파이썬 이미지의 FOO 환경변수에 bar을 넣어서 환경 변수 값을 출력한 예시이다.
$ docker run -e FOO=bar python:3.8-alpine env
Unable to find image 'python:3.8-alpine' locally
3.8-alpine: Pulling from library/python
9b18e9b68314: Already exists
59f6633159d7: Pull complete
12dc4a2a3325: Pull complete
5127d46fae82: Pull complete
225cd9edda42: Pull complete
Digest: sha256:41ea2b8caa7fa3740fd0f0a1cad0c26961707a7e3c7cc49559f54b277ef86fb3
Status: Downloaded newer image for python:3.8-alpine
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=babfb97869c3
FOO=bar
LANG=C.UTF-8
GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568
PYTHON_VERSION=3.8.15
PYTHON_PIP_VERSION=22.0.4
PYTHON_SETUPTOOLS_VERSION=57.5.0
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/6d265be7a6b5bc4e9c5c07646aee0bf0394be03d/public/get-pip.py
PYTHON_GET_PIP_SHA256=36c6f6214694ef64cc70f4127ac0ccec668408a93825359d998fb31d24968d67
'Devops > docker' 카테고리의 다른 글
[Docker] #5 docker-compose (0) | 2022.11.10 |
---|---|
[Docker] #4 기본 명령어 (0) | 2022.11.10 |
[Docker] #2 Docker vs Virtual Machine (0) | 2022.11.09 |
[Docker] #1 도커란 무엇인가 (0) | 2022.11.09 |
댓글