[실습] 도커 실습 2 - 도커 허브, 도커 컴포즈
본문
- 도커 허브
- 도커 컴포즈
도커 허브
도커 허브란
- 도커 제작사에서 운영하는 공식 도커 레지스트리
도커 레지스트리
- 도커 이미지를 저장하고 관리하는 중앙 저장소로서 동작하는 서버
- 도커 이미지를 업로드, 다운로드, 검색, 삭제 등의 작업을 수행
- 도커 이미지를 공유하고 배포하기 위해 사용
리포지토리
- 도커 이미지의 집합을 나타내는 공간
- 이미지의 다양한 버전을 관리하고 구분
태그
- 도커 이미지의 버전을 식별하기 위한 라벨
- 이미지의 특정 버전을 구분하고 관리하는 데 사용
- 레지스트리_주소(도커 허브는 ID)/리포지토리_이름:버전
이미지에 태그를 부여해 복제하는 명령어
- docker tag [기존_이미지_이름] [레지스트리_주소]/[리포지토리_이름]:[버전]
- 명령어 실행 후 기존 이미지와 태그가 부여된 이미지가 둘 다 존재
이미지를 업로드하는 명령어
- docker push [레지스트리_주소]/[리포지토리_이름]:[버전]
- 리포지토리는 처음 업로드할 때는 존재하지 않고, push 커맨드를 실행하며 만들어짐
리포지토리 실습 - 컨테이너 생성시 개인 리포지토리에 있는 도커 이미지를 가져다 생성
도커 허브 웹 사이트 접속 및 계정 생성
계정 모드 선택 및 이메일 인증
로그인 및 개인 리포지토리 생성
개인 리포지토리 생성
- 리포지토리 옵션
- public(공개) : 리포지토리 내의 이미지들이 공개, 누구나 해당 리포지토리와 이미지를 볼 수 있고 다운로드 가능
- private(비공개): 리포지토리 내의 이미지들이 비공개, 특정 사용자나 팀에게만 이미지를 공유하거나 접근 권한 부여
개인 리포지토리 화면
개인 리포지토리에 저장할 도커 이미지 내려받기
#nginx 최신 도커 이미지 내려받기
docker pull nginx
#도커 로그인(개인 리포지토리에 내려받은 도커 이미지를 저장하려면 로그인 필요, 도커 허브 계정)
docker login
개인 리포지토리에 도커 이미지 저장
#이미지에 새로운 태그 붙이기
#docker tag [이미지_이름]:[태그] [유저_이름]/[리포지토리_이름]:[새로운_태그]
docker tag nginx:latest dlaxogns/lim:latest
#리포지토리에 이미지 PUSH
#docker push [유저_이름]/[리포지토리_이름]:[태그]
docker push dlaxogns/lim:latest
#개인 리포지토리에 있는 이미지로 컨테이너 생성
#컨테이너 생성시 이미지 경로를 개인 리포지토리 경로로 변경 dlaxogns/lim:latest([도커허브_유저이름]/[리포지토리_이름]:[태그])
docker run -d -p 8081:80 --name my-nginx dlaxogns/lim:latest
컨테이너 이미지 경로 확인
#실행중인 컨테이너 목록
docker ps
도커 컴포즈
도커 컴포즈란
- 시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구
도커 컴포즈의 구조
- 시스템 구축에 필요한 설정을 YAML(YAML Ain’t a Markup Language) 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run) 또는 일괄 종료 및 삭제(down)할 수 있는 도구
- 정의 파일에는 컨테이너나 볼륨을 ‘어떠한 설정으로 만들지'에 대한 항목이 기재
- up 커맨드
- docker run 커맨드와 비슷
- 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행
- 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어 주변 환경을 한꺼번에 생성 가능
- down 커맨드
- 컨테이너와 네트워크를 정지 및 삭제
- 볼륨과 이미지는 삭제하지 않음
도커 컴포즈 사용법
- 호스트 컴퓨터에 폴더를 만들고 이 폴더에 정의 파일(YAML 파일)을 배치
컴포즈 파일 작성
항목 | 설명 | 예시 |
---|---|---|
첫 줄에 도커 컴포즈 버전을 기재 | Docker Compose 파일 버전 기재 | version: '3' |
주 항목 services , networks , volumes |
각 항목 아래에 설정 기재 | services: |
항목 간의 상하 관계는 들여쓰기로 나타냄 | 들여쓰기를 사용하여 계층 구조 표현 | mysql000ex11: |
들여쓰기는 일정한 공백 사용 | 2칸 또는 4칸의 공백을 사용 | image: mysql:5.7 |
각 항목의 키 뒤에 콜론(: )을 붙임 |
키 뒤에 콜론을 붙이고 값을 기재 | image: mysql:5.7 |
리스트 항목은 줄 앞에 - 를 붙임 |
리스트 형태로 여러 값을 나열할 때 | - wordpress000net1 |
콜론 뒤에는 공백 | 키와 값 사이에 공백 삽입 | MYSQL_ROOT_PASSWORD: myrootpass |
# 뒤는 주석 |
주석 작성 | # MySQL 설정 |
문자열은 작은따옴표 또는 큰따옴표로 감쌈 | 문자열 값은 따옴표로 감쌈 | 'mysql' 또는 "mysql" |
도커 컴포즈 실습 - 워드프레스와 MySQL 연동
# 디렉토리 생성
mkdir ~/compose
# 도커 컴포즈 yaml 파일 생성
nano ~/compose/docker-compose.yaml
도커 컴포즈 yaml 파일
version: "3"
services:
# MySQL 컨테이너 설정
mysql000ex11:
image: mysql:5.7 # MySQL 5.7 이미지 사용
networks:
- wordpress000net1 # wordpress000net1 네트워크 연결
volumes:
- mysql000vol11:/var/lib/mysql # MySQL 데이터 저장을 위한 볼륨 마운트
restart: always # 컨테이너 재시작 설정
environment:
MYSQL_ROOT_PASSWORD: myrootpass # MySQL 루트 비밀번호 설정
MYSQL_DATABASE: wordpress000db # WordPress 데이터베이스 생성
MYSQL_USER: wordpress000kun # WordPress 사용자 생성
MYSQL_PASSWORD: wkunpass # WordPress 사용자 비밀번호 설정
# WordPress 컨테이너 설정
wordpress000ex12:
depends_on:
- mysql000ex11 # mysql000ex11 컨테이너가 먼저 실행되어야 함
image: wordpress # WordPress 이미지 사용
networks:
- wordpress000net1 # wordpress000net1 네트워크 연결
volumes:
- wordpress000vol12:/var/www/html # WordPress 웹 애플리케이션 파일 저장을 위한 볼륨 마운트
ports:
- 8085:80 # 호스트 포트 8085를 컨테이너의 80번 포트로 매핑
restart: always # 컨테이너 재시작 설정
environment:
WORDPRESS_DB_HOST: mysql000ex11 # MySQL 호스트 설정
WORDPRESS_DB_NAME: wordpress000db # WordPress 데이터베이스 이름 설정
WORDPRESS_DB_USER: wordpress000kun # WordPress 데이터베이스 사용자 이름 설정
WORDPRESS_DB_PASSWORD: wkunpass # WordPress 데이터베이스 사용자 비밀번호 설정
# 컨테이너 간 통신을 위한 네트워크 설정
networks:
wordpress000net1:
#driver: bridge # 네트워크 드라이버 가 기본 설정이면 본 내용 생략 가능
# 데이터 저장용 볼륨 설정
volumes:
mysql000vol11: # MySQL 데이터 저장용 볼륨
#driver: local # 볼륨 드라이버가 기본 설정이면 본 내용 생략 가능
wordpress000vol12:
도커 컴포즈 설치
# 시스템 패키지 업데이트
sudo apt update
# 파이썬 및 ‘pip’ 설치
#Docker Compose는 파이썬 패키지로 설치됨
sudo apt install python3 python3-pip
# Docker Compose 설치
sudo pip install docker-compose
도커 컴포즈 pip로 설치시 실행 문제가 발생할 때 curl로 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
도커 컴포즈 실행
- docker-compose -f [정의_파일_경로] up [옵션]
# 컴포즈 파일 실행
docker-compose -f ~/compose/docker-compose.yaml up -d
도커 컴포즈 up 옵션
옵션 | 내용 |
-d | 백그라운드로 실행 |
--no-color | 화면 출력 내용을 흑백으로 함 |
--no-deps | 링크된 서비스를 실행하지 않음 |
--force-recreate | 설정 또는 이미지가 변경되지 않더라도 컨테이너를 재생성 |
--no-create | 컨테이너가 이미 존재할 경우 다시 생성하지 않음 |
--no-build | 이미지가 없어도 이미지를 빌드하지 않음 |
--build | 컨테이너를 실행하기 전에 이미지를 빌드 |
--absort-on-container-exit | 컨테이너가 하나라도 종료되면 모든 컨테이너를 종료 |
-t, --timeout | 컨테이너를 종료할 떄의 타임아웃 설정, 기본은 10초 |
--remove-orphans | 컴포즈 파일에 정의되지 않은 서비스의 컨테이너를 삭제 |
--scale | 컨테이너의 수를 변경 |
# 컨테이너 목록 확인
docker ps
# 네트워크 확인
docker network ls
# 볼륨 확인
docker volume ls
웹 브라우저에서 워드 프레스에 접속 가능한지 확인
- 워드프레스는 데이터베이스와 연동이 되지 않으면 오류 발생
- http://localhost:8085
도커 컴포즈로 만든 리소스 삭제
- docker-compose -f [컴포즈_파일_경로] down [옵션]
#Docker Compose를 사용하여 지정된 Compose 파일로 정의된 리소스를 삭제
docker-compose -f ~/compose/docker-compose.yaml down
- 컨테이너를 정지하지 않아도 삭제가 가능
- 볼륨과 이미지는 데이터의 영속성과 이미지 재사용의 이유로 삭제가 되지 않음
도커 컴포즈 dwon 옵션
옵션 | 내용 |
--rmi 옵션 | 삭제 시에 이미지도 삭제, 옵션을 all로 지정하면 사용했던 모든 이미지가 삭제, local로 지정하면 커스텀 태그가 없는 이미지만 삭제 |
-v, --volumes | volumes 항목에 기재된 볼륨을 삭제한다. 단, external로 지정된 볼륨은 삭제되지 않음 |
--remove-orphans | 컴포즈 파일에 정의되지 않은 서비스의 컨테이너도 삭제 |
도커 컴포즈 stop
- docker-compose -f [컴포즈_파일_경로] stop [옵션]
- docker-compose [명령어] -d
- -d 옵션을 붙이고 경로 정의 없이 도커 컴포즈 명령어를 실행하면 현재 작업 디렉터리를 컴포즈용 폴더로 사용
- --scale 옵션 : 한번에 여러개 띄움
- docker-compose scale [서비스명]=[컨테이너 갯수]
- docker-compose -f my-docker-compose.yml up --scale filebeat=3
- scale 사용시 포드 포워드 중복 에러 유의
- "8001-8002:80"
아파치와 php를 포함하는 도커 이미지로 컨테이너 생성하여 php 파일로 아파치 초기 화면 변경 실습
# php 파일을 배치할 디렉토리 생성
mkdir ~/test
# php 파일 nano 에디터로 디렉토리 경로에 생성
nano ~/test/index.php
- "Hello, World!"를 화면에 출력하는 PHP 코드
<?php
echo "Hello, World!";
?>
# 아파치와 php를 포함하는 이미지로 컨테이너 생성
docker run -d -p 8080:80 --name my-apache-php-container -v ~/test:/var/www/html php:7.4-apache
# 컨테이너 내부의 bash 셸로 이동
docker exec -it my-apache-php-container bash
# html 파일은 정적인 파일로, 서버에서 별도의 처리가 필요하지 않지만 php 파일은 동적인 스크립트로 서버에서 처리가 필요
# php 파일 적용을 위해 아파치 웹 서버 재시작
service apache2 restart
# 컨테이너 내부 나가기
exit
- 웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인
댓글목록0