-
[도커]Summary/[Dreamhack] Summary 2024. 1. 14. 22:55
도커(Docker)는 컨테이너를 만들고, 실행하고, 배포할 수 있는 가상화 플랫폼입니다.
컨테이너란, 가상의 환경이 구축되어 있는 하나의 박스를 말합니다.
쉽게 말하면 특정한 환경을 구성하기 위해 만들어진 가상의 공간입니다.
도커 이미지(Docker Image)
도커 이미지는 도커 컨테이너의 전 단계로, 컨테이너를 생성하고 실행하기 위한 모든 것을 포함합니다.
예를 들어 컨테이너 생성에 필요한 파일, 환경 변수, 명령어 등과 파일 시스템이 있습니다. 자신만의 이미지를 만들거나 다른 사람이 만든 이미지를 사용할 수도 있습니다.
도커 컨테이너(Docker Container)
도커 컨테이너는 도커 이미지로부터 만들어진 실행 가능한 인스턴스입니다. 다르게 말하면, 실행 중인 이미지를 컨테이너라고 합니다. 컨테이너는 도커 이미지와 사용자가 컨테이너를 시작할 때 작성하는 옵션에 의해 정의됩니다. 컨테이너를 실행하는 동안은 분리된 파일 시스템을 사용합니다.
도커 레지스트리 (Docker Registry)
도커 레지스트리는 도커 이미지를 저장하는 저장소입니다. 도커의 공식 레지스트리로 Docker Hub가 있습니다. 누구나 레지스트리에 도커 이미지를 올리고, 존재하는 도커 이미지를 가져올 수 있습니다.
도커를 쓰는 이유
도커가 없다면 VirtualBox와 같은 가상 머신을 설치하여 직접 문제 환경을 구축해야 합니다
도커 컨테이너는 가상 환경 구축의 많은 부분을 생략하고 가볍게 실행되어, 매우 간편하게 문제 환경을 재현합니다. 또한, 문제 환경과 거의 동일한 환경을 제공하여 문제 풀이에 방해가 되는 요소를 줄입니다.
도커 명령어
docker build
Dockerfile을 이용하여 이미지를 생성합니다.
- docker build [옵션] [Dockerfile 경로]
- docker build -t [이미지명:태그] [Dockerfile 경로]
docker build . : 현재 디렉토리에 있는 Dockerfile로 이미지 생성
➡️ docker build -t my-image . : 현재 디렉토리에 있는 Dockerfile로 ‘my-image:latest’ 이미지 생성
docker images : 도커 이미지 목록을 출력합니다.
docker run : 도커 이미지로 컨테이너를 생성하고 실행합니다.
- docker run [옵션] [이미지명|ID] [명령어]
- docker run -p [호스트 PORT]:[컨테이너 PORT] [이미지명|ID]
-p 옵션은 도커 컨테이너의 포트와 호스트의 포트를 매핑합니다. 컨테이너에서 리슨하고 있는 포트를 호스트의 특정 포트로 접속할 수 있도록 합니다.
- docker run -it [이미지명|ID] [명령어]
-it 옵션으로 컨테이너에서 bash 셸을 사용할 수 있습니다. -i (--interactive)는 표준 입력을 활성화하여 사용자가 명령어를 입력할 수 있도록 하고, -t (--tty)는 가상 터미널(tty)을 사용할 수 있도록 합니다.
➡️ docker run -it my-image:1 /bin/bash : my-image:1
docker ps : 실행 중인 컨테이너 목록을 출력합니다.
- docker ps -a
-a 옵션은 종료된 컨테이너까지 모두 출력합니다.
docker create :도커 이미지로 컨테이너를 생성합니다.
- docker create [옵션] [이미지명|ID] [명령어]
docker start : 중단된 컨테이너를 시작합니다.
- docker start [옵션] [컨테이너명|ID]
docker exec : 실행 중인 컨테이너에 접속하여 명령을 수행합니다.
- docker exec [옵션] [컨테이너명|ID] [명령어]
docker run과 유사하게 -it 옵션으로 bash 셸을 실행할 수 있습니다.
➡️ docker exec -it [컨테이너명|ID] /bin/bash : 실행 중인 컨테이너에서 bash 셸 열기
docker stop : 실행 중인 컨테이너를 중단합니다.
- docker stop [옵션] [컨테이너명|ID]
docker pull : 레지스트리(Docker Hub)에 존재하는 도커 이미지를 다운받습니다.
- docker pull [옵션] [이미지명]
➡️ docker pull ubuntu:18.04 : Docker hub에서 ubuntu:18.04 이미지를 다운받습니다.
docker rm : 도커 컨테이너를 삭제합니다.
- docker rm [옵션] [컨테이너명|ID]
docker rmi : 도커 이미지를 삭제합니다.
- docker rmi [옵션] [이미지명|ID]
docker inspect : 도커 이미지 혹은 컨테이너의 자세한 정보를 출력합니다.
- docker inspect [옵션] [이미지 혹은 컨테이너명|ID]
Dockerfile
도커 이미지를 빌드하기 위해서는 Dockerfile이 필요합니다. Dockerfile은 이미지를 생성하는데 필요한 명령어를 포함하여 모든 설정이 정의된 파일입니다. 운영체제와 버전, 환경 변수, 파일 시스템, 사용자 등을 정의합니다.
Dockerfile 명령어
FROM
FROM 이미지:태그
생성할 이미지의 기반이 되는 base 이미지를 지정합니다. 보통 사용할 운영체제의 공식 이미지를 Dockerhub에서 가져옵니다.
➡️ FROM ubuntu:18.04
ENV
ENV 변수명 값 or ENV 변수명=값
Dockerfile 내에서 사용하는 환경 변수를 지정합니다. 파일 내에서 변수는 $변수명 혹은 ${변수명} 형태로 표현합니다.
➡️ ENV PYTHON_VERSION 3.11.2 → .../python/$PYTHON_VERSION/...
RUN
RUN 명령어 or RUN ["명령어", "인자1", "인자2"]
이미지를 빌드할 때 실행할 명령어를 작성합니다. 필요한 패키지를 설치하거나, 파일 권한 설정 등의 작업을 수행합니다.
➡️ RUN apt-get update
➡️ RUN ["/bin/bash", "-c", "echo hello"]
COPY
COPY src dst
src 파일이나 디렉토리를 이미지 파일 시스템의 dst로 복사합니다.
➡️ COPY . /app
ADD
ADD src dst
src 파일이나 디렉토리, URL을 이미지 파일 시스템의 dst로 복사합니다.
➡️ ADD . /app
WORKDIR
WORKDIR 디렉토리
Dockerfile 내의 명령을 수행할 작업 디렉토리를 지정합니다. 리눅스의 cd 명령어와 유사합니다.
➡️ WORKDIR /home/user
USER
USER 사용자명|UID or USER [사용자명|UID]:[그룹명|GID]
명령을 수행할 사용자 혹은 그룹을 지정합니다.
➡️ USER $username
EXPOSE
EXPOSE 포트 or EXPOSE 포트/프로토콜
컨테이너가 실행 중일 때 들어오는 네트워크 트래픽을 리슨할 포트와 프로토콜을 지정합니다. 사용할 수 있는 프로토콜은 TCP와 UDP이며, 기본적으로 TCP가 지정됩니다.
➡️ EXPOSE 80/tcp
ENTRYPOINT
ENTRYPOINT 명령어 or ENTRYPOINT ["명령어", "인자1", "인자2"]
컨테이너가 실행될 때 수행할 명령어를 지정합니다.
➡️ ENTRYPOINT ["echo", "hello"]
CMD
CMD 명령어 or CMD ["명령어", "인자1", "인자2"] or CMD ["인자1", "인자2"]
컨테이너가 실행될 때 수행할 명령어를 지정하거나, ENTRYPOINT 명령어에 인자를 전달합니다.
➡️ CMD ["echo", "hello"]
- Dockerfile 내에 CMD 명령이 여러 개 존재하면 마지막 CMD를 사용합니다.
- docker run의 인자를 작성하면 CMD 명령어는 무시됩니다. ENTRYPOINT가 있는 경우, docker run의 인자가 ENTRYPOINT의 인자로 들어갑니다.
Docker Hub
Docker Hub는 도커의 공식 레지스트리로, 도커 이미지를 저장하는 저장소입니다.
1. docker login
2. docker build -t [사용자]/[레포지토리명]:[TAG] [Dockerfile 경로]
Dockerfile을 이용하여 이미지를 빌드합니다. 이미지 이름은 [사용자]/[레포지토리명]:[TAG] 형식으로 작성합니다. dreamhackofficial/exercise-docker:1으로 빌드하겠습니다.
3. docker push [사용자]/[레포지토리명]:[TAG]
레포지토리에 이미지를 업로드합니다.
'Summary > [Dreamhack] Summary' 카테고리의 다른 글
[DreamHack] 필기 (0) 2024.01.09