본문 바로가기

Infra/docker & k8s

[Docker] 도커와 친해지기

컨테이너 생성

컨테이너 빠져나오기
# 컨테이너 중지 + 빠져나오기
exit
Ctrl + D

# 컨테이너 실행중 + 빠져나오기
Q
Ctrl + P
컨테이너 생성
# 컨테이너 생성 + 컨테이너 시작 + 컨테이너 내부로 들어감
# = (docker pull) > docker create > docker start > docker attach
docker run


# 컨테이너 생성
# = (docker pull) > docker create 
docker create 레파지토리이름(/이미지이름):태그
docker create --name 컨테이너이름 레파지토리이름(/이미지이름):태그

* run과 사용하는 옵션

1. docker run -d 
- detached모드. 입출력이 없는 상태로 컨테이너가 실행된다. 
- 컨테이너 내부의 프로그램이 터미널을 차지하는 포그라운드 모드로 실행돼 사용자 입력을 받지 않는다.
- 컨테이너 내부에서 프로그램이 실행되지 않으면 (포그라운드모드 프로그램이 실행되지 않으면) 컨테이너는 종료
2. docker run -i -t 
- 표준 입출력이 활성화된, 상호작용이 가능한 shell 모드. 
- 대부분의 이미지들은 컨테이너를 시작할 때, 자동으로 /bin/bash를 커멘드로 설정해 실행함으로, 배시 셸을 쓸 수 있게 설정.
3. docker run ... -e 
- 환경변수 설정

컨테이너 시작
# 컨테이너 시작 
docker start 이미지이름or이미지ID

# 컨테이너 시작 + 내부로 들어감
docker attach 이미지이름or이미지ID
컨테이너 내부에서 명령어 실행
# 컨테이너 내부에서 명령어 실행 후, 그 결과값을 반환 받는다.

docker exec

1.  db 실행 시, 포그라운드 모드로 실행이 되는데, exec 와 환경변수 설정 -e옵션을 활용해 해당 컨테이너에 환경변수를 집어넣을 수 있다.
2. exec로 mysql 컨테이너에 진입 시, exit를 써도 컨테이너 종료 x -> mysqld프로세스가 컨테이너 안에서 여전히 포그라운드 모드로 실행중이기 때문.
3.  -d모드로 포그라운드로 실행 시, exec -i -t 를 통해 해당 컨테이너의 입출력모드를 실행할 수 있다. 

* exec와 연관된 옵션

1. --link: 컨테이너 a -> 컨테이너 b로 접근 시, 가장 간단한 방법은 Nat로 할당받은 내부 Ip를 사용하는 것이다. 하지만 도커 엔진은 새로 생긴 컨테이너에 차례대로 ip를 할당하므로, alias를 써서 접근하는 것이 좋다. 이 때 사용하는게 --link옵션. ( --link 컨테이너이름:alias이름)  !!! 주의할점은 link에 입력된 컨테이너가 실행중이거나 존재하지 않는다면, --link를 적용한 컨테이너 또한 실행이 되지 않는다. 

.. --link db1:mysql ..
docker exec db2 curl mysql:3306 --silent

# 이 때, db1이 실행중이 아니거나 없다면, db2도 실행되지 않는다. 
# 즉, 컨테이너 실행 순서의 의존성도 정의해준다. (db1이 실행돼야 db2가 실행될 수 있따.)

2. -i -t 
- 표준 입출력이 활성화된, 상호작용이 가능한 shell 모드. 
- 대부분의 이미지들은 컨테이너를 시작할 때, 자동으로 /bin/bash를 커멘드로 설정해 실행함으로, 배시 셸을 쓸 수 있게 설정.

컨테이너 목록 확인 

이미지 목록 출력
docker images
REPOSITORY                   TAG       IMAGE ID       CREATED       SIZE
postgres                     14        e0865971f4e8   6 weeks ago   447MB
postgres                     17        e92968df8375   6 weeks ago   459MB
wnameless/oracle-xe-11g-r2   latest    0d19fd2e072e   5 years ago   2.1GB
컨테이너 목록 출력
# 실행중인 컨테이너 확인
docker ps 

# 정지된 컨테이너를 포함한 컨테이너 확인
docker ps -a
CONTAINER ID   IMAGE                               COMMAND                  CREATED         STATUS                        PORTS                        NAMES
84cff622fca8   postgres:17                         "docker-entrypoint.s…"   12 days ago     Exited (255) 10 minutes ago   0.0.0.0:5432->5432/tcp       local-postgres
5036c268bce8   wnameless/oracle-xe-11g-r2:latest   "/bin/sh -c '/usr/sb…"   13 months ago   Exited (255) 2 weeks ago      22/tcp, 1521/tcp, 8080/tcp   nostalgic_brahmagupta
컨테이너 이름 변경
# docker는 컨테이너 이름을 지정하지 않으면 무작위로 이름을 생성한다.
docker rename 변경전이름 변경후이름

 

컨테이너 삭제 

컨테이너 삭제

컨테이너를 삭제하면 모든 데이터를 잃게됩니다.

# 실행중이지 않은 컨테이너 삭제
docker rm 컨테이너이름

# 실행중인 컨테이너 삭제 
# 1. 정지 후 삭제
docker stop 컨테이너이름
docker rm 컨테이너이름

# 2. -f 옵션으로 삭제
docker rm -f 컨테이너이름

# 3. 모든 컨테이너 삭제
docker container prune

 

컨테이너 삭제 

컨테이너는 가상 머신과 마찬가지로 가상 IP주소를 할당받는다.

도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당하며, 컨테이너를 새롭게 생성한 후, Ifconfig명령어로 컨테이너의 네트워크 인터페이스를 확인한다. 

# (포트 바인딩)호스트의 7777번 포트를 컨테이너의 3306포트와 연결한다.
# (IP 바인딩) 호스트의 172.168.0.100:80 을 컨테이너의 80포트와 연결한다. 
# 아래와 같은 예시는 한 컨테이너의 여러개의 포트를 -p옵션을 여러번 써서 호스트에 바인딩 하는 예시이다.
docker run -i -t --name test -p 7706:3306 -p 192.168.0.100:7777:80 ubuntu:12.04

 

도커 볼륨

컨테이너가 삭제되면 ? -> 데이터가 모두 날라간다.

만약 데이터베이스용 컨테이너를 생성하면 ? -> 데이터 다날라감 ㅋㅋ

그렇다면 영속성은 어떻게 보장되는가? ->  하나의 방법으로 도커 볼륨을 사용할 수 있다.

 

'Infra > docker & k8s' 카테고리의 다른 글

[Docker] 컨테이너의 기본 개념  (0) 2025.04.16