본문 바로가기
DevOps/Docker

docker 사용해보기

by oncerun 2023. 5. 30.
반응형

 

tip : docker를 쓰지 않으면 용량이 매우 커진다. 따라서 도커를 모두 정리하고 싶다면 docker system prune이라는 명령어로 컨테이너, 이미지, 네트워크를 모두 삭제할 수 있다. 그리고 이 명령어는 실행 중인 컨테이너에 영향을 주지 않는다.

 

docker exec < container Id>라는 명령어를 사용한다. 

 

간단하게 redis를 도커에 설치하여 redis cli를 이용하여 redis server에 명령어를 전달해 보자. 

docker run redis
1:C 30 May 2023 12:20:02.299 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 30 May 2023 12:20:02.299 # Redis version=7.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 30 May 2023 12:20:02.299 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 30 May 2023 12:20:02.299 * monotonic clock: POSIX clock_gettime
1:M 30 May 2023 12:20:02.300 * Running mode=standalone, port=6379.
1:M 30 May 2023 12:20:02.300 # Server initialized
1:M 30 May 2023 12:20:02.300 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 30 May 2023 12:20:02.301 * Ready to accept connections

 

어 그런데 컨테이너 안에 명령어를 어떻게 전달하지?

 

exec 명령어를 사용해 보자.

 

우선 레디스가 실행 중인 서버에 들어가 명령어를 전달하자.

docker exec -it 8537 redis-cli

 

여기서 -it 옵션이 있어야 명령어를 실행한 후 계속 명령어를 적을 수 있다.

(iteractive terminal을 의미한다.)

 

 

여기서 알아야 하는 점은 컨테이너 밖에서는 컨테이너 안으로 바로 접근할 수가 없다. 

그렇기에 컨테이너 안으로 진입하여 접근해야 한다는 점이다. 

 

그런데 도커 명령어를 전부 하나하나 치는 것은 너무 번거롭다.  

 

그냥 컨테이너 안에 접속하여 명령어를 연달아 할 수는 없을까? 

 

이는 exec 명령어와 -it 옵션을 합치고 각 이미지에서 제공해 주는 여러 쉘을 사용하면 된다.

 

bash, zsh, powershell, sh를 사용하면 바로 터미널에 접근할 수 있다.

 

PS C:\Users\PC> docker ps
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS         PORTS     NAMES
2eaa0449455f   alpine    "ping localhost"   3 seconds ago   Up 3 seconds             boring_bhabha
PS C:\Users\PC> docker exec -it 2eaa sh
/ # ls
bin    home   mnt    root   srv    usr
dev    lib    opt    run    sys    var
etc    media  proc   sbin   tmp
/ #

 

 

도커 이미지를 도커 허브에서 받기만 해야 할까? 보통 사용하려는 프로그램을 각 커스텀하여 이를 이미지로 만들고 private 도커 허브에 놓고 사용하는 것이 더 보편적일 것이라고 생각된다.

 

그래서 직접 도커 이미지를 만들어보자.

 

도커이미지를 생성하기 위해서는 Dockerfile을 작성해야 한다. 

 

docker file은 docker image를 만들기 위한 설정파일입니다. 컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의하는데, 이를 file 형태로 보관했다가 사용하는 것도 나쁘지 않은 선택으로 보인다. 

 

이러한 docker file은 도커 클라이언트에게 전달되면 도커 클라이언트는 도커 서버에게 이를 전달하고 작업을 시작하고 마지막으로 이미지를 생성합니다. 

 

Docker 파일을 생성하고 다음과 같이 작성해 본다.

 

# base Image
FROM ubuntu


# 필요한 파일 다운로드
# RUN command

# 컨테이너 시작 시 실행 될 명령어 작성
CMD echo "Hello Dockerfile"

 

 

도커 파일을 서버가 인식할 수 있도록 docker build 명령어를 사용해 보자. vscode에서 docker extension을 사용하면 손쉽게 빌드할 수 도 있다.

 

docker build ./

 

명령어로 현재 파일에서 Dockerfile을 찾아서 빌드하도록 해보자.

빌드했는데 어떠한 출력물이 생긴 것은 아니다. 

 

도커는 임시 컨테이너에 Dockerfile을 기반으로 파일 스냅숏과 명령어와 같은 정보를 넣고 임시 컨테이너를 이미지로 만들어 제공해 준다.  결국 이 과정이 새로운 이미지를 만드는 과정인 것이다.

 

빌드할 때 이미지의 이름을 부여해서 더 쉽게 사용해 보자.

 

다음과 같은 컨벤션이 있다고 하니까 이를 지켜보자.

-t dockerId / 저장소//프로젝트 이름 : 버전
PS C:\Users\PC\OneDrive\Desktop\docker> docker build -t dbtjddlf2001/hello:0.0.1  ./  
[+] Building 1.6s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                                                   0.1s 
 => => transferring dockerfile: 204B                                                                   0.0s 
 => [internal] load .dockerignore                                                                      0.1s 
 => => transferring context: 2B                                                                        0.0s 
 => [internal] load metadata for docker.io/library/ubuntu:latest                                       1.5s 
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                          0.0s 
 => CACHED [1/1] FROM docker.io/library/ubuntu@sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e4749259  0.0s 
 => exporting to image                                                                                 0.0s 
 => => exporting layers                                                                                0.0s 
 => => writing image sha256:360c2ceb976d81609055e7c42ae6919dc32b71f0799fbb9236bc861f7d5e507f           0.0s 
 => => naming to docker.io/dbtjddlf2001/hello:0.0.1

 

이제 한 번 실행해 보자.

PS C:\Users\PC> docker run dbtjddlf2001/hello:0.0.1
Hello Dockerfile

 

여기까지 도커의 기본 명령어와 기본 동작, 숨어있는 리눅스 커널을 공유하는 컨테이너들, 과거 VM에 비한 장점, 실제 이미지 생성 및 실행까지 해보았다. 

 

최종 목표는 여러 도커 컨테이너를 띄우고 로드밸런서 역할을 하는 리버스 프락시 하나 두고 로드밸런싱 해보고 싶고.. 뭐 여러 가지를 도커를 활용한 다음 컨테이너 클러스터링도 공부해서 실제 적용해보고 싶은 마음이다.

 

다음에는 실제로 간단한 애플리케이션을 만들고 배포하는 과정을 간단히 실습해 볼 것이다.

반응형

댓글