무무요 2024. 11. 13. 18:05


=======

도커 호스트 (도커가 깔린 호스트)


도커 컨테이너
- 컨테이너 관련 명령어
# docker container 명령어 옵션(# docker container --help로 확인)

- 주요 명령어
start : 컨테이너 실행
stop : 컨테이너 정지
create : 도커 이미지로부터 컨테이너 생성
rm : 정지 상태의 컨테이너 삭제
exec : 실행 중인 컨테이너 내 프로그램 실행
ls : 컨테이너 목록 출력
cp : 도커 컨테이너와 도커 호스트 간 파일 복사
commit : 도커 컨테이너를 이미지로 변환
run : 도커 이미지 다운로드 + 컨테이너 생성 및 실행
  → docker image pull + docker container create + docker container start  일괄 수행

도커 컨테이너 생성
- 도커 이미지를 기반으로 컨테이너 생성
  → 자동으로 시작되지 않고 정지된 상태로 생성만 됨

- 로컬저장소에 있는 이미지를 우선으로 사용하여 컨테이너 생성
  - 해당 이미지가 없을 때 도커 허브 저장소에서 다운로드 받아 생성

명령어 사용법
# docker container create [옵션] [저장소 이름/] 이미지 이름[:태그]

컨테이너 이름 : 컨테이너 생성 시 이름 지정, 지정하지 않으면 임의 할당
                           --name: 컨테이너 이름
호스트 이름 : 컨테이너 내부에 적용되는 Hostname을 지정할 수 있음
                         --hostname
호스트와 통신 가능 설정 : 컨테이너의 표준 입력을 항상 열린 상태로 유지
                                     -i(--interactive = 대화형)
TTY 할당 : 호스트에서 컨테이너를 사용할 수 있는 콘솔(TTY)이 할당됨  
                      -t(--tty = 가상콘솔)
  
Ex. httpd 이미지로 컨테이너 생성
# docker container create httpd
# docker image ls : 이미지 확인 가능
  → 로컬저장소에 이미지가 없으므로 이미지 다운로드 후 컨테이너 생성 작업까지 진행된 것을 확인할 수 있음

컨테이너 재시작
# docker container restart [컨테이너 이름 or 컨테이너 ID]
         
컨테이너 실행(Run)
- 컨테이너를 생성하고 바로 실행하기, 한 번에 수행(RUN = CREATE + START)
# docker container run [옵션] [저장소 이름/]이미지 이름[:태그]
      -d 옵션 : 컨테이너를 백그라운드로 실행
Ex. 컨테이너 실행
# docker container run -d httpd
  → httpd 이미지로 컨테이너를 생성하고 백그라운드로 실행시킴

컨테이너 일시 정지 / 해제
- 컨테이너를 일시 정지시키고 다시 실행 
# docker container pause [컨테이너 이름 or 컨테이너 ID]
# docker container unpause [컨테이너 이름 or 컨테이너 ID]  
         
Ex. 컨테이너 일시 정지 및 다시 실행
             # docker container pause [컨테이너 이름 or 컨테이너 ID]
             # docker container unpause [컨테이너 이름 or 컨테이너 ID]
             # docker container ps -a → 확인 

컨테이너 중지
- 실행 중인 컨테이너를 중지
# docker container stop [컨테이너 이름 or 컨테이너 ID]
         Ex. 컨테이너 일시 정지 및 다시 실행
             # docker container stop [컨테이너 이름 or 컨테이너 ID]
             # docker container ps -a → 확인 

컨테이너 삭제 
- 불필요한 컨테이너 삭제
# docker (container) rm [컨테이너 이름 or 컨테이너 ID]
         Ex. 컨테이너 삭제 
             # docker container rm [컨테이너 이름 or 컨테이너 ID]
             # docker container ps -a → 확인 

정지 상태의 모든 컨테이너 삭제 
- 사용하지 않는 정지된 컨테이너들을 한 번에 삭제
# docker container prune

도커 컨테이너 내부 접속
- 컨테이너 내부 접속
- 모든 내용(컨테이너 / 이미지) 제거 후 진행
         ex1)
         # docker container run -it ubuntu
          



           ∙ 컨테이너 내부 접속 완료, 리눅스 명령어를 이용하여 제어 가능
           ∙ i옵션 : interactive 약어로 표준 입력 Open 의미       
             t옵션 : tty(터미널) 의미
           ∙ # id 명령어 입력해 보면 root 계정으로 접근된 것을 확인할 수 있음

        ex2)
        # docker run -d httpd
        # docker container exec -it (컨테이너ID) /bin/bash    
=======

도커 스토리지
도커 스토리지 개요 및 필요성
- 컨테이너 삭제 시 컨테이너 내부에 존재하는 파일도 함께 삭제, 따라서 컨테이너 실행 여부와 상관없이 데이터를 유지하려면 도커 스토리지가 필요
- 도커 스토리지는 도커 컨테이너에서 생성되는 데이터를 보존하기 위해 사용
- 도커 스토리지 필요성 관련 간단 실습

- 컨테이너 실행 중 생성된 Data, 컨테이너 삭제 시 Data 유지가 안 됨
       # docker image pull postgres → 도커 허브에서 PostgreSQL 이미지 다운로드 
       # docker image ls
       # docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d 
postgres
         → --name : 컨테이너 이름 지정
            -e : 환경 변수 설정
            -d : 백그라운드 실행
       # docker ps → 컨테이너 실행 확인
       # docker container exec -it (컨테이너 ID) /bin/bash → 컨테이너 진입
  
       # psql -U postgres → 하단 내용 : DB 접근 및 기본 설정
       postgres=# CREATE USER user01 PASSWORD '1234' SUPERUSER;
       postgres=# CREATE DATABASE test01 OWNER user01;
       postgres=# \c test01 user01 → 다른 사용자로 데이터베이스에 연결
       test01=# CREATE TABLE table01(
                  id INTEGER PRIMARY KEY,
                  name VARCHAR(20)
                  );  
       test01=# \dt → 테이블 목록 출력
       test01=# SELECT * FROM table01;
       test01=# INSERT INTO table01(id,name)
                  values(1,'abc');
       test01=# SELECT * from table01;
       test01=# \q
       # exit → 컨테이너 접속 해제

       - 컨테이너 중지 후 실행 여부 확인 및 이미지 존재 여부 확인
       # docker container stop (컨테이너 ID)
       # docker ps → postgres 컨테이너 실행 X
       # docker ps -a → postgres 이미지 존재                       
       
       - 컨테이너 시작 후 postgres에 Data 내용 확인
       # docker container start (컨테이너 ID)
       # docker ps → postgres 컨테이너 실행 O
       # docker exec -it (컨테이너 ID) /bin/bash → 컨테이너 진입
       # psql -U postgres 
       postgres=# \c test01 user01
       test01=# SELECT * FROM table01; → Data 저장 확인
       test01=# \q
       # exit → 컨테이너 접속 해제
       -> 컨테이너를 중지 후 다시 시작해도 Data는 유지됨

- 컨테이너 삭제, 새로운 컨테이너 생성 후 Data 접근 시도

# docker stop (컨테이너 ID)

# docker rm (컨테이너 ID)

# docker ps -a 컨테이너 삭제 확인

# docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d

postgres 동일한 내용으로 PostgreSQL 컨테이너 생성

# docker exec -it (컨테이너 ID) /bin/bash 컨테이너 진입

# psql -U postgres

postgres=# \c test01 user01 해당 사용자로 접근 불가

user01 사용자로 접근 불가

결론 : 컨테이너 삭제 후 다시 컨테이너를 생성해도 Data 접근 불가

 

 도커 스토리지 종류
1. bind mount : 도커 호스트 디렉토리를 직접 공유하는 방식
2. volume : 도커를 활용해 볼륨을 생성한 후 컨테이너의 디렉토리와 공유하는 방식
3. tmpfs : 도커 호스트 메모리에 파일이 저장되는 방식, 컨테이너 삭제 시 같이 삭제 
 
볼륨(Volume)
스토리지(저장소)의 한 영역을 분할한 것
마운트 : ‘연결’의 의미로 특정 대상을 연결해 OS 또는 소프트웨어에서 관리하기 위해 구성

 도커 이용 시 스토리지 마운트 필요성
        → 컨테이너 내 데이터가 존재한다면 컨테이너 삭제 시 데이터도 동시 삭제
        → 스토리지를 마운트하여 컨테이너 외부에 데이터를 저장