흰 스타렉스에서 내가 내리지

Docker :: 도커 본문

Docker

Docker :: 도커

주씨. 2023. 5. 9. 16:49
728x90

도커란?

# 한마디로 정의하자면 '데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어

- 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다. 

- 컨테이너(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

 

# [실습] 도커 컴포즈 실행

엥 오류 발생
platform 추가!

 

- 컨테이너와 네트워크를 종료 및 삭제

docker-compose -f 파일_경로 down

 

- down 커맨드를 사용해도 이미지와 볼륨은 삭제되지 않는다.