63일차 - Docker
=======
도커 호스트 (도커가 깔린 호스트)
도커 컨테이너
- 컨테이너 관련 명령어
# 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 또는 소프트웨어에서 관리하기 위해 구성
도커 이용 시 스토리지 마운트 필요성
→ 컨테이너 내 데이터가 존재한다면 컨테이너 삭제 시 데이터도 동시 삭제
→ 스토리지를 마운트하여 컨테이너 외부에 데이터를 저장