본문 바로가기
기타 IT 지식/DevOps

[Docker] DockerHub에 내 이미지를 올려보자! (feat. docker-compose)

by 코뮤(commu) 2023. 8. 3.
728x90
반응형

해당 포스팅은
"원티드 프리온보딩 백엔드 8월 코스" 를 수강하며 강의 내용을 정리해본 것입니다.

문제가 있는 내용이거나 오류가 있다면 댓글로 남겨주시면 감사하겠습니다.

 

Dockerfile syntax

아래는 Dockerfile 에서 사용하는 여러 키워드들이다.

 

  • FROM: 베이스 이미지 선정
  • WORKDIR: work directory 선정
  • COPY: 복사할 파일 선정
  • RUN: 실행할 명령어
  • ENTRYPOINT: 컨테이너가 시작할 때 실행할 명령어

 

도커이미지를 도커 허브에 올려보자!

 

이미지 생성은 아래의 명령어로 할 수 있다.

 

docker build -t my-httpd .

 

만약 이렇게 만들어진 이미지를 도커 허브에 올리고 싶다면, 이미지 이름은 아래 규칙을 따라야한다.

 

[Docker Hub 사용자명]/이미지명:[태그명]

 

예시 - 사용자명은 eunbiiim 이라는 가정!

 

이렇게 이미지를 만들고 나면, docker login 을 해주자!

 

docker login

 

이후 push 를 해주면 된다.

 

docker push [이미지이름]

 

만약 login 없이 push 를 하게 된다면, 당연하게도 access 가 deny 된다. 주의하자!

 

 

만약 성공적으로 push 되었다면, dockerhub > 자신의 프로필에서 내 이미지를 확인할 수 있을 것이다.

 

 

도커 네트워크

 

docker network ls

 

위 명령어로 네트워크 리스트를 확인해볼 수 있다.

디폴트로 bridge, host, none 이 있다.

 

  • bridge: 기본 네트워크 드라이버로, 동일한 도커 호스트에서 컨테이너간의 통신을 맡는다.
  • host: 호스트의 네트워크를 직접 사용한다.
  • overlay: 서로 다른 도커 호스트의 컨테이너 간 통신을 도와준다.

 

이번 원티드 실습에서는 bridge 를 주로 보게 될 것이다.

 

docker network inspect bridge

 

해당 네트워크에 대해 좀 더 자세하게 보고 싶다면, inspect 키워드를 이용하면 된다.

위 명령어의 bridge 대신 host, overlay 등등 네트워크의 이름을 넣으면 된다.

 

 

Docker-compose

 

만약 여러 개의 컨테이너를 빌드하고, 실행해야한다면 어떻게 해야할까?

컨테이너가 늘어나면 늘어날 수록 관리포인트는 커질 것이다.

이를 한번에 관리할 수 있도록 해주는 것이 바로 docker-compose 이다.

 

 

우선 아래 명령어로 네트워크를 만들어주자.

docker network create wordpress_net

 

docker \
run \
    --name "db" \
    -v "$(pwd)/db_data:/var/lib/mysql" \
    -e "MYSQL_ROOT_PASSWORD=root_pass" \
    -e "MYSQL_DATABASE=wordpress" \
    -e "MYSQL_USER=docker_pro" \
    -e "MYSQL_PASSWORD=docker_pro_pass" \
    --network wordpress_net \
mysql:latest

위의 명령어를 실행하면, mysql 이미지를 가져와 실행해 줄 것이다.

다음으로, 아래 명령어를 실행해 워드프레스 컨테이너도 실행시켜주자.

 

docker \
    run \
    --name app \
    -v "$(pwd)/app_data:/var/www/html" \
    -e "WORDPRESS_DB_HOST=db" \
    -e "WORDPRESS_DB_NAME=wordpress" \
    -e "WORDPRESS_DB_USER=docker_pro" \
    -e "WORDPRESS_DB_PASSWORD=docker_pro_pass" \
    -e "WORDPRESS_DEBUG=1" \
    -p 8000:80 \
    --network wordpress_net \
wordpress:latest

 

정상적으로 실행되었다면, 아래 명령어를 실행한 후 실행되고 있는 두 개의 컨테이너들이 보일 것이다.

 

docker ps

 

그런데... 이렇게 길고 복잡한 명령어를 컨테이너를 만들고 실행할 때마다 적어줘야할까?

헬파티! 헬파티! 커맨드 라인이 여러 줄이면 관리하기 너무 힘들고, 타이핑 하기도 너무나.. 귀찮다.

이럴 때, docker-compose 를 쓰면 된다.

 

docker-compose 란?

  • 도커 컨테이너를 일괄적으로 정의하고 제어하는 도구
  • 설정 파일을 도커 CLI로 번역하는 역할

 

아래와 같은 yml 파일이 있다고 가정할때,

docker compose 명령어를 이용해서 컨테이너 관리를 손쉽게 할 수 있다.

 

version: "3.0"

services:
  db:
    image: mysql:latest
    volumes:
      - ./db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: docker_pro
      MYSQL_PASSWORD: docker_pro_pass
  
  app:
    depends_on: 
      - db
    image: wordpress:latest
    volumes:
      - ./app_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: docker_pro
      WORDPRESS_DB_PASSWORD: docker_pro_pass

이런 yml 파일을, 아래 명령어로 실행시켜주자!

 

docker compose -f [파일 이름] up --build

 

(build 옵션은 시작하기 전 이미지를 먼저 생성하라는 옵션이다.)

 

docker compose file

 

좀 더 자세하게 알아가보자,

  • version
  • services : 컨테이너들의 정의가 들어간다.
    • 실행하려는 컨테이너들을 정의하는 역할
    • 이름, 이미지, 포트 매핑, 환경 변수, 볼륨 등을 포함
    • 해당 정보를 가지고 컨테이너를 생성하고 관리
    • image: 컨테이너를 생성할 때 쓰일 이미지 지정
    • build: 정의된 도커파일에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 함.
    • environment : 환경변수 설정
    • command: 컨테이너가 실행될 때 수행할 명령어(docker run 명령어의 마지막 커맨드와 동일)
    • depends_on: 컨테이너 간의 의존성 주입.
    • ports: 개방할 포트 지정, docker run 명령어의 -p 와 같다.
    • expose: 링크로 연계된 컨테이너에게만 공개할 포트 설정
    • volumes: 컨테이너에 볼륨 마운트
    • restart: 재시작 정책
      • no: 재시작 x
      • always: 외부 영향에 의해 종료되었을때 항상 재시작
      • on-failure: 오류가 생겨 종료되었을 때만 재시작
  • network : 이 컨테이너들이 공유할 network 를 정의한다. (지정해주지 않아도 [이름_default]으로 하나 만들어준다.)
  • volumn
  • config
  • secret

 

그만 알아보자.

공식문서 가져와!

 

(추가로, 나는 docker-compose 로 알고 있었는데, 요즘은 docker compose 로 쓰더라...

강사님이 말씀해주셨는데, docker-compose 가 docker compose 로 흡수되었다고 한다.

뜻밖의 인수합병...🧐)

 

오늘 이렇게 dockerhub 에 내 이미지를 올리는 방법과 docker-compose 의 사용에 대해 알아보았다.

한번 다 경험해봤던 건데도 다시 한번 들으니 새롭다.

 

다음 사이드플젝은 꼭 도입해봐야겠다! 오늘도 즐거웠습니다!

 

728x90
반응형