wonder

정보보안 스터디 - 10주차 2일 - docker 이미지 생성 본문

Security/리눅스

정보보안 스터디 - 10주차 2일 - docker 이미지 생성

wonder12 2022. 12. 16. 23:40

컨테이너 명령어

포트 매핑, 구동 확인
docker continaer port myweb
포트매핑이 안되어있다면 아무것도 뜨지 않습니다.
docker top myweb 
이용중인 리소스 상태가 뜹니다.
top 명령어가 없는 컨테이너도 있기 때문에 밖에서 확인합니다. 
docker rename myweb testweb
이름변경

 

 

attach vs exec 

centos의 경우 command가 bash쉘이므로

docker attach로 실행하면 bash쉘로 이용가능합니다.

docker exec -it centos /bin/bash 도 역시 가능합니다.

여기서 /bin/bash 제외하고도 단순명령어로 /bin/date, cat 등 이용합니다.

 

nginx는 command가 bash쉘이 아니므로

docker attach 로 실행하면 이상한하게 뜹니다.

이럴 경우에는 exec를 실행해야 쉘을 사용가능합니다.

 

 

 

 메모리 리소스 제한

한 컨테이너에 리소스를 너무 많이 차지 한다면 다른 컨테이너에 영향을 끼칠 것이기 때문에

리소스 제한을 하여 배분합니다.

 

lscpu
cpu정보를 확인합니다. - 4코어
lsmem
메모리 정보를 확인합니다. - 3기가

 

epel-release.noarch  외부패키지 다운가능

> stress,htop 설치 

htop
리눅스 시스템 전체 리소스 사용량을 확인합니다.
docker container stats
컨테이너 별로 리소스 사용량이 어떤지 확인합니다.

 

 

메모리의 단위는 순서대로 B K M G 이며

기본적으로 메모리를 100m으로 설정한다면 스왑메모리= 메모리+여분메모리 는 2배입니다. 

하지만 임의로 스왑메모리는 변경 가능합니다.

기본적으로 ubuntu에 stress를 설치해 만든 이미지 stress를 사용합니다.

 

 

메모리 100m + 스왑메모리는 100m 이지만 cpu에 90m의 부하를 줄 때

time docker run -m 100m --memory-swap 100m stress stress --vm 1 --vm-bytes 90m -t 5s

--vm은 프로세스 개수

--vm bytes는 부과할 용량입니다.

-t 부하 시간

100을 넘지 않았기 때문에 5초가 나옵니다.

 

 

100m 이지만 150m을 줄 때

time docker run -m 100m --memory-swap 100m stress stress --vm 1 --vm-bytes 150m -t 5s

100을 넘었기 때문에 서비스가 5초를 못넘기고 자동 중단됩니다.

기본값은 제한을 넘기면 서비스가 종료됩니다.

 

 

200m이지만 150m을 줄 때 

time docker run -m 100m stress stress --vm 1 --vm-bytes 150m -t 5s

전체 리소스 200을 넘지 않았기 때문에 중단되지 않습니다.

 

--oom-kill-disable=true

부하되더라도 강제종료 해제

 

 

 

 cpu 리소스 제한

cpu번호로 cpu에 부하를 줄 수 있습니다.

docker run --cpuset-cpus (0~3) --name cpu1 -d stress stress --cpu 1 

0~3번째 cpu에 cpu에 부하를줍니다

htop으로 100%를 확인합니다.

 

컨테이너 별로 cpu 가중치 다르게 할당

docker run -c 2048 --name cload1 -d stress 

docker run -c 1024 --name cload2 -d stress

..

docker stats 로 확인

 

 

iops

읽기, 쓰기속도 상승

 

 

 

 

 이미지 생성 방법

1. 작업하면서 추가한 레이어를 쌓은 상태로 이미지 생성이 가능합니다.

예를 들어 유저를 추가하고, 파일을 추가하엿을 때

 

docker container run -dit --name test centos
docker exec -it centos /bin/bash
useradd test1
touch file

 

docker container commit -a "hong gil dong" -m "centos-img"  test wonder/test:1.0

현재 컨테이너를 저자, 주석을 추가해 이미지로 만듭니다.

 

 

컨테이너를 삭제하고 다시 구동시켰을 때 생성한 파일이 유지되는 것을 확인할 수 있습니다.  

 

diff를 이용해 원본과 비교합니다.

또한 inspect로도 레이어가 쌓여있는 것을 확인할 수 있습니다.

 

도커 로그

nginx 누가 80포트로 접속하였을 때 응답을 하면서 logs에 남습니다.

centos 쉘로 설정한 명령어들이 logs에 남습니다.

 

 

 

2. github에 있는 파일을 컨테이너에 설치하고 이미지를 생성이 가능합니다.

apt update > jdk 자바 개발 키트 > git 설치

 

 

 

3. tar 압축파일에서 바로 이미지 생성합니다.

cat testweb.tar | docker image import - wonder/testweb:1.0

 

 

컨테이너 백업

컨테이너 파일을 tar로 백업하기 위해 압축파일 tar로 만듭니다.

docker container export testweb > testweb1.tar

 

 

 

 

 

 

 Docker 파일을 이용한 이미지 생성

 

 nginx 이미지의 설정파일만 바꿔서 이미지를 만들고 싶을 때

 

물론 nginx 를 컨테이너로 다운받아서 안에서 conf 설정 변경한 뒤 

commit으로 이미지를 만들 수가 있지만 더 간단하게 하기 위해 Dockerfile 방법을 사용합니다.

docker container run -itd nginx cat /etc/~.conf > /test/.conf
Dockerfile을 작성

FROM apache:4

COPY /test/file.conf /usr/lib/share ~
(이외에도 RUN, CMD가능)
build -t sample:1.0 . 로 이미지를 생성하면서 리눅스에 있는 파일을 공유할 수 가 있습니다.  

 

 

압축 파일로 생성하는 방법도 있습니다.

tar czvf image.tar.gz dockerfile file1
dockerfile, file1 을 압축합니다. 
tar tvf image.tar.gz
tar 내용물 확인
build -t sample:2.0 - < image.tar.gz
tar.gz 압축된 것을 풀면서 이미지 생성이 가능합니다.

 

 

 

 

 

 

 

 

 

Comments