[docker] 도커란? 도커 명령어 모음

pipi·2023년 6월 25일
2

인프라

목록 보기
1/12

📌 용어 설명

  • 도커(docker) : 가상환경(컨테이너) 제공

도커 이미지만 있다면, 도커 데몬이 설치된 컴퓨터에서 도커 프로세스 실행 가능.

  • 도커 이미지 : 실행할 코드가 들어있는 바이너리. 한번 생성하면 수정이 불가능(cd)
  • 도커 파일 : 도커 이미지를 만들기 위한 문서
  • 도커 컨테이너 : 도커 이미지가 메모리 위에서 수행되는 프로세스. 컨테이너 종료 시 모든 데이터는 휘발
  • 도커 데몬 : 컨테이너가 수행되는 실행환경 제공(cd 플레이어)
  • 원격 레지스트리 : 도커 이미지를 저장하고, 불러올 수 있는 원격 저장소

📌 기본 명령어

컨테이너 실행

docker run <IMAGE>:<TAG> [<args>]

  • 도커 이미지를 실행(== 컨테이너를 생성) 하는 명령어
  • local 에 없다면 원격에서 가져온다.
  • <IMAGE> : 실행시키는 이미지 주소, 레지스트리 이름/이미지 이름, 레지스트리 이름의 기본은 docker.io
  • <TAG> : 기본은 latest
  • <args> : 컨테이너에 전달할 인수




아래의 두 명령어는 똑같은 명령어다. 인자로 cosway, 'heloo world!'를 넘겨준다.'

docker run docker/whalesay cowsay 'hello world!'
docker run docker.io/docker/whalesay:latest cowsay hello world!'

  • 실습을 위해, 도커 원격 레지스트리에서 이미지를 가져온다.
  • 실습에서는 리눅스 명렁어 - cowsay 명령 의 이미지를 가져온다.

-d 옵션으로 컨테이너를 백그라운드에서 실행한다.
docker run -d nginx

  • container ID를 return한다.

컨테이너 조회

docker ps : 실행중인 컨테이너 조회
docker ps -a : -a(all)옵션으로 종료된 컨테이너까지 조회

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
bc14088d2b60   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   80/tcp    flamboyant_prosk~

컨테이너 상세정보 확인

docker inspect <CONTAINER ID>

[
    {
        "Id": "bc14088d2b60053fab1828b07e97990d5167a8a39fa4e8f7d77c3c16aade755b",
        "Created": "2023-06-24T15:44:15.9810891Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true, ~

컨테이너 로깅

docker logs <CONTAINER ID> : 컨테이너에서 출력되는 로그 기록 확인

docker logs -f <CONTAINER ID> : -f 옵션으로 실시간 로그 출력 -> 멈추려면 ctrl + c

/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
~
2023/06/24 15:44:17 [notice] 1#1: using the "epoll" event method
2023/06/24 15:44:17 [notice] 1#1: nginx/1.25.1

컨테이너 명령 전달

docker exec <CONTAINER_ID> <CMD> : 실행된 컨테이너에, 명령 전달 (새로운 패키지 설치, 설정 수정 등)


docker exec bc14088d2b60 sh -c 'apt update && apt install -y wget'
docker exec bc14088d2b60 wget localhost

  • 실습으로 niginx 컨테이너에 wget을 설치하고, localhost로 요청을 보내봅시다.
--2023-06-24 16:11:15--  http://localhost/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.

컨테이너 / 호스트간 파일 복사

docker cp <HOST_PATH> <CONTAINER_ID>:<CONTAINER_PATH>

  • 컨테이너와 호스트 서버간에 파일을 주고 받을 수 있다.
  • 호스트 서버는 도커 데몬이 실행되는 물리적인 또는 가상의 서버

docker cp /etc/passwd bc14088d2b60:/usr/share/nginx/html/.

  • 호스트 서버의 /etc/passwd 파일을 컨테이너의 /usr/share/nginx/html/.위치로 복사
  • docker exec bc14088d2b60 curl localhost/passwd 명령어로 확인

docker cp bc14088d2b60:/usr/share/nginx/html/index.html .

  • 컨테이너 위치의 파일을 현재 호스트서버로 복사.
  • 호스트 서버에서 cat index.html명령어로 복사된 파일 확인 가능

컨테이너 중단

docker stop <CONTAINER_ID>

  • 중단된 건, docker ps로 확인 불가, docker ps -a 사용

컨테이너 실행

docker run <CONTAINER_ID>

컨테이너 삭제

docker rm <CONTAINER_ID>
docker rm $(docker ps -aq) -f : 모든 컨테이너 삭제!!

interactive 컨테이너

docker rm <CONTAINER_ID>

  • -it(interactive try) 옵션으로, 컨테이너 안으로 접속
  • 컨테이너 내부에서 디버깅을 하거나, 임시로 패키지를 설치할 때 사용됨
  • 컨테이너는 휘발성 프로세스기에, 해당 명령어로 작업을 수행하더라도, 컨테이너가 종료되면 다 날라감!

컨테이너 생성(run)과 동시에 컨테이너 접속하는 경우
docker run -it ubuntu:16.04 bash
=> root@dd40dc18bf0a:/# 로 쉘 연결됨!
=> 나가려면 exit 명령어 사용

이미 실행된 컨테이너로 접속하는 경우(exec 사용)
docker run -d nginx
docker exec -it 2b226f1a3386 bash
=> root@2b226f1a3386:/# 로 쉘 연결됨!


📌 도커 저장소

도커 허브

  • 도커 이미지 원격 저장소. 이미지 업로드 + 다운로드 가능
  • docker login : 도커 허브에 로그인

이미지 업로드, 다운로드, 삭제

docker images : 원격저장소에서 다운받아, 로컬에 저장된 이미지 확인
docker push <USENAME>/<NAME> : 원격(도커 허브)으로 이미지 업로드
docker pull <IMAGE_NAME> : 원격에 있는 이미지 다운로드
docker rmi <IMAGE_NAME> : 로컬에 있는 이미지 삭제

이미지에 tag 달기 (이름 변경)

이미지!! 에 이름을 바꾸는 거임. 실행 중인 컨테이너 이름 바뀌는게 아니라
docker tag nginx <USERNAME>/nginx
docker images : 로 이미지 이름바뀐거 확인 가능

실습은 다음과 같이 진행했다.
docker tag docker/whalesay pipisebstian/whalesay

pipisebstian/whalesay                    latest      6b362a9f73eb   8 years ago     247MB
docker/whalesay                          latest      6b362a9f73eb   8 years ago     247MB

여길 보면, 기존의 whalesay가 있고, pipisebstian/whalesay 가 생겼다. 이미지 id는 동일하며, 이름만 다를 뿐 같은 이미지다! 왜 username으로 했냐면, 나중에 원격에 만든 이미지를 push할때, docker push <USENAME>/<NAME> 형식으로 해야하기 때문이다. 아니면 denied된다


📌 도커 파일 작성

이때까지, 이미 만들어진 이미지를 가지고 실습했다. 이반에는 직접 도커 파일을 작성해서, 도커 이미지를 만들어보자.

hello.py 생성

import os
import sys

my_ver = os.environ["my_ver"]
arg = sys.argv[1]

print(f"Hello {arg}, my version is {my_ver}!")

Dockerfile 생성

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get install -y \
    curl \
    python3-dev
    
WORKDIR /root
COPY hello.py .
ENV my_ver 1.0

CMD ["python3", "hello.py", "pipisebastian"]

FROM : 기반 이미지(base image), 해당 이미지를 기반으로 도커 이미지가 생성됨.
(뒤에서 설명)ARG : DockerFile 안에서 사용할 수 있는 매개변수 정의
RUN : 지정한 명령 실행
WORKDIR : 이미지의 작업 폴더(work directory) 지정
COPY: 로컬 호스트에 존재하는 파일을 이미지 안으로 복사
ENV : 이미지의 환경변수 지정
CMD : 이미지 실행시, default로 실행되는 명령 지정.
(뒤에서 설명)ENTRYPOINT : CMD와 유사하게 명령을 실행하나, override 되지 않는 특징이 있다

도커 빌드(Dockerfile -> Image)

docker build <PATH> -t <IMAGE_NAME>/<TAG>
docker build . -t hello:1
현재 directory에 위치한 Dockerfile을 가지고 hello 이미지를 생성한다. docker images 명령어로 생성된 이미지 확인한다.

REPOSITORY                               TAG         IMAGE ID       CREATED          SIZE
hello                                    1           88fc6cdbf9cc   34 seconds ago   261MB

docker images 명령어로 생성된 이미지 확인
docker run hello:1 => Hello pipisebastian, my version is 1.0! 출력
docker run hello:1 echo "hahah" => hahah 출력 <= 파라미터를 넣으면, 기존 CMD가 오버라이드됨

Dockerfile - CMD? ENTRYPOINT?

오버라이드 되는 걸 막기위해, Dockerfile을 다음과 같이 CMD -> ENTRYPOINT로 변경함.

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get install -y \
    curl \
    python3-dev
    
WORKDIR /root
COPY hello.py .
ENV my_ver 1.0

ENTRYPOINT ["python3", "hello.py", "pipisebastian"]

docker run hello:1 echo "hahah" => Hello pipisebastian, my version is 1.0! 출력

ENTRYPOINT는 파라미터로 명령을 전달하더라도, override되지 않음. 대신 파라미터 전달 값이 ENTRYPOINT의 파라미터로 그대로 들어감. 무슨 말이냐!

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get install -y \
    curl \
    python3-dev
    
WORKDIR /root
COPY hello.py .
ENV my_ver 1.0

ENTRYPOINT ["python3", "hello.py"] // 3번째 인수 제거 

docker build . -t hello:2
docker run hello:2 pipipipip => Hello pipipipip, my version is 1.0! 출력

+) 그러나, 강제로 override하는 방법도 있다 --entrypoint

Dockerfile - ARG - 환경변수 주입

컨테이너 실행할 때, 환경변수 주입이 가능하다. (-e 옵션)
docker run -e my_ver=1.5 hello:1 => Hello pipisebastian, my version is 1.5! 출력

컨테이너 빌드할 때, 환경변수 주입을 해봅시다.
1. dockerfile 변경

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get install -y \
    curl \
    python3-dev
   
ARG my_ver = 1.0 ## 추가

WORKDIR /root
COPY hello.py .
ENV my_ver $my_ver ## 수정

CMD ["python3", "hello.py", "pipisebastian"]

docker build . -t hello:2 --build-arg my_ver=2.0 => Hello pipisebastian, my version is 2.0 출력


📌 도커 실행 고급

네트워크(포트 포워딩)

docker run -p 5000:80 -d nginx : 호스트 서버의 5000번 포트를 컨테이너의 80번 포트와 매핑
=> "<내부 IP 또는 공인 IP>:5000"으로 웹페이지 접속
=> hostname -i 내부 IP 확인, curl ifconfig.co 공인 IP 확인
=> ex) 127.0.1.1:5000 으로 웹페이지 접속

Volume

컨테이너는 휘발성 프로세스기에, 컨테이너가 삭제되면 다 날라간다.
데이터를 지속적으로 보관하기 위해선, 볼륨을 사용한다.
=> 로컬호스트의 파일 시스템과, 컨테이너를 연결하여, 로컬호스트에 데이터를 저장!!
docker run -v <HOST_DIR>:<CONTAINER_DIR> <IMAGE_NAME>
ex) docker run -p 6000:80 -v $(pwd):/usr/share/nginx/html -d nginx


'핵심만 콕 쿠버네티스' 도서 참고했습니다

1개의 댓글

comment-user-thumbnail
2023년 6월 25일

오오.... docker 공부하시는군요..!! 멋집니다!

답글 달기

관련 채용 정보