docker와 docker-compose

J_JEON·2023년 5월 11일
0
post-thumbnail

docker란?

  • Go언어로 작성된 리눅스 컨테이너를 기반으로하는 오픈소스 가상화 플랫폼
  • VM처럼 가상화기술을 사용하여 독립된 환경에서 애플리케이션을 실행할 수 있는 컨테이너를 생성
  • Docker file과 Docker Image를 활용해 컨테이너를 생성할 수 있음

컨테이너와 VM의 차이

  • VM은 호스트OS에서 사용중인 PC자원중 일부를 격리시키고 해당 자원을 사용해 게스트 OS를 설치하여 호스트로부터 완전히 분리된 가상화 환경을 구축할 수 있음
  • 컨테이너는 호스트OS에서 사용중인 프로세스를 격리시키고 어플리케이션 실행에 필요한 바이너리만 올린 뒤 가상화하여 사용하는것
  • VM은 OS위에 다른 OS가 올라가기에 무겁고 느릴수밖에 없지만 완전히 독립된 환경을 제공하기 때문에 더 높은 보안 격리레벨을 지원하여 보안적은 측면에서 유리함, 또한 커널을 공유하지않아 멀티OS 환경을 구축할 수 있음
  • 컨테이너는 호스트OS와 도커 엔진 위에서 동작하며 호스트OS와 커널을 공유하기때문에 성능의 효율이 좋지만 호스트OS의 커널을 공유하기때문에 멀티OS가 불가능함

Docker file 작성법

FROM	debian:buster

RUN		apt-get update -y
RUN		apt-get -y install php-fpm php-mysql curl dumb-init

EXPOSE	9000
# PORTS 8000:9000

COPY ./tools/wordpress_setting.sh /
COPY ./tools/wp-config.php /

RUN chmod +x /wordpress_setting.sh

ENTRYPOINT [ "/usr/bin/dumb-init", "--"]

CMD [ "/wordpress_setting.sh" ]
  • FROM: 기반이 되는 이미지 레이어로 <이미지이름>:<태그> 형식으로 작성함
  • RUN: 도커 이미지가 생성되기 전에 실행할 명령어
  • EXPOSE: 호스트 내부의 다른 컨테이너들만 액세스할 수 있도록 특정포트를 노출시키는것
  • PORTS: 호스트 외부, 내부의 다른 호스트및 컨테이너가 액세스할 수 있도록 특정포트를 노출시키는것, 컨테이너 내부의 9000포트가 호스트의 8000포트로 매핑되게 됨
  • COPY: 호스트OS에있는 특정 파일을 컨테이너 내부에 복사할 수 있음
  • ENTRYPOINT: CMD 명령어와 비슷하지만 무조건 실행됨, 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 지정
  • CMD: 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행할 명령어, docker run 명령어를 수행할 때 변경이 가능함, ENTRYPOINT가 있다면 ENTRYPOINT이후의 인자로 전달됨

docker-compose 란?

  • 여러개의 docker 컨테이너로 이루어진 서비스를 구축및 실행하는 순서를 자동으로 하여 관리를 간단하게 해주는 기능
  • docker-compose.yml같은 compose파일을 준비하고 커맨드를 한번 실행하는것으로 파일에 정의한 설정들을 사용해 모든 컨테이너 서비스를 시작, 정지, 삭제 할 수 있음
    만약 docker-compose를 사용하지않는다면
    네트워크 만들기
    docker network create [network]
    각 컨테이너를 네트워크에 연결
    docker run -d --name [container] --network [network][이미지]
    을 해주어야 한다

docker-compose.yml 작성법

version: '3'

services:
    nginx:
        build:
            context: ./requierments/nginx
            dockerfile: ./Dockerfile
        volumes:
            - wp:/var/www/html
        ports:
            - "443:443"
        networks:
            - intra
        depends_on:
            - wordpress
        env_file:
            - .env
        restart: always

    mariadb:
        build:
            context: ./requierments/mariadb
            dockerfile: ./Dockerfile
        networks:
            - intra
        volumes:
            - db:/var/lib/mysql
        env_file:
            - .env
        restart: always

    wordpress:
        build:
            context: ./requierments/wordpress
            dockerfile: ./Dockerfile
        depends_on:
            - mariadb
        volumes:
            - wp:/var/www/html
        networks:
            - intra
        env_file:
            - .env
        restart: always

volumes:
    wp:
        driver: local
        driver_opts:
            type: none
            o: bind
            device: 'home/$user_name/data/wordpress'

    db:
        driver: local
        driver_opts:
            type: none
            o: bind
            device: 'home/$user_name/data/mariadb'

networks:
    intra:
        driver: bridge
  • services: 생성하고자 하는 컨테이너들을 컨테이너이름, 설정 순으로 나열
  • context: 빌드명령을 실행할 경로
  • dockerfile: 빌드를 실행할 파일
    -expose: 같은 네트워크에서 접근시 사용할 포트
  • ports: 호스트에서:같은네트워크
  • env_file: 환경변수가 저장되있는 파일
  • volumes: 컨테이너에 마운트할 볼륨 경로
    db:/var/lib/mysql은 volumes의 db를 /var/lib/mysql와 연결하는것
  • depends_on: 종속성 순서대로 실행될 수 있도록 설정
  • driver: 볼륨에 사용할 볼륨 드라이버
  • driver_opts: 볼륨 드라이버에 전달할 옵션 목록
  • type: 사용할 볼륨 드라이버 유형
  • device: 호스트 파일 시스템에서 사용할 경로
  • o: 마운트 옵션

docker-compose 명령어

  • docker-compose up

    docker-compose.yml을 바탕으로 컨테이너들을 생성하기 시작
    -d 옵션을 사용하면 컨테이너를 백그라운드에서 실행시킴
    --build 옵션을 사용하면 컨테이너 시작시 dockerfile을 빌드함

  • docker-compose down

    docker-compose.yml을 바탕으로 생성한 컨테이너나 이미지들을 정지시키고 일괄적으로 삭제해줌
    --rmi all 옵션을 사용하면 모든 이미지를 삭제함
    -v 옵션을 사용하면 데이터 볼륨을 삭제함

  • docker-compose ps

    현재 작동중인 컨테이너의 목록들을 보여줌
    -q옵션을 사용하면 컨테이너 ID만 출력

  • docker-compose stop
    현재 작동중인 컨테이너들을 일괄적으로 정지함
  • docker-compose start
    현재 정지된 컨테이너들을 일괄적으로 시작함
  • docker-compose restart
    현재 작동중인 컨테이너들을 일괄적으로 재시작함

<none>:<none> 삭제하기

Docker를 사용하다보면 이미지 생성중 에러가 발생시 생기는 <none> 이미지, 컨테이너가 쌓이게 됨

  • docker rm $(docker ps --filter status=exited -q)
  • docker rmi $(docker images -f "dangling=true" -q)
    두 명령어를 사용하면 <none> 이미지와 컨테이너를 삭제할 수 있음

출처

https://tecoble.techcourse.co.kr/post/2021-08-14-docker/
https://khj93.tistory.com/entry/Docker-Docker-File-작성하기-명령어

profile
늅늅

0개의 댓글