- Docker 기본 명령어

**** 이미지 관련  ****

# 1. 이미지 목록 확인하기
- docker images : 전체 이미지 목록 확인

# 2. 이미지 다운로드하기(pull)
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- docker pull ubuntu:14.04 : 우분투 이미지 다운로드.
- 같은 태그이지만 이미지가 업데이트 된 경우 pull 명령어를 통해 최신 버전으로 다시 다운로드 받을 수 있다.

# 3. 이미지 삭제하기(rmi)
docker rmi [OPTIONS] IMAGE [IMAGE...]
- docker rmi [이미지 ID]

# 4. 이미지 이름, 태그 변경하기
docker image tag <기존의 이미지명>:<기존의 태그명> <새로운 이미지명>:<새로운 태그명>
docker image tag mediasol_gamble_app:0.0.1 sjh/mediasol_gamble_app:0.0.2

**** 컨테이너 관련 ****

#1. 컨테이너 목록 확인
- docker ps	#실행중인 컨테이너 목록
- docker ps -a	#전체 컨테이너 목록
- docker ps -all	#전체 컨테이너 목록 + 세부사항

#2. 컨테이너 중지
- docker stop [컨테이너 ID]

#3. 중지된 컨테이너 제거
- docker rm [컨테이너 ID]
- 중지된 컨테이너 전체 삭제 : docker rm -v  $(docker ps -a -q -f status=exited)

#4. 컨테이너 실행
- docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

#5. 컨테이너 로그 확인하기
- 컨테이너가 정상적으로 동작하는지 확인하는 방법 중 하나는 로그를 확인하는 것
- 도커는 로그파일을 표준 스트림(stdout, stderr)를 수집. 컨테이너에서 실행되는 프로그램의 로그 설정을 파일이 아닌 표준출력으로 변경해야 한다.
- 출력 방식을 바꾸는 것으로 모든 컨테이너는 로그에 대해 같은 방식으로 관리할 수 있다.
- 컨테이너의 로그파일은 json 방식으로 어딘가에 저장이 된다. 
- Docker은 다양한 플러그인 지원을 통해 json이 아닌 특정 로그 서비스에 스트림 전달이 가능하다.

- docker logs [컨테이너 ID] : 해당 컨테이너의 전체 로그 확인하기
- docker logs --tail 10 [컨테이너 ID] : 마지막 로그 10줄 확인하기
- docker logs -f [컨테이너 ID] : 실시간으로 로그가 생성되는 것 확인하기, 중지 : ctrl + c

#6. 컨테이너 명령어 실행
- 실행중인 컨테이너에 들어가보거나 컨테이너의 파일을 실행시키고 싶을 때 해당 명령어를 생성한다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 쉘 권한을 얻어 MySQL 컨테이너 접속
docker exec -it mysql /bin/bash
$ mysql -uroot
- 쉘 권한 없이 mysql 명령어를 실행
docker exec -it mysql mysql -uroot

#7. 컨테이너 업데이트
- 컨테이너를 새로운 버전으로 업데이트하기.

- 새 버전의 이미지를 다운(pull) -> 컨테이너 삭제(stop, rm) -> 새 이미지를 기반으로 새 컨테이너 실행
- 컨테이너를 삭제한다는 것 : 데이터베이스라면 쌓아놨던 데이터가 모두 사라짐, 웹 어플리케이션이라면 그동안 사용자가 업로드한 이미지가 모두 사라짐
- 따라서 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지에 저장해야 한다. -> AWS와 같은 클라우드 서비스 이용 OR 데이터 볼륨(Data volumes)를 컨테이너에 추가해서 사용해야 한다.
- 데이터 볼륨을 사용하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않는다.

#8. 데이터 볼륨 사용하기
- 호스트의 디렉토리를 마운트해서 사용하는 방법.
- 컨테이너가 삭제될 시 db를 보존하기 위해 호스트 경로로 저장되도록 설정한다.
- run 명령어의 -v 옵션 사용.

> docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
- 호스트의 /my/own/datadir 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로 마운트
- 데이터베이스 파일은 호스트의 /my/own/datadir 디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않는다.

- docker-compose에서의 설정 
volumes: - /Users/msgamble/con_volumes/mariadb/data:/var/lib/mysql	# :을 중심으로 왼쪽은 호스트 경로, 오른쪽은 컨테이너 경로
volumes : - /val/lib/mysql 
volumes :  /docker/app/db:/val/lib/mysql 

**** docker-compose 관련 명령어 ****

#1.  이미지 빌드와 컨테이너 생성
docker-compose up -d 

#2.  이미지 리빌드와 해당 컨테이너 변경
docker-compose up -d --force-recreate --build






