참고
Docker container 명령어
NOTE
Docker에서 가장 많이 사용되는 CLI(Command Line Interface)를 실습해보자!
흐름에 따라 위의 명령어들을 사용할 수 있다!
container 실습을 위한 이미지 생성
NOTE
vi runapp.js
# runapp.js의 내용
const http = require('http');
const server = http.createServer().listen(6060);
server.on('request', (req, res) => {
console.log('Your request arrived.');
res.write("HostName: " + process.env.HOSTNAME + "
\n");
res.end();
});
server.on('connection', (socket) => {
console.log("Your Connected.");
});
vi Dockerfile
# Dockerfile 내용
FROM node:20
-alpine3.17
RUN apk add --no
-cache tini curl
WORKDIR /app
COPY runapp.js .
EXPOSE 6060
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "runapp.js"]
Shell
복사
실습 이미지를 위한 파일 생성
docker build -t noderun:1.0 .
docker image history noderun:1.0
docker run -itd -p 6060:6060 --name=node-run -h
node-run noderun:1.0
curl localhost:6060
Shell
복사
실습 이미지 실행
생성결과
docker top | port | stats (프로세스, 포트, 통계 조회)
NOTE
# 컨테이너에서 실행 중인 프로세스 조회
docker top node-run
# 컨테이너에 매핑된 포트 조회
docker port node-run
# 컨테이너 리소스 사용 통계에 대한 실시간 스트림 출력
# (스트림 비활성화 , --no-stream)
docker stats node-run
Shell
복사
cadvisor (docker Metric 정보수집)
NOTE
실제 페이지
정보 수집
# cadvisor 컨테이너 생성 (stats와 유사한 Metric정보 수집)
docker run \
--restart=always \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=9559:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:latest
docker ps | grep cadvisor
Shell
복사
cadvisor 실행코드
docker logs (로그 정보확인)
NOTE
# 실습 컨테이너에 3초마다 요청을 보낸다.
while true; do curl 192.168.56.101:6060; sleep 3; done
# 로그 확인
docker logs -f node-run
Shell
복사
계속해서 로그가 찍힘
•
container에서 발생하는 Log는 디스크문제를 발생시킬 수 있다.
sudo vi /etc/docker/daemon.json
# 파일내용
{ "insecure-registries": ["192.168.56.101:5000"],
"log-driver": "json-file",
"log-opts": {
"max-size": "30m",
"max-file": "10"
}
}
# 도커 재시작
restart docker.service
Shell
복사
컨테이너에서 발생하는 log size를 제한하는 방법
docker cp | restart (container 내부 파일변경)
NOTE
vi runapp.js
# 기존 내용변경
const http = require('http');
const server = http.createServer().listen(6060);
server.on('request', (req, res) => {
console.log('fastcampus request arrived.');
res.write("HostName: " + process.env.HOSTNAME + "\n");
res.end();
});
server.on('connection', (socket) => {
console.log("fastcampus Connected.");
});
# 컨테이너를 재시작해서 변경된 파일을 읽도록한다.
docker cp runapp.js node-run:/app/runapp.js
docker restart node-run
Shell
복사
컨테이너 내부파일 변경
docker container cp <Container명 또는 ID>:<Container 내의 파일 경로> <Host 디렉터리 경로>
docker container cp <Host 파일> <Container명 또는 ID>:<Container 내의 파일 경로>
# test Container의 /etc/passwd 파일을 Host의 /tmp/etc에 복사
~$ docker run –itd --name=my_container centos
~$ docker cp my_container:/var/log/ /home/kevin/centos_log/
# Host의 현재 디렉터리에 있는 local.txt 파일을 text Container의 /tmp/local.txt로 복사
~$ touch local.txt
~$ docker cp ./local.txt my_container:/tmp/local.txt
~$ docker exec -it my_container ls /tmp
# webserver container 의 /etc/nginx/nginx.conf를 HostOS 경로에 복사
~$ docker run -d -p 7777:80 --name=webserver nginx:1.25.0-alpine
~$ docker cp webserver:/etc/nginx/nginx.conf /home/kevin/nginx.conf
Shell
복사
다양한 사용 방법
docker attach | exec (컨테이너 내부 명령어, 출력)
NOTE
docker run -d --name top-container ubuntu:22.04 /usr/bin/top -b
docker attach top-container
Shell
복사
실행 중인 컨테이너에 stdout, stdin, stderr 스트림을 연결한다.
docker run -itd --name=my_container alpine sh
docker exec -d my_container touch /tmp/exec_test
docker exec -it my_container sh
Shell
복사
실행 중인 컨테이너에 명령을 실행한다.
docker commit (실행중인 컨테이너 이미지화)
NOTE
docker commit node-run noderun:2.0
Shell
복사
실행 중인 컨테이너의 변경사항을 포함한 새로운 이미지 생성
Docker container 생명주기 관련 명령어
NOTE
자세한건 아래에서..
Docker kill에 대한 코드
docker run | create | start (컨테이너 생성)
NOTE
docker run
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
PowerShell
복사
docker run --name test -it --rm ubuntu:18.04
PowerShell
복사
test라는 이름으로 설정되고, 컨테이너 내부에 들어가며, 프로세스 종료되면 자동으로 컨테이너 종료됨.
•
이미지 다운로드 + 컨테이너 생성 + 실행을 동시에 하는 명령어
option | Description |
-d | detached mode 흔히 말하는 백그라운드 모드 |
-p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
-v | 호스트와 컨테이너의 디렉토리를 연결 (마운트) |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
--name | 컨테이너 이름 설정 |
-it | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 |
--rm | 프로세스 종료시 컨테이너 자동 제거 |
--link | 컨테이너 연결 [컨테이너 명:별칭] |
docker images
docker images
PowerShell
복사
•
도커 허브로부터 다운받은 이미지를 보여준다.
docker pull
docker pull centos:8
PowerShell
복사
•
run이랑 다르게 컨테이너를 생성하기 까지는 싫고, 이미지만 다운받을때 사용
docker create
create -it --name mycentos centos:7
PowerShell
복사
파일 스냅샷을 내부에 넣어줌
•
다운 받은 이미지를 통해 컨테이너를 생성 하려면, docker create 명령을 사용하면 된다.
•
--name을 통해 컨테이너 이름을 지정해줄 수 있음. (안해주면 자동으로 만들어짐)
docker start
docker start [컨테이너 이름/아이디]
PowerShell
복사
실행될 명령어를 컨테이너에 넣어주고 실행
•
컨테이너 실행 명령어
•
접속까지 하려면 docker attach [컨테이너 이름 or 컨테이너 아이디]를 추가로 입력해야함
docker ps (컨테이너 목록 확인)
NOTE
docker ps
docer ps의 결과 → 현재 하나의 컨테이너가 실행중
# 실행중인 컨테이너 목록 보기
docker ps
# 전체 컨테이너 목록 보기
docker ps -a, docker ps -all
PowerShell
복사
필드명 | 의미 |
CONTAINER ID | 컨테이너의 고유한 아이디 해쉬값.실제로는 더욱 길지만 일부분만 표출한다. |
IMAGE | 컨테이너 생성 시 사용한 도커 이미지. |
COMMAND | 컨테이너 시작 시 실행될 명령어.대부분 이미지에 내장되어 있으므로 별도의 설정이 필요없다. |
CREATED | 컨테이너가 생성된 시간. |
STATUS | 컨테이너의 상태.실행 중은 Up, 종료는 Exited, 일시정지 Pause. |
PORTS | 컨테이너가 개방한 포트와 호스트에 연결한 포트.특별한 설정을 하지 않은 경우 출력되지 않는다. |
NAMES | 컨테이너의 고유한 이름. 컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 조합해 설정한다.id와 마찬가지로 중복이 안되고 docker rename 명령어로 변경할 수 있다.$ docker rename original-name changed-name |
docker stop | kill | rm (컨테이너 제거)
NOTE
docker stop
SIGTERM을 보내고 나서 정리하는 시간을 준다.
docker stop [도커 컨테이너 이름/아이디]
PowerShell
복사
2. docker kill
SIGTERM 없이 바로 SIGKILL을 보내서 즉각적으로 컨테이너를 중지시킨다.
docker kill [도커 컨테이너 이름/아이디]
PowerShell
복사
docker rm
docker rm [컨테이너 이름/아이디] # 정지중인 컨테이너 삭제
docker rm -f, docker rm -force # 실행중인 컨테이너 삭제
docker rm -f $(docker ps -aq) # 전체 삭제
PowerShell
복사
docker rmi
docker rmi [컨테이너 이름/아이디]
PowerShell
복사
도커 이미지 삭제
docker system prune
docker system prune
PowerShell
복사
컨테이너, 이미지, 네트워크 전체삭제(실행중인 컨테이너 영향x)