본문 바로가기
Security Project

5. 도커 컨테이너 활용

by 귀멸 2022. 8. 7.

현재 대부분의 서비스들이 클라우드로 넘어가면서 도커를 이해하지 않고는 클라우드 환경을 이해 할 수 없게 되었기 때문에 모의 침투에서도 해당 서비스에 대한 이해가 필요하다.

 

0. 도커(Docker)

 - 컨테이너 기술을 지원하는 프로젝트 (컨테이너 기술의 사실 상 표준)

 - 다양한 운영체제에 사용 하지만 주로 리눅스에서 사용

 - Docker Engine 위에 프로세스 단위로 배포된 이미지를 실행하는 가상화 환경

 - 서비스 단위로 자원을 줄이거나 확장 시키는 스케일링이 가능 

 - 라이브러리 종속성을 고민하지 않고 설치 가능

 

1. 도커컨테이너 활용

  - Registry : 컨테이너 이미지들을 데이터 베이스를 통해 제공 

                     누구나 이미지를 만들어 올리는 PUSH 

                     필요한 이미지를 가져가는 PULL이 가능하다.

 

   - 회사나 개인이 고유의 Registry를 구축할 수 있으나 일반 사용자는 Docker Hub Registry를 사용

 

2. 도커컨테이너 환경 구축

Step 1. 칼리리눅스 터미널에서 도커 패키지 설치

sudo apt-get update

sudo apt install docker.io : 설치 완료

 

sudo docker             : 기본 명령어 리스트 

sudo docker version : 버전 확인

 Version:    20.10.14+dfsg1
 Go version:        go1.18.1

 

sudo docker system info   : 상세 정보 (설치/동작/멈춤 중인 컨테이너 / C groups)

sudo docker system df      : 각 이미지들 용량 정보

 

Step 2. 필요한 이미지 레지스트리에서 PULL

sudo docker pull nginx    : 웹서버 서비스

sudo docker images        : 설치된 이미지들 목록 출력

 

3. 도커 컨테이너 기본 명령어 

도커 이미지 검색

dockerhub에서 official 이미지를 검색하고 필요한 이미지를 설치한다.
도커 내에서 검색하는 방법은 

sudo docker search [이미지명]       official로 등록되어 있는 것을 사용하자

sudo docker search --filter=stars=1000 [이미지명]     : filter 사용하여 검색

sudo docker search --limit=10 [이미지명]                   : 상위 10개만 검색

취약 서버 이미지도 많이 등록되어 있음

 

sudo docker container run --name [컨테이너 네임] -d[백그라운드 동작] -p[포트] [로컬 지정 포트 번호] : [서비스 포트 번호] [이미지명]

sudo docker container run --name nginx_web -d -p 80:80 nginx 

sudo docker ps  : 프로세스 확인

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
300c690fc187   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 7 seconds   0.0.0.0:80->80/tcp             nginx_web

 

브라우저에서 localhost로 들어가면 웹서버 페이지 접속

sudo docker pull        :  컨테이너 이미지를 로컬 캐시에 다운로드

sudo docker start      : 더이상 실행 중 상태가 아닌 컨테이너 인스턴스를 시작

sudo docker stop      : 실행중인 컨테이너 인스턴스를 중지

sudo docker restart   : 실행중인 컨테이너 인스턴스를 다시시작

sudo docker inspect  : 컨테이너 상태에 대한 자세한 정보를 표시

sudo docker attach    : 사용자가 실행중인 Docker 컨테이너 인스턴스의 기본 프로세스에 대한 액세스 권한을 얻거나 연결

sudo docker exec      : 실행중인 컨테이너 내에서 명령을 실행

sudo docker rm         : 중지 된 컨테이너를 삭제

sudo docker rmi        : 컨테이너 이미지를 삭제

sudo docker container ls : 실행중인 컨테이너 확인

sudo docker container ls -a : 실행/비실행 중인 컨테이너 확인 

sudo docker container ls -a -q : 모든 컨테이너 아이디만 조회

sudo docker rm 'sudo docker container ls -a -q' : 모든 컨테이너 삭제

sudo docker container prune  : 중지된 모든 컨테이너 제거

sudo docker image prune       : 태그가 없는 모든 이미지 파기

sudo docker system prune      : 사용라지 않는 모든 데이터 삭제

sudo docker container stats     : 컨테이너 사용 현황 출력

 

sudo docker volume create [볼륨명] : 볼륨 생성

sudo docker volume ls : 생성된 볼륨 확인

sudo docker volume rm [볼륨명] : 볼륨 제거

sudo docker stop [볼륨명]           : 볼륨 사용 정지

 

4. 도커 볼륨을 이용한 데이터베이스 운영 실습

 

  Step 1. 데이터베이스를 할당할 볼륨 생성 

┌──(kali㉿kali)-[~]
└─$ sudo docker volume create mysql-vol01
mysql-vol01


  Step 2. mysql 컨테이너 생성하면서 루트 암호 및 데이터 베이스 생성                                                                                 
┌──(kali㉿kali)-[~]
└─$ sudo docker run -it --name=mysql01 \     : 컨테이너 이름                      
> -e MYSQL_ROOT_PASSWORD=test \        : mysql 루트 암호 설정
> -e MYSQL_DATABASE=test \                       : mysql db 생성
> -v mysql-vol01:/var/lib/mysql -d \                  : volume 할당
> mysql:5.7                                                      : 사용할 이미지 없으면 자동으로 pulling해서 설치
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql

 

   Step 3. mysql 컨테이너 bash 쉘로 진입하여 mysql  명령 실행

┌──(kali㉿kali)-[~]
└─$ sudo docker exec -it mysql01 bash   
bash-4.2# mysql -u root -p 
Enter password: 

mysql> show databases;          :  생성했던 test db를 확인할 수 있다
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> create database projectluk;     : 추가로 데이터 베이스 하나 더 생성
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| projectluk         |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

 

   Step4. log 파일 확인

┌──(kali㉿kali)-[~]
└─$ sudo su -                        
┌──(root㉿kali)-[~]
└─# cd /var/lib/docker/volumes                  
                                                                                                                      
┌──(root㉿kali)-[/var/lib/docker/volumes]
└─# ls    
backingFsBlockDev  metadata.db  mysql-vol01  my-volume01
                                                                                                                      
┌──(root㉿kali)-[/var/lib/docker/volumes]
└─# cd mysql-vol01            
                                                                                                                      
┌──(root㉿kali)-[/var/lib/docker/volumes/mysql-vol01]
└─# ls
_data
                                                                                                                      
┌──(root㉿kali)-[/var/lib/docker/volumes/mysql-vol01]
└─# cd _data      
                                                                                                                      
┌──(root㉿kali)-[/var/…/docker/volumes/mysql-vol01/_data]
└─# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1      performance_schema  public_key.pem   sys
ca-key.pem  client-key.pem   ib_logfile0  mysql       private_key.pem     server-cert.pem  test
ca.pem      ib_buffer_pool   ib_logfile1  mysql.sock  projectluk          server-key.pem

 

5. 도커 파일 활용하기

 도커파일에 스크립트로 저장된 내용대로 이미지 pulling 및 파일생성, 환경설정을 한번에 할 수 있음

 

 Step 1. 폴더를 하나 만들고 Dockerfile이라는 이름으로 아래 구문 작성 후 저장

┌──(kali㉿kali)-[~]
└─$ mkdir docker
                                                                                                                      
┌──(kali㉿kali)-[~]
└─$ cd docker                                   
                                                                                                                      
┌──(kali㉿kali)-[~/docker]
└─$ vim Dockerfile
                                                                                                                      
┌──(kali㉿kali)-[~/docker]
└─$ cat Dockerfile 
FROM ubuntu:latest       : 반드시 들어가야하는 내용 컨테이너의
LABEL email=admin       : 선택사항 주석 같은 느낌
CMD ["echo", "Hello Dokerfile"]   : 실행 명령어

 

 Step 2. 도커 파일을 이용한 이미지 빌드

┌──(kali㉿kali)-[~/docker]
└─$ sudo docker build -t ubuntu:v1.0 .         : -t tag 명  마지막에 .은 작성한 Dockerfile을 쓴다는 의미

 

 Step 3. 빌드한 이미지 run

┌──(kali㉿kali)-[~/docker]
└─$ sudo docker run ubuntu:v1.0      : 도커파일에 설정한대로 설치되고 명령어들이 실행됨

 

 

6. 불필요한 이미지 정리하기

  Step 1. 현재 가지고 있는 이미지들 출력

┌──(kali㉿kali)-[~/docker]
└─$ sudo docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    b692a91e4e15   4 days ago    142MB
ubuntu       latest    df5de72bdb3b   5 days ago    77.8MB
mysql        5.7       3147495b3a5c   11 days ago   431MB

 

 Step 2. root 권한으로 현재 사용하고 있지 않은 이미지들 삭제

┌──(kali㉿kali)-[~/docker]
└─$ sudo su -                                
┌──(root㉿kali)-[~]
└─# sudo docker rmi -f $(docker images -a -q)            
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:34fea4f31bf187bc915536831fd0afc9d214755bf700b5cdb1336c82516d154e
Deleted: sha256:df5de72bdb3b711aba4eca685b1f42c722cc8a1837ed3fbd548a9282af2d836d
Error response from daemon: conflict: unable to delete b692a91e4e15 (cannot be forced) - image is being used by running container 300c690fc187
Error response from daemon: conflict: unable to delete 3147495b3a5c (cannot be forced) - image is being used by running container d74b2215ea21

댓글