Docker

docker 명령어 익히기

jennyiscoding 2023. 10. 8. 12:03

docker 컨테이너 실행하는 방법 :  docker run 이미지이름(run 역할 :  컨테이너 생성 밑 실행)

 

도커 클라이언트에서 서버로 보내주고 -> 서버가 로컬에 이미지가 있는지 확인 -> 없다면 도커허브에서 찾아서 실행

파일 스냅샷을 컨테이너의 하드디스크에 넣어주고 명령어도 넣어준다. 

 

docker run 이미지이름 ls : 맨 마지막에 ls가 붙으면 기존에 시작명령어를 무시하고 여기에 있는 커맨드를 실행함. 

항상 가능한 것은 아니다. ls를 실행할 수 있는 파일이 이미지 안에 있어야만 한다 

ex) docker run hello-world ls : 불가. 

 

현재 실행중인 컨테이너 나열  : docker ps 

원하는 항목만 보는 방법 : docker ps --format 'table{{.Names}}\table{{.Image}}'

Name과 image이름만 나온다. 

 

일시정지된 container까지 보는 명령어 : docker ps -a

 

docker run = docker create 이름 + docker start -a docker아이디(앞부분 일부만 써도됨)

 

docker stop / kill

시험으로 시작했던 도커 명령어 : docker run alpine ping localhost

docker stop + docker아이디(앞부분 일부만 써도됨) - 그동안 하던 작업들을 완료하고 중지 시킨다 

docker kill + docker아이디(앞부분 일부만 써도됨) - 어떠한 것도 기다리지 않고 바로 컨테이너를 중지시킨다 

 

컨테이너 삭제 : docker rm container아이디 

한꺼번에 컨테이너 모두 삭제 : docker rm `docker ps -a -q`

 

도커 이미지를 삭제 : docker rmi 이미지id

한번에 컨테이너, 이미지, 네트워크 모두 삭제 : docker system prune

 

실행중인 컨테이너에 명령어를 전달하는 것 : docker exec <컨테이너 아이디> + 실행할 명령어

ex) docker exec 0a6b28393ada ls

 

레디스 실행하기 : docker run redis(컨테이너 내부에서 레디스 서버가 동작중이다)

컨테이너 안에 들어간 다음에 redis-cli명령어를 쳐서 클라이언트 실행

docker exec -it <컨테이너아이디> redis-cli (it: 명령어를 실행한 후 계속 명령어를 적기 위함)

 

이게 번거롭기 때문에 있는 기능 : 마지막 명령어를 sh로 주면 된다. 

ex ) docker exec -it 컨테이너아이디 sh

docker exec -it 1f1d3e650ab7 sh

터미널 환경에서 빠져나오려면: Ctrl + D

 

docker이미지 만들기 

1. docker file만들기 : 

이미지에 필요한 것 : 실행될 명령어 + 파일 스냅샷

# 베이스를 명시해 준다
# FROM baseImage
FROM alpine

# 추가적으로 필요한 파일들을 다운로드 받는다. 도커 이미지가 생성되기 전 수행할 쉘 명령어.
# RUN command (다운로드할 파일 없으면 안써도 됨)

#컨테이너 시작시 실행될 명령어를 명시해준다 
# CMD ["executable"]
CMD ["echo" "hello"]

2. 빌드하기 : DOCKER_BUILDKIT=0 docker build . 

-> 빌드 결과에서 이미지 아이디를 알려줌. 

3. 실행하기 : docker run -it 72ff3d1f3282

 

도커 이미지에 이름을 주면서 생성하는 방법 : -t 도커아이디 / 저장소or프로젝트이름 : 버전

-t jenny/hello:latest로 줘보자. 

DOCKER_BUILDKIT=0 docker build -t smilejenny/hello:latest ./

 

node 서버를 실행시켜보자. 

server.js로 서버를 만든다. 

빌드 : DOCKER_BUILDKIT=0 docker build -t smilejenny/nodejs:latest ./

실행 : docker run -p 8080:8080 smilejenny/nodejs (local의 8080과 docker의 8080을 연결시켰다)

 

WORKDIR정의 : 이미지 안에서 app 코드를 갖고있을 디렉토리를 생성하는 것. working dir이 된다. 

 

Dockerfile

FROM node:10
WORKDIR /usr/src/app
COPY ./ ./
RUN npm install
CMD ["node", "server.js"]

 

다시 빌드 : DOCKER_BUILDKIT=0 docker build -t smilejenny/nodejs:latest ./

실행 : docker run -it smilejenny/nodejs sh

/usr/src/app에 코드가 복사되어있으며 현재는 경로에서 바로 시작하게 된다. 

 

Dockerfile(package.json의 변화가 없는 경우 cashe를 사용하도록 설정 => 매번 build할필요가 없어졌다)

FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY ./ ./

CMD ["node", "server.js"]

 

Docker volume사용해서 코드를 copy하지 않고 참조하도록 하기. 

docker run -d -p 8080:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app smilejenny/nodejs

 

docker compose 쓰는 이유 : 멀티 컨테이너 상황에서 쉽게 네트워크를 연결시켜주기 위해서. 

컴포즈 파일을 실행시키는 방법 :

docker-compose up --build (이미지가 없을 때)

docker-compose up (이미지가 있을 때)

docker-compose up -d (백그라운드에서 실행하는 방법)

컴포즈 파일을 중단시키는 방법 : docker-compose down

 

출처 : 인프런 존안 선생님 docker강의