컨테이너 생성
컨테이너 빠져나오기
# 컨테이너 중지 + 빠져나오기
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 |
---|