기본 설정
docker-compose.yml
- 개념
- 다중 컨테이너 도커 애플리케이션을 정의하는 YAML 파일
- 확장자 yml과 yaml은 기능상의 차이는 없다.
- yml은 과거 Windows의 확장자 3자리 규칙 때문에 사용하던 확장자
- 8.3 파일명 (8.3 filename)
- DOS를 포함한 Windows 95 이전 버전의 FAT 파일 시스템에 존재하던 파일명 길이에 관한 규칙
- 전체 파일 이름은 8글자, 확장자는 3글자로 제한하였다.
- 확장자 yml과 yaml은 기능상의 차이는 없다.
- 응용 프로그램을 구성하는 서비스, 구성 방법 및 응용 프로그램 간의 관계를 설명한다.
- 각 서비스는 동일한 네트워크 내에서 별도의 컨테이너로 정의되어 서로 쉽게 통신할 수 있다.
- 다중 컨테이너 도커 애플리케이션을 정의하는 YAML 파일
- 구성
- Services
- 이미지, 볼륨, 포트 등 컨테이너형 서비스들에 대해 정의함
volumes
- 데이터를 유지시켜준다.
- 컨테이너가 삭제되어도 볼륨에 저장해두면 데이터를 저장할 수 있다.
env_file
(optional)- docker compose 명령행 도구가 자동적으로 이 파일을 로드한다.
- 파일명이 .env가 아니거나 yml 파일과 다른 경로에 있을 때는 정의해야 한다.
ports
- 포트를 정의
[호스트 측 포트 번호] : [컨테이너 측 포트 번호]
- 예시
1 2
ports: - 3306:3306
- 컨테이너의 3306번 포트를 개방하고 호스트의 3306번 포트와 매핑한다는 의미
- Networks
- 컨테이너를 연결하는 데 사용되는 도커 네트워크를 정의함
- Volumes
- 영구 데이터를 저장하는 데 사용되는 도커 볼륨을 정의함
driver
: 볼륨 드라이버- local : 빌트인 docker 볼륨 드라이버. 데이터를 호스트 파일 시스템에 저장한다.
driver_opts
: 위의 볼륨 드라이버에 대한 옵션device
: 볼륨 데이터가 호스트 파일 시스템 상에 저장되는 경로o
: 마운트 명령에 전달할 추가적인 옵션- bind
- 볼륨이 bind mount로 마운트된다.
- device 필드에 경로를 지정했지만 bind로 정의하지 않은 경우는?
- device가 무시되고 볼륨에 데이터가 저장된다.
- bind
- Environment variables
- 애플리케이션 서비스에서 사용할 수 있는 환경 변수를 나열함
- Configurations
- 애플리케이션 서비스에 필요한 추가 구성 파일이 포함됨
- Services
Makefile
- clean
1
sudo docker compose -f ./srcs/docker-compose.yml down -v --rmi all --remove-orphans
down
: 컨테이너를 중지. 컨테이너, 네트워크, 볼륨을 제거-v
: docker-compose.yml 파일의volumes
섹션에 정의된 볼륨을 제거한다.- 여기 정의되지 않은 볼륨은 제거하지 않기 때문에 dangling 볼륨이 남아있을 수 있음.
--rmi all
: 서비스에 사용된 모든 이미지 제거--remove-orphans
: 가동을 시작했지만 docker-compose.yml 파일에 정의되어 있지는 않은 컨테이너를 제거
- fclean
1
sudo docker system prune --volumes -af
- 사용하지 않는 도커 이미지, 컨테이너, 네트워크, 볼륨을 삭제
- clean 룰의
docker compose down
명령어를 실행한 뒤에 이 명령어를 실행하는 이유?- 어느 서비스에도 속하지 않은 dangling 볼륨을 제거하기 위해
컨테이너
MariaDB
- MySQL RDBMS(관계형 데이터베이스 관리 시스템)에서 포크한 자유-오픈 소스 RDBMS
- MySQL과 높은 호환성을 유지하여 drop-in 대체 기능을 제공한다.
- drop-in 대체 : 기존 소프트웨어와 호환되도록 디자인된 소프트웨어 구성 요소
- 웹 애플리케이션을 위한 백엔드 DBMS로 자주 사용되며, 분석 및 비즈니스 인텔리전스 목적으로도 흔히 사용된다.
Dockerfile
- Docker image를 만드는 방법
- Docker Hub에서 이미지 pull : 과제에서 금지
- Dockefile로 이미지 빌드
- 순서
- 컨테이너의 기반 이미지를 설정한다. (
FROM
) - 환경 변수를 설정한다. (
ENV
) - 컨테이너 안에 주요 패키지를 설치한다. (
RUN
)RUN
: 빌드 과정동안 명령을 실행하는데 사용
- 로컬에서 필요한 파일들을 컨테이너 내부 디렉토리에 복사한다. (
COPY
/ADD
)shell에서 다음과 같이 명령어를 입력하면 동작중인 컨테이너의 내부의 셸을 실행시킬 수 있다.
1
docker exec -it my_container sh
-i
(interactive) : 컨테이너와 detach된 이후에도 상호작용할 수 있도록 STDIN을 계속 열어준다.-t
(pseudo-tty) : pseuto-TTY를 할당하여 터미널을 통해 컨테이너와 상호작용할 수 있게 해줌.
RUN cp
대신COPY
/ADD
를 사용하는 이유?COPY
/ADD
가RUN cp
보다 성능이 좋다.RUN
을 사용하면 2개의 레이어에 걸쳐 이루어지는 반면COPY
/ADD
는 한 레이어만에 작업이 이루어지기 때문에 더 효율적이다.
COPY
/ADD
를 사용하면 파일 소유권(file ownership)이나 권한(permission)이 유지된다.
- 포트를 expose한다. 도커에게 컨테이너가 해당 포트를 listen할 것이라고 알려준다. 다른 컨테이너가 이 컨테이너와 연결할 때 해당 포트를 사용할 수 있게됨. (
EXPOSE
) - 컨테이너가 시작될 때 실행할 명령어를 정의한다. (
ENTRYPOINT
/CMD
)CMD
: 주로 ENTRYPOINT에 전달될 디폴트 인자를 제공하는데 사용됨. 여러번 호출할 수 있음.ENTRYPOINT
: 도커파일의 마지막에 한 번만 호출할 수 있음.- 다음과 같이 Dockerfile을 작성하게 되면 아래와 같은 결과를 확인할 수 있음.
1 2 3
FROM alpine:latest ENTRYPOINT ["/bin/echo"] CMD ["Hello, world!"]
1 2 3
$ docker build -t my-image . $ docker run my-image Hello, world!
- 컨테이너의 기반 이미지를 설정한다. (
- 주의 사항
- Shell script를 실행하기 전에 권한 변경
chmod +x [filename]
- 컨테이너가 Shell script를 실행하는 경우
- 문제점
ENTRYPOINT
가 셸 스크립트인 경우, 해당 스크립트가 PID1이 된다.1
ENTRYPOINT ["/tmp/entrypoint.sh"]
- 하지만 해당 스크립트는 자식 프로세스(mardb)의 종료를 처리(process reaping)하지 않기 때문에 좀비 프로세스가 생성될 수 있다.
- 해결책
방법 1. dumb-init 또는 tini를
ENTRYPOINT
로 사용하고 CMD로 셸 스크립트를 실행한다.1 2
ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/tmp/entrypoint.sh"]
- ENTRYPOINT의
"--"
: 뒤에 오는 모든 CMD를 받는다는 의미
- ENTRYPOINT의
방법 2. 셸 스크립트가 종료될 때
exec mysqld
와 같은 방법으로 프로세스를 실행한다.- exec를 사용하면 메인 프로세스가 셸 스크립트에서 mysql로 변경된다.
- 시그널이 셸 프로세스가 아닌 mysqld에게로 제대로 전달된다.
- mysqld가 종료되면 컨테이너도 같이 종료된다.
- 문제점
- Shell script를 실행하기 전에 권한 변경
entrypoint.sh
컨테이너가 시작될 때 실행할 셸 스크립트
- 역할
- mysql 서버 데몬을 백그라운드로 실행
- DB에 쿼리문을 입력한 뒤에 mysql 서버 중지
- mysqld_safe 실행
- mysql 서버를 foreground로 실행한다.
- 서버에 crash가 발생한 경우 재시작한다. (mysqld와의 차이점)
init.sql
mariadb에 입력할 쿼리문
- 쿼리문 순서
- DB 생성
- 유저 생성
- Admin 유저
- 일반 유저
- 권한 부여
- Admin 유저
- 일반 유저
- 권한 적용
- root에 암호 설정
- 주의 사항
50-server.cnf
MariaDB 컨테이너에 포함된 설정 파일
- 특징
- 사용 방법
- 전체 파일에서 일부를 변경한 호스트의 50-server.cnf파일을 컨테이너로 덮어씌우는 방법으로 설정을 적용함
- bind-address를 0.0.0.0으로 변경하여 모든 IP로의 접속을 가능하게 한다.
- MariaDB의 설정을 변경하는 가장 좋은 방법은 my.cnf라는 파일에 특정 속성만 변경하여
/etc/mysql/
에 위치시키는 것. - my.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# The MariaDB configuration file # # The MariaDB/MySQL tools read configuration files in the following order: # 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults, # 2. "/etc/mysql/conf.d/*.cnf" to set global options. # 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options. # 4. "~/.my.cnf" to set user-specific options. # # If the same option is defined multiple times, the last one will apply. # # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. # # This group is read both both by the client and the server # use it for options that affect everything # [client-server] # Import all .cnf files from configuration directory !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mariadb.conf.d/
- 전체 파일에서 일부를 변경한 호스트의 50-server.cnf파일을 컨테이너로 덮어씌우는 방법으로 설정을 적용함
기타
- MariaDB 사용 방법
- DB에 접근
1
mariadb -u <username> -p<password>
- DB 내 데이터 확인
1 2 3 4
SHOW DATABASES; USE $MARIADB_DATABASE; SHOW TABLES; SELECT user, host, password FROM mysql.user;
- DB에 접근
NGINX
Dockerfile
ENTRYPOINT ["nginx", "-g", "daemon off;"]
daemon off;
- nginx를 foreground에서 실행하도록 하는 지시어
- 이로 인해 웹서버가 시작된 이후에도 컨테이너가 종료되지 않는다.
- 이 지시어가 없다면 nginx가 background에서 시작되고 컨테이너는 종료된다.
default.conf
Nginx의 기본 설정 파일
- 특징
작성 예시
1 2 3 4 5 6 7 8 9
server { listen 443 ssl; listen [::]:443 ssl; ssl_certificate /etc/ssl/certs/taehooki.crt; ssl_certificate_key /etc/ssl/private/taehooki.key; ssl_protocols TLSv1.2 TLSv1.3; ... }
/etc/ssl/certs
와/etc/ssl/private
은 인증서와 개인키를 저장하는 일반적인 경로
참고 : HTTP를 HTTPS로 리다이렉션하는 방법
1 2 3 4 5
server { listen 80; server_name taehooki.42.fr; return 301 https://$server_name$request_uri; }
- 80번 포트(HTTP)를 listen하다가, 들어온 요청을 HTTPS로 변경한다.
- 301 : 영구적으로 이동시킨다는 의미
WordPress
Dockerfile
- wp-cli 설치
1
RUN curl https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
- PHP PID파일 생성
php-fpm8.1 -F
를 실행하기 전에/run/php/php8.1-fpm.pid
파일이 해당 경로에 존재해야한다.1
RUN mkdir /run/php && touch /run/php/php8.1-fpm.pid
entrypoint.sh
- wordpress를 설치
- wp-cli를 통해 세부 설정을 진행
www.conf
- 개념
- PHP-FPM의 설정 파일
/usr/local/etc/php-fpm.d/
에 위치- PHP-FPM이 관리하는 FastCGI의 동작을 정의한다.
- 주요 속성
- 생성할 하위 프로세스 수
- 각 프로세스가 처리할 수 있는 최대 요청 수
- 프로세스를 실행할 사용자 및 그룹
- PHP-FPM이 수신해야 하는 소켓 파일 또는 TCP/IP 주소 및 포트 번호
- 변경사항
- listen 속성을 다음과 같이 수정
1 2
# listen = /run/php/php8.1-fpm.sock listen = 9000
- listen 속성을 다음과 같이 수정
결과
컨테이너 실행
- make로 이미지 빌드 후 컨테이너 실행
docker images
,docker ps
,docker network ls
,docker volume ls
확인docker logs -f <Container ID>
로 wordpress 설치가 완료되었는지 확인
Wordpress 접속
https://<intra ID>.42.fr
로 이동- 컨테이너 생성 시 Wordpress를 설치했고 wp-cli로 기본적인 설정을 마쳤다면 다음과 같은 화면을 볼 수 있다.
https://<intra ID>.42.fr/wp-admin
으로 이동한 뒤 admin 계정으로 로그인