일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 힙
- CHECK OPTION
- 스프링 폼
- 유니크제약조건
- FetchType
- 이진탐색
- 연관관계
- exclusive lock
- fetch
- PS
- 스토어드 프로시저
- 다대일
- 다대다
- JPQL
- BOJ
- execute
- 동적sql
- 연결리스트
- shared lock
- eager
- 지연로딩
- 일대다
- 즉시로딩
- 비관적락
- querydsl
- 데코레이터
- 낙관적락
- 백트래킹
- SQL프로그래밍
- dfs
- Today
- Total
흰 스타렉스에서 내가 내리지
Docker :: 도커 본문
도커란?
# 한마디로 정의하자면 '데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어
- 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다.
- 컨테이너(container) : 데이터나 프로그램을 두는 작게 쪼갠 독립된 창고
- 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커.
# 도커 엔진이 있어야 컨테이너를 만들 수 있다.
- 컨테이너를 만들기 위해서는 이미지가 필요하다.
- 컨테이너는 여러 개를 만들 수 있다. 용량이 허락하는 한 하나의 도커에서 여러 개를 만들 수 있다.
# 도커는 리눅스 컴퓨터에서 사용한다.
- 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.
- 윈도우나 macOS에서도 도커를 구동할 수는 있지만 이 경우 내부적으로 리눅스가 사용된다.
# 여러 가지 서버 기능을 안전하게 함께 실행
- 컨테이너 기술을 활용하면 여러 개의 웹 서버를 하나의 물리 서버에 함께 올릴 수 있다,
# 자유로이 옮길 수 있는 컨테이너
- 컨테이너는 자유로이 옮길 수 있다.
- 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다.
- 도커만 설치돼 있으면 되므로 운영체제가 달라도 이를 신경 쓰지 않고 컨테이너를 옮길 수 있다.
- 도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있으므로, 운영서버와 개발서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.
도커의 동작원리
# 도커는 기본적으로 '리눅스 용' 이다.
- 도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 돼 있기 때문에 리눅스 운영체제에서만 동작할 수 있다.
- 컨테이너에서 실행할 소프트웨어 역시 리눅스용 소프트웨어다. 윈도우나 macOS용 소프트웨어는 컨테이너에 넣어도 동작하지 않는다.
# 이미지와 컨테이너
- 컨테이너를 생성하려면 먼저 이미지를 만들어야 한다.
- 이미지는 컨테이너를 만드는 데 사용된다.
- 이미지는 금형과 같은 역할을 하는 것으로, 하나만 있으면 똑같은 것을 여러 개 만들 수 있다.
- 이미지로 동일한 컨테이너를 여러 개 만들 수 있다.
- 컨테이너로 이미지를 만들 수 있고, 이 이미지로 컨테이너를 여러 개 만들 수 있다.
# 도커 허브와 도커 이미지
- 도커 허브 : https://hub.docker.com
- 도커 허브는 앱스토어와 같은 존재로, 공개된 컨테이너 이미지가 모여 있는 곳이다. 이곳에서 원하는 컨테이너의 이미지를 내려받을 수 있다.
- 도커허브에는 운영체제만 들어있는 이미지부터, 여러 가지 소프트웨어가 함께 포함된 것 까지 다양한 이미지가 제공된다.
# 다양한 형태로 조합이 가능한 컨테이너
- 도커를 사용할 때의 원칙 중 하나로, '한 컨테이너에 한 프로그램'이라는 것이 있다.
- 하나의 프로그램만 담긴 컨테이너를 사용한다는 의미로, 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책이다.
- 한 컨테이너에 모두(워드프레스, 아파치, MySQL 등) 집어넣는 방법은 유지보수나 도커의 장점을 누리기 어렵기 때문에 추천하지는 않는다.
# 도커 컨테이너는 '쓰고 버리는' 일회용품
- 컨테이너는 쉽게 만들 수 있다.
- 컨테이너 하나를 업데이트 하면서 계속 사용하기 보다는 업데이트된 소프트웨어가 들어있는 새로운 컨테이너를 사용하는 것이 좋다.
- 즉, 새로운 버전이 나오면 새로운 컨테이너로 갈아타는 것이다.
# 컨테이너의 생애주기
- 컨테이너를 만들고 → 실행하고 → 종료하고 → 폐기하는 과정
# 데이터 저장 - 컨테이너를 폐기했다면 컨테이너에 들어있던 데이터는?
- 도커가 설치된 물리적 서버(호스트)의 디스크를 마운트해 디스크에 데이터를 저장한다.
- 마운트 : 디스크를 연결해 데이터를 기록할 수 있도록 한 상태
- 도커 컨테이너는 물리적 컴퓨터의 디스크 (HDD or SSD)를 연결해 데이터를 기록할 수 있다.
- 이런 방법으로 컨테이너가 폐기되더라도 데이터는 컨테이너 외부에 안전하게 저장되어 사라지지 않는다.
- 프로그램을 개발할 떄는 다른 저장소에 저장하지 않는 경우도 있으므로 컨테이너를 폐기하기 전에 중요한 데이터가 컨테이너에 포함돼 있지 않은지 확인해야 한다.
# 도커의 장점
- 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
- 명령 한 줄로 서버 구축이 끝난다.
- 서버 관리가 용이한다.
도커 데스크톱 설치
https://docs.docker.com/desktop/install/mac-install/
도커 엔진을 시작/종료
# 도커 엔진 시작/종료
- 컨테이너를 실행 중이 아니라면 컴퓨터의 리소스를 거의 차지하지 않으므로 문제가 없다.
- 도커 엔진이 한번 종료되면 모든 컨테이너는 정지 상태가 된다.
- 도커 엔진은 컴퓨터를 켰을 때 함께 자동으로 실행할 수 있지만, 컨테이너는 그렇지 않다.
- 서버 다시 켜고, 도커엔진과 함께 컨테이너를 복구하려면 컨테이너를 따로 실행하는 스크립트를 실행해야 한다.
# 명령어와 대상
- docker image pull penguin
- docker container start penguin
# 옵션과 인자를 붙인 명령어
- docker container run -d penguin --mode=1
- 옵션 → -d : 백그라운드로 실행하라
- 인자 → --mode=1 : 모드 1로 실행하라
# 컨테이너를 실행
- docker container run
- docker run (똑같음)
# 옵션
→ --name penguin
→ {-d} + {-i} + {-t} == -dit
# 인자
→ --mode=1
→ --style nankyoku
컨테이너의 생성과 삭제, 실행, 정지
# run, stop, rm 커맨드
- 컨테이너 생성 : docker create
- 컨테이너 실행 : docker start
- 이미지 내려받기 : docker pull
- 이미지 내려받기 & 컨테이너 생성 & 실행 : docker run
- 동작 중인 컨테이너를 그대로 삭제할 수는 없다
- 컨테이너 정지 : docker stop
- 컨테이너 삭제 : docker rm
- 컨테이너를 백그라운드로 실행 : option -d
- 컨테이너 내부에 터미널로 접속 : option -it
- 컨테이너의 목록 출력 : docker ps (-a)
# 컨테이너를 생성, 실행, 상태확인, 종료, 삭제
docker run --name aaaaaa -d httpd
docker ps
docker ps -a
docker stop aaaaaa
docker ps
docker rm aaaaaa
컨테이너의 통신
- 컨테이너는 외부에서 접근이 불가능한 상태로 실행된다.
- 컨테이너 속에서 실행 중인 아파치는 외부와 직접 연결되지 않았기 때문에 외부에서 접근할 수 없다.
- '호스트의 포트 번호'와 '컨테이너 포트 번호'를 콜론으로 연결해 함께 기재한다. (-p 8080:80)
# 통신이 가능한 컨테이너 생성
docker run --name aaaaaa -d -p 8080:80 httpd
docker stop aaaaaa
docker rm aaaaaa
# 아파치 컨테이너 여러개 실행하기
docker run --name aaaaaa -d -p 8080:80 httpd
docker run --name bbbbbb -d -p 8081:80 httpd
docker run --name cccccc -d -p 8082:80 httpd
docker stop aaaaaa
docker stop bbbbbb
docker stop cccccc
docker rm aaaaaa
docker rm bbbbbb
docker rm cccccc
# nginx 컨테이너 실행하기
docker run --name aaaaaa -d -p 8080:80 nginx
docker stop aaaaaa
docker rm aaaaaa
# 이미지 삭제
- 컨테이너를 삭제해도 이미지는 그대로 남아 쌓인다.
- 이미지가 늘어나면 스토리지 용량을 압박하게 되므로 필요없어진 이미지는 그때그때 삭제하도록 한다.
- 해당 이미지로 실행한 컨테이너가 남아 있으면 이미지를 삭제할 수 없으므로 docker ps -a와 같이 컨테이너 목록을 출력해 확인하고 컨테이너를 먼저 종료 및 삭제한 다음, 이미지를 삭제한다.
docker image ls
docker image rm https
docker image rm nginx
여러 개의 컨테이너를 연동해 실행
- 컨테이너를 두 개 만들기만 해서는 두 컨테이너가 연결되지 않으므로 가상 네트워크를 만들고 이 네트워크에 두 개의 컨테이너를 소속시켜 두 컨테이너를 연결한다.
# 네트워크 생성
docker network create wordpress000net1
# MySQL 컨테이너 생성 및 실행
docker run --name mysql000ex11 -dit --net=wordpress000net1 \
-e MYSQL_ROOT_PASSWORD=myrootpass \
-e MYSQL_DATABASE=wordpress00db \
-e MYSQL_USER=wordpress000kun \
-e MYSQL_PASSWORD=wkunpass mysql \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-authentication-plugin=mysql_native_password
# 워드프레스 컨테이너 생성 및 실행
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 \
-e WORDPRESS_DB_HOST=mysql000ex11 \
-e WORDPRESS_DB_NAME=wordpress00db \
-e WORDPRESS_DB_USER=wordpress000kun \
-e WORDPRESS_DB_PASSWORD=wkunpass wordpress
# 뒷정리
docker stop wordpress000ex12
docker stop mysql000ex11
docker rm wordpress000ex12
docker rm mysql000ex11
docker image rm wordpress
docker image rm mysql
docker network rm wordpress000net1
컨테이너와 호스트 간에 파일 복사하기
- 파일 복사는 컨테이너→ 호스트, 호스트 → 컨테이너 양방향 모두 가능하다.
# 호스트 -> 컨테이너
docker cp 호스트_경로 컨테이너_이름:컨테이너_경로
# 컨테이너 -> 호스트
docker cp 컨테아너_이름:컨테이너_경로 호스트_경로
# 실습
docker run --name apa000ex19 -d -p 8089:80 httpd
# 호스트에서 컨테이너로 파일을 복사
docker cp /Users/joos/Documents/2023/code/docker/index.html apa000ex19:/usr/local/apache2/htdocs
# 컨테이너의 파일을 호스트로 복사
docker cp apa000ex19:/usr/local/apache2/htdocs/index.html /Users/joos/Documents/2023/code/docker
볼륨 마운트
- 볼륨을 마운트하면 컨테이너의 일부를 호스트 컴퓨터의 일부와 같이 다룰 수 있어 편리하다.
# 볼륨
- 스토리지의 한 영역을 분할한 것
# 마운트
- '연결하다' 라는 의미 그대로 대상을 연결해 운영체제 또는 소프트웨어의 관리하에 두는 일을 말한다.
- 이해하기 쉬운 예로 USB 메모리를 컴퓨터에 꽂으면 폴더가 열리는데, 이것도 USB 메모리가 컴퓨터에 마운트됐기 때문이다.
- 실제로 컨테이너를 사용하려면 스토리지 영역을 마운트해야 한다. 왜냐하면 데이터가 이 스토리지에 있기 때문이다.
- 컨테이너는 생성 및 폐기가 매우 빈번하기 때문에 매번 데이터를 옮기는 대신 처음부터 컨테이너 외부에 둔 데이터에 접근해 사용하는 것이 일반적이다. 이를 데이터 퍼시스턴시 (data persistency)라고 한다. 이때 데이터를 두는 장소가 마운트된 스토리지 영역이다.
- 스토리지 마운트 보다는 '볼륨 마운트'라는 용어를 사용한다.
# 스토리지 마운트의 종류
1. 볼륨마운트
2. 바인드 마운트
볼륨 마운트 | 바인드 마운트 |
도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트 | 도커가 설치된 컴퓨터의 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트 |
이름만으로 관리가 가능하므로 다루기 쉽지만, 볼륨에 비해 직접 조작하기 어려움 | 폴더(디렉터리) 속에 파일을 직접 두거나 열어볼 수 있음 |
임시 목적의 사용, 자주 쓰지는 않지만 지우면 안 되는 파일을 두는 목적으로 많이 사용 | 자주 사용하는 파일을 두는 데 사용 |
- 워드프레스처럼 파일을 자주 편집해야 하는 경우에는 바인드 마운트를 사용해야 한다.
- 이처럼 간편함과 파일 접근 가능 여부에 차이가 있으므로 파일을 직접 편집해야 할 일이 많다면 바인드 마운트를 사용하고, 그렇지 않다면 볼륨 마운트를 사용하면 된다.
항목 | 볼륨 마운트 | 바인드 마운트 |
스토리지 영역 | 볼륨 | 디렉터리 또는 파일 |
물리적 위치 | 도커 엔진의 관리 영역 | 어디든지 가능 |
마운트 절차 | 볼륨을 생성한 후 마운트 | 기존 파일 또는 폴더를 마운트 |
내용 편집 | 도커 컨테이너를 통해서 | 일반적인 파일과 같이 |
백업 | 절차가 복잡함 | 일반적인 파일과 같이 |
# 스토리지를 마운트하는 절차
- 스토리지를 마운트하려면 먼저 마운트될 스토리지를 생성해야 한다.
- 볼륨 마운트의 경우는 마운트와 동시에 볼륨(스토리지 영역)을 만들 수도 있지만 이 방법은 권장하지 않는다.
- 마운트 전에 별도로 볼륨을 먼저 생성하는 것이 좋다.
# 스토리지를 마운트하는 커맨드
# 볼륨 마운트 커맨드 예
docker run (생략) -v 볼륨_이름:컨테이너_마운트_경로 (생략)
# 바인드 마운트 커맨드 예
docker run (생략) -v 스토리지_실제_경로:컨테이너_마운트_경로 (생략)
# [실습] 바인드 마운트해보기
docker run --name apa000ex20 -d -p 8090:80 \
-v /Users/joos/Documents/2023/code/docker/:/usr/local/apache2/htdocs httpd
로컬에서 파일을 변경하면, localhost:8090에서도 바로 변경된 것을 확인할 수 있다.
# [실습] 볼륨 마운트해보기
# 마운트할 볼륨 생성
docker volume create apa000vol1
# run 커맨드로 아파치 컨테이너 실행
docker run --name apa000ex21 -d -p 8091:80 \
-v apa000vol1:/usr/local/apache2/htdocs httpd
# 볼륨의 상세 정보 확인
docker volume inspect apa000vol1
# 볼륨이 컨테이너에 마운트 됐는지도 확인
docker container inspect apa000ex21
# 뒷정리
docker stop d2
docker rm d2
docker image ls
doccker image rm 03
docker volume rm apa000vol1
컨테이너로 이미지 만들기
- 이미 존재하는 컨테이너를 이용하면 누구나 숩게 이미지를 만들 수 있다.
- 나만의 이미지를 만들어 똑같은 구성의 컨테이너를 대량으로 만들 수 있고, 다른 컴퓨터 또는 서버에 이동시킬 수도 있다.
docker commit 컨테이너_이름 새로운_이미지_이름
docker build -t 생성할_이미지_이름 재료_폴더_경로
FROM 이미지_이름
COPY 원본_경로 대상_경로
RUN 리눅스_명령어
...
# [실습] commit 커맨드로 컨테이너를 이미지로 변환
docker run --name apa000ex22 -d -p 8092:80 httpd
# commit 커맨드를 사용해 apa000ex22 컨테이너로부터 새로운 이미지를 만든다.
docker commit apa000ex22 ex22_original1
# image ls 커맨드로 이미지가 생성됐는지 확인한다
docker image ls
# [실습] Dockerfile 스크립트로 이미지 만들기
docker build -t ex22_original2 재료_폴더_경로
- 텍스트 편집기를 사용해 Dockerfile 스크립트를 작성한다.
- 파일 이름은 확장자 없이 Dockerfile 이라고 붙이고 폴더에 저장한다.
docker build -t ex22_original2 /Users/joos/Documents/2023/code/docker
docker image ls
# 이미지를 옮기는 방법
- 컨테이너는 먼저 이미지로 변환하지 않으면 옮기거나 복사할 수 없다.
- 하지만 이미지 역시 이미지 상태 그대로는 옮기거나 복사할 수 없으므로 도커 레지스트리를 통하거나 save 커맨드를 사용해 tar 포맷으로 도커 엔진의 관리 영역 밖으로 내보내야 한다.
- 파일은 호스트 컴퓨터의 파일 시스템에 생성된다.
- 파일을 다시 도커 엔진에 가져오려면 load 커맨드를 사용한다.
docker save -o 파일_이름.tar 이미지_이름
컨테이너 개조
컨테이너를 개조하는 방법에는 두 가지가 있다.
1. 파일 복사와 마운트를 이용한 방법
2. 컨테이너에서 리눅스 명령어를 실행하는 방법
# 셸
- 컨테이너에서 리눅스 명령어를 실행하려면 리눅스에 우리의 명령을 전달해주는 프로그램인 shell이 있어야 한다.
- 셸에도 몇 가지 종류가 있는데, 대부분의 컨테이너에는 가장 일반적으로 사용되는 셸인 bash가 설치돼 있다.
- 컨테이너를 아무 설정 없이 실행하면 bash가 동작하지 않는 상태로 실행된다. 따라서 bash를 실행해 우리의 명령을 입력받을 수 있ㄴㄴ 상태로 만들어야 한다.
# bash를 실행하는 인자
/bin/bash
- docker exec는 컨테이너 속에서 명령어를 실행하는 커맨드
- 실행중인 컨테이너에 run 커맨드를 사용할 수는 없으므로 이 방법을 사용한다.
- docker run 커맨드에 인자를 붙였다면 상황이 조금 복잡해진다.
- 이 겨웅에는 컨테이너에 들어있는 소프트웨어(이를 테면 아파치)를 실행하는 대신 bash가 실행되므로 컨테이너는 실행 중인데 소프트웨어는 실행 중이 아닌 상태가 된다.
- bash를 사용한 컨테이너 조작이 끝나고 나면 다시 docker start 커맨드로 컨테이너를 재시작해야 한다.
# exec 커맨드에 인자를 추가한 예
docker exec (옵션) 컨테이너_이름 /bin/bash
docker exec -it apa000ex23 /bin/bash
# run 커맨드에 인자를 추가한 예
docker run (옵션) 이미지_이름 /bin/bash
docker run --name apa000ex23 -it -p 8089:80 httpd /bin/bash
# run 커맨드는 아파치 대신 bash를 실행하기 때문에 아파치가 동작하지 않는다.
- bash를 통해 컨테이너 내부를 조작하는 동안에는 도커 명령을 사용할 수 없다.
- 컨테이너 안에서 할 일을 마쳤다면 다시 컨테이너에서 나와야 한다.
# 도커 엔진에 명령을 내릴 수 있도록 컨테이너에서 나오는 명령어
exit
도커 허브 등록 및 로그인
# 도커 레지스트리
- 이미지를 배포하는 장소
- 일반에 공개되어 있는 비공개이든 상관없이 이미지가 배포되는 곳은 모두 도커 레지스트리이다
# 도커 허브
- 도커 제작사에서 운영하는 공식 도커 레지스트리
# 이미지 이름과 태그
- 도커의 태그는 레지스트리에 업로드를 상정한 이미지 이름에 가깝다.
- 로컬 컴퓨터에서는 ex00022처럼 대충 붙였던 이름을 joooos.com/joooosi:13 처럼 레지스트리의 주소와 버전 표기를 추가해 정식 명칭으로 만든다.
- [레지스트리_주소] / [레포지토리_이름] : [버전]
# 이미지에 태그를 부여해 복제하는 커맨드 docker tag (docker image tag)
- 원래 있던 이미지 이름을 태그로 바꾸고 이미지를 복제하라는 의미다.
- 그러므로 명령어를 실행한 후 image ls 커맨드로 이미지 목록을 확인해 보면 원래 이름의 이미지와 태그가 부여된 이미지가 둘 다 존재한다.
- 이들의 이미지 ID는 동일하지만 별개의 이미지로 취급되므로 이미지를 삭제할 때는 두 가지 모두 삭제해야 한다.
docker tag 원래_이미지_이름 레지스트리_주소/레포지토리_이름:버전
docker tag apa000ex22 jooos.com/joosi:13
# 이미지를 업로드하는 커맨드 docker push (docker image push)
- docker push 커맨드는 이미지를 업로드하는 커맨드다.
- 레포지토리는 처음 업로드할 때는 존재하지 않는다. push 커맨드를 실행하며 만들어진다.
docker push 레지스트리_주소/레포지토리_이름:버전
docker push joos.com/jooosi:13
# 레지스트리를 만드는 방법
- 개발 회사는 대개 사내용 도커 레지스트리를 만들고 여기에 개발환경 이미지를 올려 배포하는 체계를 갖추고 있을 것이다. 외부 공개를 목전으로 한다면 도커 허브가 가장 이상적이다.
# 비공개 레지스트리를 만드는 방법
- 레지스트리용 컨테이너가 따로 있으므로 이를 사용하면 된다. 다시 말해, 레지스트리도 도커를 통해 운영할 수 있다.
- 컨테이너를 만들면 사용자는 레지스트리에 로그인한 다음 이미지를 내려받을 곳으로 이 레지스트리를 지정한다.
- 레지스트리는 포느 5000번을 사용한다.
docker run -d -p 5000:5000 registry
도커 컴포즈
도커 컴포즈는 도커 명령어를 정의 파일에 기술해 실행하는 도구다. 이 정의 파일은 Dockerfile과 비슷한데, 어떤 차이점이 있는지도 함께 알아보자.
- 시스템 구축과 관련된 명령어들을 하나의 텍스트 파일 (정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구가 바로 도커 컴포즈다.
- yml 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행 또는 일괄 종료 및 삭제할 수 있는 도구다.
# up 커맨드
- docker run 커맨드와 비슷하다.
- 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행한다.
# down 커맨드
- 컨테이너와 네트워크를 정지 및 삭제한다.
- 볼륨과 이미지는 삭제하지 않는다.
- 컨테이너와 네트워크 삭제 없이 종료만 하고 싶다면 stop 커맨드를 사용한다.
# Dockerfile과의 차이점
- 도커 컴포즈는 말하자면 docker run 명령어를 여러 개 모아놓은 것과 같다. 컨테이너와 주변 환경을 생성한다. 네트워크와 볼륨까지 함께 만들 수 있다.
- Dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없다.
# 쿠버네티스와의 차이점
- 쿠버테니스는 도커 컨테이너를 관리하는 도구인만큼 여러 개의 컨테이너를 다루는 것과 관계가 깊다.
- 도커 컴포즈의 기능은 컨테이너를 생성하고 삭제하는 것뿐으로, 컨테이너 관리 기능은 없다.
도커 컴포즈의 설치와 사용법
# 도커 컴포즈의 설치
윈도우나 macOS에서 사용하는 도커 데스크톱은 도커 컴포즈가 함께 설치되기 때문에 따로 설치할 필요가 없다.
그러나 리눅스에서는 도커 컴포즈와 파이썬 3 런타임 및 필요도구를 설치해야 한다. (python3, python3-pip)
도커 컴포즈는 파이썬으로 작성된 프로그램이기 때문에 파이썬 런타임이 필요하다.
# 파이썬 3 및 도커 컴포즈 설치 (리눅스)
sudo apt install -y python3 python3-pip
sudo pip3 install docker-compose
# 도커 컴포즈의 사용법
- 호스트 컴퓨터에 폴더를 만들고 이 폴더에 정의파일(yml)을 만든다.
- 정의 파일의 이름은 미리 정해진 docker-compose.yml이라는 이름을 사용해야 한다.
- 정의 파일은 한 폴더에 하나만 있을 수 있다.
- 그래서 여러 개의 정의 파일을 사용하려면 그 개수만큼 폴더를 만들어야 한다.
도커 컴포즈 파일을 작성하는 법
# 도커 컴포즈 정의 파일의 내용 살펴보기
- 도커 컴포즈는 정의파일 (이하 컴포즈 파일)을 그대로 실행하는 역할을 하므로 컴포즈 파일이 반드시 필요하다.
- 컴포즈 파일은 작성 방법도 간단해서 어렵지 않게 작성할 수 있다.
# 도커 명령어와의 비교
docker run --name apa000ex2 -d -p 8080:80 httpd
version: "3"
services:
apa000ex2:
image: httpd
ports:
- 8080:80
restart: always
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 \
-e WORDPRESS_DB_HOST=mysql000ex11 \
-e WORDPRESS_DB_NAME=wordpress00db \
-e WORDPRESS_DB_USER=wordpress000kun \
-e WORDPRESS_DB_PASSWORD=wkunpass wordpress
version: "3"
services:
wordpress000ex12:
depends_on:
- mysql000ex11
image: wordpress
networks:
- wordpress000net1
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST=mysql000ex11
WORDPRESS_DB_NAME=wordpress000db
WORDPRESS_DB_USER=wordpress000kun
WORDPRESS_DB_PASSWORD=wkunpass
# 컴포즈 파일을 작성하는 방법
- 맨 앞에 컴포즈 버전을 적고, 그 뒤로 services, networks, volumes를 차례로 기재한다.
- 도커 컴포즈와 쿠버네티스에서는 컨테이너의 집합체를 서비스라고 부른다.
# 컴포즈 파일의 작성 예 (주 항목)
version: "3" <- 버전 기재
services: <- 컨테이너 관련 정보
networks: <- 네트워크 관련 정보
volumes: <- 볼륨 관련 정보
# [실습] 컴포즈 파일 작성
앞에서 만들었던 워드프레스 및 MySQL 컨테이너와 동일한 컨테이너를 만드는 컴포즈 파일 작성하기.
이때 MySQL 컨테이너를 먼저 만들어야 하므로 앞에 작성한다.
또한 워드 프레스 컨테이너는 depends_on 항목을 추가해 의존관계를 설정해야 한다.
항목 | 값 |
네트워크 이름 | wordpress000net1 |
MySQL볼륨 이름 | mysql000vol11 |
워드프레스 볼륨 이름 | wordpress000vol12 |
MySQL 컨테이너 이름 | mysql000ex11 |
워드프레스 컨테이너 이름 | wordpress000ex12 |
항목 | 항목 이름 | 값 |
MySQL 이미지 이름 | image: | mysql: 5.7 |
사용할 네트워크 | networks: | wordpress000net1 |
사용할 볼륨 | volumes: | mysql000vol11 |
마운트 위치 | /var/lib/mysql | |
재시작 설정 | restart: | always |
MySQL 설정 | environment: | 아래 항목들 설정 |
MySQL 루트 패스워드 | MYSQL_ROOT_PASSWORD | myrootpass |
MySQL 데이터베이스 이름 | MYSQL_DATABASE | wordpress000db |
MySQL 사용자 이름 | MYSQL_USER | wordpress000kun |
MySQL 패스워드 | MYSQL_PASSWORD | wkunpass |
항목 | 항목 이름 | 값 |
의존 관계 | depends_on: | mysql000ex11 |
워드프레스 이미지 이름 | image: | wordpress |
사용할 네트워크 | networks: | wordpress000net1 |
사용할 볼륨 | volumes: | wordpress000vol12 |
마운트 위치 | /var/www/html | |
포트 번호 설정 | port: | 8085:80 |
재시작 설정 | restart: | always |
데이터베이스 관련 정보 | environment: | 아래 항목들 설정 |
데이터베이스 컨테이너 이름 | WORDPRESS_DB_HOST | mysql000ex11 |
데이터베이스 이름 | WORDPRESS_DB_NAME | wordpress000db |
데이터베이스 사용자 이름 | WORDPRESS_DB_USER | wordpress000kun |
데이터베이스 패스워드 | WORDPRESS_DB_PASSWORD | wkunpass |
1. docker-compose.yml 파일 생성
version: "3"
services:
mysql000ex11:
image: mysql:5.7
networks:
- wordpress000net1
volumes:
- mysql000vol11:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: wordpress000db
MYSQL_USER: wordpress000kun
MYSQL_PASSWORD: kunpass
wordppress000ex12:
depends_on:
- mysql000ex11
image: wordpress
networks:
- wordpress000net1
volumes:
- wordpress000vol12:/var/www/html
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST: mysql000ex11
WORDPRESS_DB_NAME: wordpress000db
WORDPRESS_DB_USER: wordpress000kun
WORDPRESS_DB_PASSWORD: wkunpass
networks:
wordpress000net1:
volumes:
mysql000vol11:
wordpress000vol12:
# MYSQL 8.0을 사용하는 방법
- MYSQL은 버전 8.0대부터 인증 방식이 바뀌었기 때문에 사용하려면 인자가 필요하다. 도커 컴포즈에서도 인자를 추가하면 MySQL8.0대를 사용할 수 있다.
- 인자를 추가하려면 컴포즈 파일에 command 항목을 추가한다.
- restart와 environment 항목 사이에 다음과 같은 내용을 추가한다. 들여쓰기는 restart와 environment 와 같은 수준으로 하면 된다.
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
--default-authentication-plugin=mysql_native_password
도커 컴포즈 실행
도커 컴포즈는 docker-compose 명령을 사용한다.
- 가장 자주 사용하는 커맨드는 up과 down 두 가지이지만 stop도 가끔 사용한다.
- up 커맨드는 컴포즈 파일에 정의된 컨테이너 및 네트워크를 생성하며,
- down 커맨드는 생성된 컨테이너와 네트워크를 종료하고 삭제한다.
# 컨테이너와 주변 환경을 생성하는 docker-compose up 커맨드
docker-compose -f 정의_파일_경로 up 옵션
docker-compose -f /Users/joos/Documents/2023/code/docker/docker-compose.yml up -d
# 컨테이너와 네트워크를 삭제하는 docker-compose down 커맨드
docker-compose -f 컴포즈_파일_경로 down 옵션
docker-compose -f 컴포즈_파일_경로 stop 옵션
# 현재 작업 디렉터리를 컴포즈용 폴더로 사용
cd 폴더_경로
docker-compose up -d
# [실습] 도커 컴포즈 실행
- 컨테이너와 네트워크를 종료 및 삭제
docker-compose -f 파일_경로 down
- down 커맨드를 사용해도 이미지와 볼륨은 삭제되지 않는다.
'Docker' 카테고리의 다른 글
[docker build error] : ERROR: failed to solve: error getting credentials - err: exit status 1, out: `` (0) | 2024.03.10 |
---|---|
docker로 mysql 서버 실행하기 (0) | 2023.11.09 |
docker container 내부 접속하는 법 (0) | 2023.05.25 |