개발자 데뷔!

[Docker] Docker 컨테이너 본문

DevOps/Docker

[Docker] Docker 컨테이너

물꼮이 2023. 11. 30. 23:46
Docker 공식 reference)
https://docs.docker.com/engine/reference/commandline/container/
Docker File -> (build) -> Docker Image -> (run) -> Docker Container

 

  1. Container 생성
  2. Container 실행
  3. Container 상태 확인
  4. Container 정지
  5. Container 재시작
  6. Container 삭제

docker container 라이프사이클

 

 

컨테이너 명령어 모음

docker container run --name [컨테이너명 지정] -d [기반 이미지명] {컨테이너가 실행되었을 때 실행할 커맨드}
//docker container run --name ping_test -d centos /bin/ping localhost

docker container ps -a	

// 특정 컨테이너 로그 확인하는 방법 (백그라운드로 실행 중인)
docker container logs [컨테이너 id or 컨테이너 이름]
// docker container logs -t ping_test
// -t 옵션은 => 시간정보 추가 

docker container stop {컨테이너id 또는 컨테이너 명}
//docker container stop ping_test 

docker container restart {컨테이너id 또는 컨테이너 명}
// docker container restart ping_test 

docker container rm {컨테이너id 또는 컨테이너 명}
// docker container rm ping_test 
// 실행 중인 컨테이너는 삭제 불가하므로, 컨테이너 stop 후 삭제 필요 
// 단, -f, --force 옵션으로 강제 삭제 가능 

// container 전체 삭제 (stop 중인 컨테이너만) (지양)
docker container prune

 

 

 

컨테이너 실행

- run은 다운로드, 실행 바로 되었지만 아래는 따로 하는 방법 ()

docker image pull ubuntu						// 이미지 다운로드
docker container create -it --name myubuntu2 ubuntu			// 다운로드한 이미지 기반으로 컨테이너 생성
docker container start myubuntu2					// 컨테이너 시작
docker container attach myubuntu2					// 컨테이너 내부 진입

 

 

 


컨테이너와 환경변수 

옵션 의미
-e [환경변수명]=[환경변수값] 환경변수 전달 옵션 

 

코드프레소 실습 예제

아래는 '환경변수에 따라 연결된 port의 페이지 색이 변하게 만든 도커 이미지' 예제 중 하나이다. 
그냥 환경변수를 전달해 변화가 있는지 여부만 확인해보면 된다. 

 

실습예제)

- 이미지 hjhwang1/myweb_envtest:1.0 자체가 docker hub에서 다운받을 실습용 예제 이미지 

- BGCOLOR =orange 라고 환경변수를 전달 후, 다른포트 5001에 연결 => 페이지 컬러가 바뀜

docekr container run --name test1 -d -p 5000:5000 hjhwang1/myweb_envtest:1.0			// 환경변수 전달 X
docekr container run --name test2 -d -e BGCOLOR=orange -p 5001:5000 hjhwang1/myweb_envtest:1.0	// 환경변수 전달 O

 

 

환경변수 전달 X

 

환경변수 O

 


컨테이너와 포트

-p {host port}:{container port} 에서 host port와 container port 연결시켜 외부에 노출함 

  • 만약 이미 매핑된 host port를 다른 container port 와 다시 연결 지으려한다면,
  • 아래와 같은 Binding 에러 발생

Binding Error

 


컨테이너와 볼륨

- 컨테이너를 삭제하면, 컨테이너 내부에 쌓인 데이터도 함께 삭제되는 단점 (복구 불가)
- Docker 컨테이너의 데이터 => 외부에 저장 & 제공받도록 설계하는 것이 안전 (stateless)
- host의 volume을 공유하여 사용하는 방식이 대표적

 

예제)

  • host 도커 hub : /home/cys8829/mysql_db
  • container 디렉토리 : /var/lib/mysql   (mysql이 데이터를 저장할 때 사용하는 기본 디렉토리)
옵션 의미
-v [host 디렉토리]:[container 기본 디렉토리] 볼륨 연결.
 - host디렉토리container 디렉토리마운팅 시켜
완전히 동일한 디렉토리로 동작시킴(동기화 X, 그냥 완전히 같다고 봄)
즉, container 디렉토리에 쌓이는 데이터는 바로 host디렉토리(remote)에도 저장됨

 

// mysql 컨테이너 생성 
docker container run -d --name mysql_db\
-e MYSQL_ROOT_PASSWORD=1\
-e MYSQL_DATABASE=test\
-v /home/cys8829/mysql:/var/lib/mysql mysql


// mysql 컨테이너 접속
docker container exec -it {컨테이너명 or ID} bash		// exec: 실행중인 컨테이너에 커맨드를 전달&실행

// mysql 내부 명령어
# mysql -u root -p		
# show databases;				// mysql 명령어

* \는 줄바꿈 표시 (명령어를 이어씀을 뜻함)

 

- 컨테이너가 삭제되어도 데이터 삭제되지 않음 ! 

- 다른 볼륨, 이미 사용중이던 container 디렉토리 연결하면, host에 있던 내용이 덮어씌워짐