docker-compose.yml 파일 내용 변경 시 컨테이너 재기동
# cd /mongodata
# vi docker-compose.yml
services:
mongo1:
image: mongo:latest
container_name: mongo1
restart: always
ports:
- 27017:27017
volumes:
- ./data/mongo1:/data/db
command: ["mongod", "--replSet", "myReplicaSet", "--bind_ip_all"]
networks:
- mongoCluster
## 추가 start
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
## 추가 end
mongo2:
image: mongo:latest
container_name: mongo2
restart: always
ports:
- 27018:27017
volumes:
- ./data/mongo2:/data/db
command: ["mongod", "--replSet", "myReplicaSet", "--bind_ip_all"]
networks:
- mongoCluster
## 추가 start
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
## 추가 end
mongo3:
image: mongo:latest
container_name: mongo3
restart: always
ports:
- 27019:27017
volumes:
- ./data/mongo3:/data/db
command: ["mongod", "--replSet", "myReplicaSet", "--bind_ip_all"]
networks:
- mongoCluster
## 추가 start
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
## 추가 end
networks:
mongoCluster:
external: true
--로그 설정 확인 (변경 전)
# docker inspect mongo1 | grep -A 5 LogConfig
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "mongoCluster",
"PortBindings": {
# docker compose up -d --no-deps --force-recreate mongo1 mongo2 mongo3 ## docker-compose.yml파일이 있는 곳에서 실행
[+] Running 3/3
✔ Container mongo3 Started 11.5s
✔ Container mongo1 Started 11.7s
✔ Container mongo2 Started 11.7s
/*
. --no-deps: 지정한 서비스(mongo1, mongo2, mongo3)만 대상으로 하며, 이들이 의존하는 다른 서비스((예: db, cache 등)는 영향받지 않음
. --force-recreate: 변경 사항이 있는 경우 컨테이너를 반드시 새로 생성
. -d : 백그라운드(detached) 모드로 실행
*/
--로그 설정 확인 (변경 후)
# docker inspect mongo1 | grep -A 5 LogConfig
"LogConfig": {
"Type": "json-file",
"Config": {
"max-file": "3",
"max-size": "10m"
}
--호스트의 쉘을 컨테이너 안에서 실행
# docker run -it --privileged --pid=host ubuntu nsenter -t 1 -m -u -n -i sh
/*
. docker run -it : 새 컨테이너를 인터랙티브(터미널 연결) 모드로 실행
. --privileged : 컨테이너에 거의 모든 호스트 권한을 부여(장치, 커널 기능 등 포함)
. --pid=host : 컨테이너가 호스트의 PID(namespace)를 공유하도록 설정함. 즉, 컨테이너에서 호스트의 모든 프로세스를 볼 수 있음.
. ubuntu: 베이스 이미지(여기서는 Ubuntu 리눅스)
※ 대표적으로 사용할 수 있는 공식 베이스 이미지 : debian, ubuntu, alpine, centos 등
. nsenter: 네임스페이스 진입을 위한 리눅스 명령어
※ #which nsenter
/usr/bin/nsenter
. -t 1 : 타겟 PID 1(리눅스 시스템의 init 프로세스, 즉 호스트의 루트 프로세스)을 지정
. -m -u -n -i : 각각 mount, UTS(호스트명), network, IPC 네임스페이스에 진입
. sh : 진입 후 실행할 쉘
*/
--컨테이너 리스트 확인
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
...
d931f156bd69 ubuntu "nsenter -t 1 -m -u …" About an hour ago Up 5 minutes sleepy_visvesvaraya
...
# cd /var/lib/docker/containers/<컨테이너ID>
# ls -al *.log
-rw-r----- 1 root root 1266744 May 12 06:18 <컨테이너ID>-json.log
/*
해당 컨테이너가 내려가 있다면
*/
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d931f156bd69 ubuntu "nsenter -t 1 -m -u …" 2 hours ago Exited (137) 33 seconds ago sleepy_visvesvaraya
# docker start <컨테이너ID>
d931f156bd69...
# docker exec -it <컨테이너ID>
bash# cd /var/lib/docker/containers/<mongo1 컨테이너ID>
bash# # ls -al *.log
-rw-r----- 1 root root 1315230 May 12 06:36 <mongo1 컨테이너ID>-json.log