Docker - innovationacademy-kr/slabs-munetic GitHub Wiki

👀 Basics

도커는 컨테이너 기반의 가상화 플랫폼입니다. 이는 프로세스들을 분리시켜 하나의 격리된 OS와 파일 시스템 상에서 실행한다는 것 입니다. 즉, 서로 다른 OS와 환경에서도 docker로 컨테이너를 사용하면 같은 환경이 보장됩니다. 컨테이너 내부에는 일반 OS와 마찬가지로 여러 프로세스들이 동작할 수 있습니다.

도커를 이용하는 이유 중 하나는 서로 다른 개발 환경에서도 프로세스에 동일한 환경을 제공할 수 있다는 것입니다. 또 하나의 이유는 프로세스간 상호작용을 차단할 수 있다는 것입니다. 예를 들자면 일반적으로는 동시에 사용할 수 없거나 그러면 안되는 프로세스도 도커를 사용하면 동시 사용이 가능하게 됩니다.

🪣 컨테이너

컨테이너는 foreground에 실행되어있는 프로세스가 없으면 작동을 중지합니다. 처음 도커를 사용하는 사람이 가장 주의할 점입니다. 컨테이너를 일단 실행시킨 후 컨테이너 내부에 접속해 명령어를 실행하려는 경우나 background에서 실행되는 프로그램을 작동시키려는 경우 모두 컨테이너가 시작하자마자 정지하기 때문에 적절한 시작 명령어(entrypoint와 cmd 참고)로 컨테이너를 시작시켜야합니다.
컨테이너가 삭제되는 경우, 도커 볼륨을 통해 저장되지 않은 모든 데이터는 삭제됩니다. 간혹 한 컨테이너에 여러 서비스를 실행시키는 경우가 있는데, 이는 일반적인 서비스의 사용법은 아니지만 일회성 작업을 하기 위해 사용될 수 있습니다. 서비스를 유지시킬 때 하나의 컨테이너 안에는 하나의 서비스가 pid 1로 실행되는 것이 이상적입니다.

🎆 이미지

컨테이너는 이미지를 기반으로 실행됩니다. 단일 이미지에는 보통 단일 서비스가 설치되어서 배포됩니다. 컨테이너는 메모리 상의 프로세스고 이미지는 디스크의 파일이므로 일반적인 프로세스와 실행파일의 관계와 비슷하다고 생각하면 되겠습니다. 이런 이미지에는 OS 가상화에 필요한 모든 정보와 그밖에 필요한 서비스의 정보와 설정들이 들어있습니다.

이미지는 다양한 linux OS를 기반으로 만들어집니다. 아무것도 설치되지 않은 각 OS의 이미지를 베이스 이미지라고 합니다. 이러한 베이스 이미지를 통해 원하는 서비스가 설치된 새로운 이미지를 만들 수 있습니다. 가장 흔히 사용되는 방법은 Dockerfile을 통해 만드는 것으로 베이스 이미지에서 Dockerfile에 기술된 단계를 하나 하나 거쳐가면서 목표된 이미지까지 빌드를 하는 것입니다. 다른 방법은 docker commit 명령어를 사용하여 실행되어있는 컨테이너를 이미지화하는 것인데, 이 방법은 디버그 용도로 사용됩니다.

🚛 볼륨

컨테이너는 기본적으로 이미지 내부에 저장되어있는 파일들 기반으로 내부 저장소를 만들어 사용합니다. 그러나 컨테이너에 저장된 파일을 쉽게 교체하고 싶은 경우, 컨테이너를 삭제해도 데이터를 남기고 싶은 경우 볼륨을 이용할 수 있습니다. 볼륨은 호스트의 파일 시스템에 저장된 디렉토리를 컨테이너에서 이용하는 방식으로 이루어집니다.

🛰 네트워크

컨테이너는 호스트의 포트와는 별개로 자기 자신만의 ip와 포트를 가집니다. 이는 모든 컨테이너에 적용됩니다. 이러한 ip와 포트는 기본적으로 외부로 노출되지 않습니다. 컨테이너간에는 서로 통신을 하기 위하여 도커 네트워크라는 것을 사용합니다. 도커 네트워크에는 컨테이너의 이름이 DNS에 등록되어있어 편리하게 서로 통신할 수 있습니다. 컨테이너는 여러 개의 네트워크를 가질 수 있는데, 이때 서로 공유하는 네트워크가 없는 컨테이너끼리는 통신이 불가능합니다.

🧩 도커의 구성 요소와 명령어

각 명령어 소제목은 도커 문서로 연결되어있습니다.

  • id
    도커를 구성하는 객체들 대부분, 그러니까 이미지, 컨테이너, 볼륨, 네트워크 등은 랜덤으로 생성되거나 지정된 일정한 길이의 id를 갖습니다. 각 객체가 갖는 고유한 이름으로 객체에 접근할 수도 있으나, 아이디를 통해서 접근할 수도 있습니다. 이때, 아이디 전부가 필요한 것은 아니고, 현재 도커 내부에서 구분되기 위해 최소길이로 앞부분을 입력하면 됩니다. 예를 들어서 현재 도커 상에 1로 시작하는 컨테이너가 하나 밖에 없다면 한 글자만으로도 컨테이너에 접근할 수 있습니다.

🎆 이미지

Docker의 이미지 배포는 도커 허브를 이용해서 이루어집니다. github의 도커 버전이라고 생각하시면 됩니다. 이미지의 id는 생성시 정해지며, 업로드나 다운로드 되어도 변하지 않습니다. 도커 허브에서 필요한 이미지를 다운받기 위해서는 docker pull 명령어를 사용하여야 합니다.

$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]

pull 명령어에 반드시 명시되어야하는 부분은 이미지의 이름인 NAME입니다. 베이스 이미지인 경우에는 OS의 이름이, 서비스 이미지인 경우에는 서비스의 이름이 들어갑니다.
[TAG|@DIGEST]는 해당 이미지의 버전을 뜻합니다. 같은 OS나 서비스도 버전에 따라 이미지가 다를 수 있습니다. 명시되지 않은 경우 가장 최신의 안정화 버전을 뜻하는 태그인 :latest가 선택됩니다. latest 태그가 최신의 안정화 버전을 따라서 바뀌듯이 태그가 뜻하는 이미지는 바뀔 수 있습니다. 이미지는 생성될 때마다 정해지는 sha256 값을 통해서 변하지 않는 식별자가 만들어집니다. [@DIGEST]의 경우는 이 식별자를 사용하여 같은 이미지를 받아오는 것을 보장할 수 있습니다. 다만 대부분의 이미지는 latest, 혹은 lts가 붙지 않은 태그의 경우 거의 변경되지 않기 때문에 태그만 사용하는 경우가 많습니다.

TAG는 한 이미지에 여러 개가 존재할 수 있습니다. 이때, 이 이미지들의 아이디는 모두 같습니다.
프로젝트에 latest 태그를 사용하는 것은 추천하지 않습니다. latest 이미지는 내용이 변경될 수 있기 때문에, 현재 latest에 해당하는 버전 이름의 태그를 사용하는 것이 좋습니다.
[OPTIONS]에는 여러 가지가 있습니다. --quite, -q 옵션은 이미지를 받아올 때 나오는 메시지를 출력하지 않게 하는 옵션입니다. 기타 옵션에 대해서는 공식 문서를 참조해주세요.

$ docker images [OPTIONS] [REPOSITORY[:TAG]]
$ docker image ls [OPTIONS] [REPOSITORY[:TAG]]

두 명령어는 동일합니다. 이 명령어를 통해서 받아온 이미지의 목록을 볼 수 있습니다. 옵션을 통해 여러 방식으로 이미지를 표시할 수 있습니다.

$ docker rmi [OPTIONS] IMAGE [IMAGE...]
$ docker image rm [OPTIONS] IMAGE [IMAGE...]

docker rmi는 이미지를 제거하는 명령어입니다.
현재 돌아가고 있는 컨테이너의 이미지는 제거할 수 없습니다. 만약 제거하고싶다면 -f, --force 옵션을 써야합니다.

  • docker image 그 밖의 이미지와 관련된 명령어는 docker image의 하위 명령어의 목록으로 확인할 수 있습니다.

🪣 컨테이너

$ docker ps [OPTIONS]

컨테이너들의 목록을 볼 수 있는 명령어입니다. 각 컨테이너들이 프로세스이기 때문에 ps 명령어를 따서 지어졌습니다.
이 명령어는 기본적으로 현재 작동중인 컨테이너의 정보들을 보여줍니다. -a옵션을 통해 멈춰있는 컨테이너까지도 볼 수 있습니다. 그 밖의 옵션은 공식 문서를 참조해주세요. 보여주는 정보들은 CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES입니다.

  • CONTAINER ID는 컨테이너가 생성될 때 부여된 고유 ID입니다.

  • IMAGE는 컨테이너를 돌리기 위해 사용된 이미지입니다.

  • COMMAND는 컨테이너를 생성할 때 사용된 커맨드입니다. docker run 명령어와 DockerfileCMD에서 자세히 설명할 것입니다.

  • STATUS는 컨테이너의 상태를 나타냅니다. 작동 중이라면 컨테이너가 시작되거나 재시작되고 나서 현재까지의 시간을 표시합니다.

  • PORTS는 컨테이너에서 호스트(도커를 작동중인 컴퓨터)에 노출된 포트를 표시합니다. 컨테이너는 앞서 말했듯 호스트와 별개의 포트를 가집니다. 이 포트는 이미지 빌드 시나 컨테이너 실행 시에 호스트의 포트를 지정하여 마운트할 수 있습니다. 그런 경우 localhost 또는 호스트의 ip주소와 포트 번호를 통해 컨테이너의 해당 포트로 연결 가능합니다.

  • NAMES는 컨테이너를 식별하는 이름입니다. 이름은 여러 개일 수 있습니다. 이름은 도커에서 컨테이너를 식별할 때, 도커 네트워크의 DNS에 사용됩니다.

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • docker run 명령어는 이미지에서 컨테이너를 생성하는 도커의 핵심적인 명령어입니다. 다른 명령어와 커맨드에 비해 굉장히 많은 옵션이 있습니다. 자주 쓰는 옵션만 나열해보겠습니다.

  • --attach ARG, -a: -d 옵션과 같이 사용할 수 없습니다. 명령어를 실행한 터미널을 컨테이너의 표준입력이나 표준출력, 표준오류에 연결시킵니다. [arg]로 stdin, stdout, stderr를 가질 수 있습니다. 사용하지 않을 경우 기본적으로 표준 출력과 표준 에러가 터미널로 전달됩니다.

  • --detach, -d: -a 옵션과 같이 사용할 수 없습니다. 컨테이너를 백그라운드에서 실행시킵니다. 컨테이너의 표준출력이나 표준오류는 대시보드나 docker logs 명령어를 통해 확인할 수 있습니다.

  • --entrypoint ARG: 이미지의 entrypoint를 덮어씌웁니다. entrypoint는 이미지가 컨테이너로 실행될 때 실행되는 명령어를 말합니다. [COMMAND]는 entrypoint의 인자로 전달됩니다.

  • --env KEY=VALUE, -e: 컨테이너의 환경변수를 설정합니다.

  • --env-file: 환경변수 목록이 들어있는 env-file을 설정합니다. 일반적으로 .env입니다.

  • --expose HOST_PORT:CONTAINER_PORT, -p: 컨테이너의 포트를 노출시킵니다. -p host-port-number:container-port-number과 같은 형태로 사용합니다.

  • --interactive, -i: 컨테이너의 stdin을 열어놓습니다. -d 명령어와 같이 사용할 수도 있으나 거의 사용되지 않습니다. 보통 -t옵션과 같이 사용합니다.

  • --name NAME: 컨테이너의 이름을 지정합니다. 지정하지 않는 경우 임의의 단어 조합으로 만들어집니다.

  • --network NETWORK: 선언된 도커 네트워크에 연결합니다.

  • --restart POLICY: 도커가 종료되었을 때 재시작 여부를 결정합니다. on-failure[:max-retries], unless-stopped, always, no의 POLICY가 있고, 기본값은 no입니다.

  • --rm: 컨테이너가 종료될 경우 컨테이너를 삭제합니다.

  • --tty, -t: pseudo-tty를 할당합니다. 컨테이너의 stdin이 열려있다면 터미널을 통해 컨테이너에 명령어를 써넣을 수 있습니다. 주로 -i 옵션과 함께 사용됩니다.

  • --volume VOLUME_DECLARE..., -v: 컨테이너의 볼륨을 설정합니다. docker volume 파트에서 자세히 다루겠습니다.

  • --volumes-from CONTAINER: 다른 컨테이너가 사용 중인 볼륨을 현재 컨테이너에 마운트합니다.

  • --workdir DIR, -w: 컨테이너 내부에서 entrypoint나 cmd가 실행될 디렉토리를 지정해줍니다.

  • 🧑‍🔧 docker build

$ docker build [OPTIONS] PATH | URL | -

도커파일과 컨텍스트를 통해 이미지를 빌드하는 명령어입니다. Dockerfile 항목에서 자세히 알아보겠습니다.

작동중인 컨테이너 내부에서 명령어를 실행시키는 명렁어입니다.

$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

옵션은 여러 가지가 있는데, 모두 docker run에 있는 옵션들입니다. --detach, -d 옵션, --env, -e 옵션, --env-file 옵션, --interactive, -i 옵션, --tty, -t 옵션, --workdir, -w 옵션 등이 있습니다. 자세한 설명은 docker run 항목이나 공식 문서를 봐주세요.

$ docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
$ docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

docker container cp와 docker cp 명령어는 컨테이너 내부에서 호스트로, 또는 그 반대로 데이터를 이동시키는 명령어입니다. 도커 내부 프로그램을 디버깅하거나 로그 파일을 꺼낼 때 유용한 명령어입니다.
docker container cp명령은 CONTAINER:SRC_PATH경로의 폴더/파일을 DEST_PATH, 혹은 stdout / tar archive 파일로 복사합니다. docker cp명령은 반대로 컨테이너 밖의 SRC_PATH경로, 혹은 stdin / tar archive 파일을 CONTAINER:DEST_PATH경로로 복사하게 됩니다. --follow-link, -L를 사용하면 SRC_PATH의 심볼릭 링크를 사용하게 됩니다.

$ docker logs [OPTIONS] CONTAINER

컨테이너 내부 프로그램의 로그를 터미널에 띄웁니다. 기본값은 컨테이너를 시작할 때부터 현재까지이며, 옵션으로 조절할 수 있습니다.
--follow, -f옵션은 컨테이너의 stdout과 stderr를 터미널에 실시간으로 출력합니다. --tail, -n 옵션은 하나의 양수를 인수로 가지며, 마지막 n개의 로그를 출력합니다.

$ docker rm [OPTIONS] CONTAINER [CONTAINER...]

컨테이너를 삭제하는 명령어입니다. 기본적으로 정지된 컨테이너만 삭제할 수 있지만 --force, -f옵션을 사용하면 현재 가동 중인 컨테이너도 중지 후 삭제할 수 있습니다. --volumes, -v 명령어를 통해 지워질 컨테이너에 붙어있는 익명 볼륨을 한 번에 삭제할 수 있습니다.

🚛 볼륨

도커 볼륨의 사용 방식에는 크게 세 가지 방식이 있습니다. 첫 번째는 도커 볼륨, 두 번째는 바인드 마운트, 세 번째는 볼륨 컨테이너입니다.
도커 볼륨은 도커 내부의 경로를 명시하는 것으로 선언할 수 있습니다. 이때, 이 경로는 단일 파일이 될 수도 있습니다. docker run 명령어 실행 시에 -v 뒤에 컨테이너 내부의 절대 경로를 붙여주는 것으로 생성할 수 있습니다. 이때, 도커는 식별 가능한 임의의 이름을 볼륨에 지정해줍니다. 이 이름은 docker volume 명령어로 확인할 수 있습니다. 이름을 직접 지정해줄 수도 있습니다. 이때는 -v NAME:CONTAINER_PATH 형식으로 옵션을 선언하면 됩니다.
이 방식으로 볼륨을 선언하게 되면, 도커는 호스트의 파일 시스템 어딘가에 디렉토리를 생성하여 컨테이너가 지정된 폴더를 사용할 때 메모리 대신에 해당 디스크 공간을 대신 사용할 수 있도록 해줍니다.

바인드 마운트는 호스트의 경로와 도커 내부의 파일을 선언해야합니다. 둘 중 하나가 파일이고 다른 하나가 디렉토리면 둘 중 하나의 디렉토리 안에 파일이 생성되어 마운트됩니다. -v HOST_PATH:CONTAINER_PATH의 형태로 생성할 수 있고, HOST_PATH는 상대 경로와 절대 경로 둘 다 가능합니다. 호스트 디렉토리가 시스템 디렉토리일 경우나, 기타 이유로 컨테이너가 수정하길 원하지 않는다면 읽기전용 옵션을 붙일 수도 있습니다. -v /etc/localtime:/etc/localtime:ro와 같이 마지막에 :ro를 붙이는 것으로 가능합니다.
볼륨 컨테이너는 다른 컨테이너에 마운트 되어있는 볼륨을 공유하여 사용하는 것입니다. --volumes-from CONTAINER_NAME과 같은 형태로 사용하며, 마운트 디렉토리는 동일하게 설정됩니다. 이를 통해 하나의 볼륨을 여러 개의 컨테이너가 공유하는 것이 가능합니다.

docker volume 하위 명령어의 간략한 설명입니다.

  • docker volume create VOLUME
    • 해당 명령어를 통해 도커를 생성하지 않고도 볼륨을 생성할 수 있습니다.
  • docker volume ls [OPTIONS]
    • 해당 명령어를 통해 현재 존재하는 볼륨의 리스트를 볼 수 있습니다.
    • --quiet, -q 옵션을 통해 볼륨 ID만을 출력하게 할 수 있습니다.
  • docker volume prune [OPTIONS]
    • 어떠한 컨테이너에게도 사용되고있지 않은 모든 볼륨을 제거합니다.
    • -f 옵션으로 확인 메시지를 띄우지 않게 할 수 있습니다.
  • docker volume rm [OPTIONS] VOLUME [VOLUME...]
    • 사용 중이지 않은 볼륨을 제거합니다.
    • --force, -f 명령어로 사용 중인 볼륨도 강제로 제거할 수 있습니다.

🛰 네트워크

도커의 컨테이너들은 가상화된 OS를 가지고 있으므로 포트와 DNS 등이 호스트와는 별개로 설정되어있습니다. 이들을 한데 묶어서 관리할 수 있는 기능이 도커 네트워크입니다. 도커 네트워크는 드라이브에 따라 여러 종류의 객체로 나뉩니다. 드라이버는 bridge, host, ipvlan 등이 있습니다.

bridge 드라이버는 기본 드라이버로, 아무 드라이버도 설정하지 않으면 bridge 드라이버로 설정이 됩니다. 하나의 bridge 네트워크에 포함된 컨테이너들은 서로간에 직접적인 통신이 가능하지만 서로 다른 bridge 네트워크에 있는 컨테이너들은 그렇지 않습니다.
host 드라이버는 호스트와의 네트워크 분리를 유지하지 않고, 컨테이너가 즉각적으로 호스트의 네트워크를 이용할 수 있게 합니다.
ipvlan 드라이버는 유저가 IPv4와 IPv6의 주소 관리를 직접적으로 할 수 있게 해주는 드라이버입니다.
그밖에 macvlan, overlay 등의 드라이버가 있고, 서드파티의 플러그인을 드라이버로 사용할 수도 있습니다.
none으로 설정하여, 드라이버를 사용하지 않고 외부와 네트워크하지 않게 컨테이너를 분리시켜둘 수도 있습니다.

docker network 하위 명령어의 간략한 설명입니다.

  • docker network create [OPTIONS] NETWORK
    • NETWORK의 이름을 가진 네트워크를 생성합니다. 옵션을 주지 않으면 bridge 네트워크가 생성됩니다.
    • --driver DRIVER, -d 네트워크의 드라이버를 선택합니다.
    • 기타 여러 가지 옵션들이 있으며 공식 문서를 참고하세요.
  • docker network ls [OPTIONS]
    • 도커 네트워크의 목록을 보여줍니다.
    • -quiet, -q의 옵션을 주면 ID만 보여줍니다.
  • docker network prune [OPTIONS]
    • 단 하나의 컨테이너에서도 쓰이지 않는 네트워크를 삭제합니다.
    • -f 옵션을 사용하면 확인 메시지를 띄우지 않습니다.
  • docker network rm NETWORK [NETWORK...]
    • 도커 네트워크를 삭제합니다.
    • -f 옵션이 없습니다.

📄 Dockerfile

도커를 통해서 서비스를 띄우기 위해서는 이미지가 필요합니다. 도커 허브에 올라와 있는 이미지로 충분한 경우도 대부분이지만 직접 이미지를 제작해 사용하는 것이 더 편한 경우도 있습니다. 도커 이미지를 제작하기 위해서는 베이스가 되는 이미지에 추가 작업을 해서 원하는 형태로 만들어야 하는데, 이 작업에 이용되는 것이 Dockerfile입니다.

Dockerfile을 이미지로 만드는 것을 빌드라고 합니다. 이것은 docker build PATH_TO_DOCKERFILE 명령어로 실행시킬 수 있습니다. 이 과정에서 여러 가지 옵션을 줄 수 있습니다.

그 전에, 이미지의 구조에 대해 간단하게 알아야 합니다. 우리가 사용하는 이미지는 베이스가 되는 OS 이미지에 여러 작업을 하여 완성된 형태로 만들어낸 것인데, 이 작업, 즉 명령어들의 목록은 각각 레이어라는 형태로 쌓여 이미지를 구성하게 됩니다. 만약 두 이미지가 중간까지 같은 과정의 작업을 거쳤다면, 두 이미지는 따로따로 저장되는 것이 아니라 중간까지의 생성 과정을 동일한 레이어로 공유하게 됩니다. 만약 생성 과정이 겹치는 이미지를 허브에서 다운받는다고 하면, 이미 가지고있는 레이어는 다운받지 않아도 됩니다.
Dockerfile로 여러 개의 이미지를 생성할 때 이 점에 유의하면 효율적으로 이미지를 생성할 수 있습니다. 공통되는 과정을 이미지로 먼저 만들어두거나, 공통된 과정을 거치도록 설정하게 되면 레이어를 공유하게 되어 이미지 저장 공간, 빌드 속도의 이점을 볼 수 있습니다.

다음은 간단한 Dockerfile의 예시입니다. 내용을 이해할 필요 없이 각 줄에 대문자로 쓰인 첫 단어인 intruction를 이해하도록 합시다. Dockerfile은 '#'로 주석을 표시합니다.

FROM node:16                          # node:16 이미지를 베이스 이미지로 사용합니다.

WORKDIR /app                          # 명령들을 실행할 디렉토리를 지정합니다.

ENV PATH /app/node_modules/.bin:$PATH # 이미지 내 환경변수를 지정합니다.

COPY . .                              # host의 .디렉토리에 있는 파일을 이미지 내의 .디렉토리 폴더로 복사합니다. .dockerignore를 참조하여 제외시킵니다.
RUN npm i                             # 현재 WORKDIR에서 npm i를 실행합니다.

ENTRYPOINT ["./entrypoint.sh"]        # 이미지가 구동될 때 실행되는 명령어인 entrypoint를 설정해줍니다.
CMD ["run", "start:dev"]              # entrypoint의 인자가 되는 cmd를 설정해줍니다.

각 instruction이 실행될 때마다 layer가 생성되게 됩니다.

🙅 .dockerignore

이미지 내부로 파일을 복사할 때 복사되길 원하지 않는 파일이 있을 수 있습니다. git의 .gitignore과 비슷하게 .dockerignore파일에 복사되길 원하지 않는 파일과 폴더의 목록을 넣어둘 수 있습니다. 예를 들어서 Dockerfile 자체일 수 있습니다.

👣 instruction

Dockerfile을 구성하는 instruction에 대해 알아보도록 하겠습니다.

  • FROM <image>:<tag>
    • Dockerfile에 필수적인 instruction입니다.
    • 베이스로 사용할 이미지를 선택합니다. 태그를 선택하지 않으면 lastest 태그가 자동으로 선택되며, 로컬에 이미지가 없으면 docker hub에서 자동으로 받아오게 됩니다.
  • LABEL <key>=<value>
    • 키와 값 쌍으로 이루어진 메타데이터입니다. 이미지 내용에는 영향을 미치지 않습니다.
    • 예시
  • WORKDIR /path/to/workdir
    • RUN이나 COPY같은 intruction을 실행할 디렉토리를 설정합니다.
  • RUN <command>
  • RUN ["executable", "param1", "param2"]
    • <command> 또는 executable param1 param2를 이미지 내부에서 실행합니다.
    • 기본적으로 ''에서 실행되며, 'WORKDIR'이 설정되어있다면 그곳에서 실행됩니다.
    • \로 커맨드 상에서 줄을 바꿀 수 있습니다.
  • ENTRYPOINT ["executable", "param1", "param2"] - 'exec' form
  • ENTRYPOINT <command> - 'shell' form
    • 이미지가 컨테이터로 띄워질 때 최초로 실행될 명령어를 설정합니다.
    • 'CMD'나 docker run으로 실행되는 명령어는 entrypoint의 인자가 됩니다.
    • entrypoint가 없으면 'CMD'나 docker run에 지정된 명령어가 최초 실행됩니다.
    • cmd와는 다르게 이미지를 수정하지 않고서는 수정이 불가능합니다.
  • CMD ["executable","param1","param2"] - entrypoint가 없을 때
  • CMD ["param1", "param2"] - entrypoint가 있을 때
  • CMD <command> - 'shell' form
    • docker run에 cmd가 없을 시의 기본 커맨드를 지정합니다.
    • entrypoint와는 달리 명령어로 대체 가능합니다.
  • COPY [--chown=<user>:<group>] <src>... <dest>
  • COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
    • [--chown]부분은 생략이 가능합니다. 특정 유저와 그룹의 소유자로 디렉토리와 파일을 생성합니다.
    • 여러 개의 파일과 디렉토리를 한 번에 dest 디렉토리(혹은 파일)로 옮겨줍니다.
  • ADD [--chown=<user>:<group>] <src>... <dest>
  • ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
    • COPY의 기능을 포함하고 있습니다.
    • <src>에 url이나 tar파일이 올 수 있습니다.
  • ENV <key>=<value> ...
    • 환경변수를 설정합니다.
    • 여러 개의 환경변수를 한 번에 설정할 수 있습니다.
    • 만들어진 컨테이너에는 환경변수가 상속됩니다.
  • ARG <name>[=<default value>]
    • Dockerfile 빌드 과정에서만 사용될 변수를 설정합니다.
    • docker build --build-arg <name>=<value>같은 형식으로 빌드 시 값을 설정해줄 수 있습니다.
    • 완성된 이미지에 값이 남지 않습니다.
  • EXPOSE <port> [<port>/<protocol>...]
    • 만들어질 컨테이너의 포트를 노출시킵니다.
    • 이 명령어를 사용하지 않아도 docker run -p <port>:<port>/protocol> 명령어를 사용하여 컨테이너를 만들 때 노출시킬 수 있습니다.

🐙 docker-compose

⚠️ **GitHub.com Fallback** ⚠️