docker

BackEnd_Ash.log·2020년 5월 19일
0

docker

목록 보기
2/5
post-custom-banner

2022.05.04 docker compose

버전확인

docker -v

✅ 도커 이미지

이미지 목록 보기

sudo docker images
  • -a :sudo docker images -a

모든 이미지 출력

이미지 검색

sudo docker search [ 이미지이름 ]

이미지 생성 & build

docker build ./

Dockerfile.dev

하면 되나 혹시 개발 환경 운영환경 Dockerfile 를 나누게 된다면

docker build -f Dockerfile.dev ./

-f 옵션을 넣어줘야한다.

이미지 이름 지정

도커 이미지 그냥 생성하면 알수 없는 문자로 생성이 되는데 docker image 이름을 지정할 수 있다.

docker build -f Dockerfile.dev -t ash/nodejs ./

이미지 pull

docker pull [이미지이름] : [태그]
sudo docker pull jakdu/django_covid:0.1.0

이미지 삭제

sudo docker rmi [ 이미지 id ]

이미지 모두 삭제

docker rmi $(docker images -q) 

✅ 컨테이너

다양한 프로그램 ( nginx , database , was 등 ) 을 컨테이너 라는 격리된 환경을 이용하여 실행시킬 수 있음

컨테이너 목록보기

sudo docker ps
sudo docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS                      PORTS               NAMES
f8c3c3adf978        jakdu/django_covid:0.1.0   "gunicorn --bind 0.0…"   About a minute ago   Exited (0) 41 seconds ago                       django_covid

컨테이너 실행하기

만들어진 도커 컨테이너를 실행하는 명령어 입니다.

sudo docker run --name '컨테이너명' -d -p 8000:8000 jakdu/project:0.1.0

옵션

  • -a : 모든 컨테이너 목록 출력

docker ps 명령어를 사용하면 실행되고 있는 컨테이너만 목록에 나오게 됩니다.
하지만 옵션 -a 를 붙여준다면 정지되어 있는 컨테이너까지 출력합니다.

sudo docker run [options] image[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션설명
-ddetached mode 흔히 말하는 백그라운드 모드
-p호스트와 컨테이너의 포트를 연결 (포워딩)
-v호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e컨테이너 내에서 사용할 환경변수 설정
name컨테이너 이름 설정
--rm프로세스 종료시 컨테이너 자동제거
--link컨테이너 연결 [컨테이너 명:별칭]

컨테이너 포트 매핑 해서 실행

docker run ash/docker-nodejs

컨테이너 start , stop

docker start 컨테이너 이름

docker start django_covid

start 명령어를 사용하면 멈춰있는 컨테이너를 다시 시작 할 수 있습니다.

docker stop 컨테이너 이름

docker stop django_covid

stop 명령어를 사용하면 실행되고 있는 컨테이너를 다시 시작할 수 있습니다.

sudo docker restart [ 컨테이너 id 또는 name ]

컨테이너 접속

sudo docker attach [ 컨테이너 id 또는 name ]

컨테이너 삭제

sudo docker rm [ 컨테이너 id 또는 name ] 

모든 컨테이너 삭제

sudo docker rm 'docker ps -a -q'

✅ docker volume

docker copy 를 이용해서 docker container 에 복사를 해야하지만 ,
docker volume 을 이용하게되면 복사를 하지않고 , local 에 있는것을 매핑하게 된다.

이미지를 다시 빌드하지 않아도 소스코드가 실시간으로 변경 가능하다.
하지만 volume 을 사용하게되면 , 너무 길어지니깐 docker compose 를 사용하는것을 권장한다.

prune 한번의 정리

docker volume prune

✅ docker compose

이거 왜써 ??

docker compose 는 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구인데 ,

Docker compose 를 이용하면 compose 파일( yml 파일 )을 준비하여 커맨드를 한번 실행해서 , 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.

코드 수정하게되면 다시 이미지를 빌드할 필요없이 코드소스 변경된것이 실시간으로 반영이된다.

docker compose 기본 명령어

https://kimjingo.tistory.com/108

어떻게 사용하는데 ??

docker-compose.yml 파일이 필요

version: "3"
services:
  nodejs:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - /usr/src/app/node_modules // 참조하지않겠다.
      - ./:/usr/src/app // 참조하겠다.
    stdin_open: true
  • version: 도커 컴포트의 버전
  • services: 컨테이너들을 정의
  • nodejs: 컨테이너 이름
  • build : 현 디렉토리에 있는 Dockerfile 사용
  • context: 도커 이미지를 구성하기 위한 파일들이 있는 경로
  • dockerfile : 도커 파일 어떤것인지 지정
  • ports: 포트매핑 로컬호스트 : 컨테이너 포트
  • volumes: 로컬머신에 있는 파일들 맵핑
  • stdin_open: 리액트 앱을 종료할때 필요(버그 수정)

docker compose 실행 및 생성

docker compose up

docker compose 실행 확인

docker compose ps

docker compose 모두 확인

docker compose ps -a

docker compose 실행 & 중지

docker compose start
docker compose stop

docker compose 다시 빌드

뭔가 오타를 났다거나 , 다시 수정하고싶을땐 사용하면된다.

docker compose up --build

docker compose 테스트 작성

docker-compose.yml 부분에 밑에 추가

  test:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - /usr/src/app/node_modules
      - ./:/usr/src/app
    command: ["npm", "run", "test"]
  • test: 컨테이너 이름
  • build: 디렉토리에 있는 Dockerfile 사용
  • context: 도커 이미지를 구성하기 위한 파일과 폴더가 있는경로
  • dockerfile: 도커 파일 어떤것인지 지정
  • volumes: 로컬 머신에 있는 파일들 맵핑
  • command: 테스트 컨테이너 시작할때 실행되는 명령어

백그라운드로 실행된 컨테이너의 로그를 직접 확인

docker log -f $CONTAINER_ID

✅ docker & nginx

개발환경과 달리 운영환경은 build 폴더를 생성해서 build 폴더를 이용하게된다.

FROM node:alpine as builder
WORKDIR '/usr/src/app' 
COPY package.json .
RUN npm install
COPY ./ ./
RUN npm run build
# 여기까지는 build 폴더를 생성하기 위한 명령어이다.
# builder stage

FROM nginx
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
# run stage

📌 builder stage

build 폴더가 생성이 되면 Nginx 를 이용해서
정적파일을 제공하게 된다.

FROM node:alpine as builder
WORKDIR '/usr/src/app' 
COPY package.json .
RUN npm install
COPY ./ ./
RUN npm run build
# 여기까지는 build 폴더를 생성하기 위한 명령어이다.

📌 run stage

FROM nginx
COPY --from=builder /usr/src/app/build /usr/share/nginx/html

FROM nginx
nginx 를 위한 베이스 이미지
COPY --from=builder /usr/src/app/build
--from=builder
다른 stage에 있는 파일을 복사할때 다른 Stage 이름을 명시
/usr/src/app/build
/usr/share/nginx/html

builder stage 에서 생성된 파일들은 /usr/src/app/build 에 들어가게 되며 그곳에 저장된 파일들을 /usr/share/nginx/html 로 복사를 시켜줘서
nginx 가 웹 브라우저의 http 요청이 올때 마다 알맞은 파일을 전해 줄 수 있게 만든다.

/usr/share/nginx/html
여기로 복사하는 이유는 nginx 가 알아서 Client 에서 요청이 들어올때 알맞은 정적 파일들을 제공해준다.
설정을 통째로 바꿀수도 있다.

운영 서버 이미지 생성

docker build .

운영 서버

docker run -p 8080:80 ash/docker-react-app

nginx 는 80 이 기본 port 이다.

✅ CI CD

📌 travis

.travis.yml

# 관리자 권한 갖기
sudo: required

# 언어를 선택
language: generic

# 도커 환경 구성
services:
  - docker
  
# 스크립트를 실행할 수 있는 환경 구성 
before_install:
  - echo "start Creating an image with dockerfile"
  - docker build -t ash/docker-react-app -f Dockerfile.dev .

# 실행할 스크립트 ( 테스트 실행 ) 
script:
  - docker run -e CI=true ash/docker-react-app npm run test -- -- coverage

# 테스트 성공 후 할일
after_success:
  - echo "Test Success"

📌 github action

https://velog.io/@ggong/Github-Action%EC%97%90-%EB%8C%80%ED%95%9C-%EC%86%8C%EA%B0%9C%EC%99%80-%EC%82%AC%EC%9A%A9%EB%B2%95#quick-start

https://zzsza.github.io/development/2020/06/06/github-action/

https://docs.github.com/en/actions/quickstart

📌 docker 에러 발생

: no space left on device

에러가 발생한다면 ??
docker volume rm $(docker volume ls -qf dangling=true)
이 명령어를 입력해준다 공간이 부족해서 그렇다.

profile
꾸준함이란 ... ?
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 4월 10일

What a fantastic article! We can see that you spent a lot of time thinking up and crafting every word. The news will be spread throughout my circle of acquaintances. moto x3m

답글 달기