시작은 미약하였으나 , 그 끝은 창대하리라

[Docker] 컨테이너 생성 및 실행 본문

프로그래밍/Docker

[Docker] 컨테이너 생성 및 실행

애플파ol 2024. 2. 23. 13:59

Part1. 컨테이너 생성.

1. docker run :

  • 컨테이너를 생성하고 즉시 시작함.
  • 'docker run' 명령어는 'docker create' 와 'docker start' 를 결합한 것으로 볼 수 있음.
  • 주로 컨테이너를 생성하고 즉시 실행하고자 할 때 사용함.
  • Tag 안하면 latest(최신버전)으로 설치됨
  • 예시:
docker run -it REPOSITORY:TAG /bin/bash

 

2. docker create :

  • 컨테이너를 생성하고 시작하지 않음.
  • 생성된 컨테이너는 시작되지 않은 상태이며, 'docker start' 명령을 사용하여 따로 시작해야함
  • 주로 컨테이너를 미리 생성하고, 나중에 필요할 때 사용됨.
  • 주로 create 보다는 run을 사용하게 됨
  • Tag 안하면 latest(최신버전)으로 설치됨
  • 예시:
docker create -it REPOSITORY:TAG /bin/bash

 

 

 

 

 

 


 

Part2. 컨테이너 실행.

1. docker start :

  • 'docker start' 명령어는 정지된 컨테이너를 시작하는 데 사용됨.
  • 이 명령어를 사용하면 컨테이너가 시작되지만 컨테이너에 진입하지는 않음. 즉, 컨테이너가 백그라운드에서 실행됨.
  • 예시 :
docker start <container_id_or_name>

 

 

(참고) docker restart :

  • 'docker restart' 명령어는 이미 실행 중인 컨테이너를 재시작하는데 사용함.
  • 이 명령어를 사용하면 컨테이너가 재시작됨. 이미 실행 중인 컨테이너를 중단하고 다시 시작하는 것.
  • start, restart 차이점:
    • 'docker start' : 정지된 컨테이너를 처음부터 시작함.
    • 'docker restart' : 이미 실행 중인 컨테이너를 중단하고 다시 시작함.
  • 예시 :
docker restart <container_id_or_name>

 

 

 

2. docker attach:

  • 'docker attach' 명령어는 이미 실행 중인 컨테이너에 연결하여 컨테이너 내부의 쉘이나 프로세스에 참여하는데 사용.
  • 이 명령어를 사용하면 컨테이너에 연결되어 해당 컨테이너의 터미널을 제어할 수 있음, 컨테이너의 터미널이 종료되면 컨테이너도 종료됨.
  • 예시:
docker attach <container_id_or_name>

 

 

 

(참고) docker exec -it :

  • 상황: 터미널 2개를 열때, ex) 데이터 송수신을 테스트를 하고 싶다면 터미널을 2개 열어서 확인을 해야한다. 둘다 동일한 container환경에 접속을 하고 싶은데, 위의 'docker attach' 명령어를 사용하면 서로다른 터미널이 동기화 되어서 동일하게 동작한다.
  • 이를 해결하기 위한 명령어가 'docker exec -it' 라고 생각하면 된다. 즉, 동기화 되지 않는 컨테이너의 터미널 환경으로 들어가는 것이다.
  • 예시:
docker exec -it <container_id_or_name> /bin/bash

 

 

 

 

 


 

Part3. 컨테이너 생성시 다양한 옵션.

 

1. 도커 Volume :

  • Volume이란? Local computer(본인 컴퓨터) 와 container의 저장소를 공유하는 것으로, Volume기능을 사용하면 컨테이너를 삭제하여도 연결한 local 저장소 디렉토리에 데이터가 저장됨.
  • 컨테이너의 volume 디렉토리는 기본적으로 home을 보유하고 있음.
  • volume 디렉토리의 폴더는 자동으로 생성됨으로 /home/sample_1/sample_2/  등으로 마음껏 만들 수 있음.
  • 컨테이너를 삭제해도 local에서는 데이터가 그대로 남아있음
  • 예시
docker run -it -v ~/Desktop/volume_test:/home/data_1 ubuntu:20.04 /bin/bash

docker run -it -v (호스트 디렉토리):(컨테이너의 volume 디렉토리) (이미지) /bin/bash

 

 

(좌측) container, (우측) 노트북 화면
컨테이너(죄측)와 local computer(우측)가 동기화 되있기 때문에 컨테이너에서 생성하면 local도 동일하게 적용됨.

 

 

컨테이너(좌측)를 삭제해도 local에는 잘 남아 있음을 확인할 수 있다.

 

 

 

2. 도커 환경 웹캠연결 :

  • -p
    • 기능: 포트 포워딩을 지정하는 옵션입니다.
    • 설명: 8888:80은 로컬 머신(호스트)의 8888 포트를 컨테이너 내부의 80 포트로 매핑하는 것을 나타냅니다.
  • --gpus all
    • 기능: 컨테이너에서 GPU를 사용하도록 설정함.
    • 설명: 컨테이너가 호스트 시스템의 GPU를 활용할 수 있도록 지정함.
    • 기타: 특정 gpu만(ex 1번)을 사용하고 싶다면  --gpus 'device=1' 로 하면됨
  • --privileged
    • 기능: 컨테이너를 실행할 때 privileged 모드로 실행함.
    • 설명: 컨테이너 내부에서 호스트 시스템의 디바이스에 대한 특별한 권한을 갖게 됨.
  • -v /dev/video0:/dev/video0
    • 기능 : 호스트 시스템의 /dev/video0을 컨테이너 내부의 /dev/video0에 마운트합니다.
    • 설명 : 이 옵션은 호스트의 카메라 장치를 컨테이너로 연결하는 데 사용됩니다. /dev/video0는 일반적으로 Linux 시스템에서 웹캠이나 기타 비디오 디바이스에 해당하는 장치 파일입니다.
  • -v /tmp/.X11-unix:/tmp/.X11-unix
    • 기능: X Window System의 UNIX 소켓 파일을 호스트 시스템의 /tmp/.X11-unix에서 컨테이너 내부의 /tmp/.X11-unix에 마운트합니다.
    • 설명: X Window System은 대화형 응용 프로그램을 실행하고 그래픽을 표시하는 데 사용되는 윈도우 시스템입니다. 이 옵션은 컨테이너에서 호스트의 GUI를 사용할 수 있도록 X 소켓을 공유합니다.
  • -e DISPLAY=unix$DISPLAY
    • 기능: 컨테이너 내부의 DISPLAY 환경 변수를 호스트 시스템의 DISPLAY 값으로 설정합니다.
    • 설명: X Window System은 DISPLAY 환경 변수를 사용하여 어떤 디스플레이 서버를 사용할지 지정합니다. 이 옵션은 컨테이너 내부에서 호스트의 디스플레이 서버를 사용할 수 있도록 설정합니다. $DISPLAY는 호스트 시스템의 DISPLAY 값을 사용합니다.
  • --network host
    • 기능 : 네트워크 설정을 제어하는데 사용함.
    • 설명 : 컨테이너는 호스트와 동일한 IP주소를 사용하고 호스트의 포트에 직접 접근할 수 있음, --network host 수행하면 -p(포트포워딩) 명령어가 필요 없음.
  • 아래는 예시.
docker run -p 8888:80 --gpus all --privileged -it -v /dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY [이미지이름] /bin/bash

 

docker run --network host --gpus all --privileged -it -v /dev:/dev -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY [이미지이름] /bin/bash

Part4. 기타 자주 쓰는 명령어.

1. 컨테이너 삭제 :

  • 예시:
docker rm <container_id_or_name>

 

2. 이미지 삭제 :

  • 예시:
docker rmi <image_ID>

 

3. 이미지 강제 삭제 :

  • 컨테이너를 삭제하기 전에 이미지 삭제
  • 예시
docker rmi -f <image_ID>

 


 

Part5. 오류 정리.

 

1. WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

  • 원인 : mac m1 os는 arm기반 아키텍쳐이기때문에 도커이미지를 생성하면 platform이 linux/arm64로 생성됨, 하지만 일반적으로 amazon linux를 사용하는 AWS EC2는 linux/arm64가 아닌 linux/amd64이기 때문.
  • 해결 방안 : '--platform' 옵션 사용
  • 예시: (옵션을 추가하면 됨)
docker run --platform linux/amd64

 

 

 


Part5. 컨테이너 생성 후 기본적으로 입력하는 명령어

  1. apt-get update
  2. apt-get upgrade
Comments