docker 명령어 익히기
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강의