/////
Search
Duplicate
✈️

inception

과제에서 가져갈 부분

1.
도커와는 어떤 차이가 있어서 이걸 많이 써야하는건지, vm이랑 도커 차이
2.
도커 컴포즈 왜 쓰는지, 정확히 뭔지
3.
다른 녀석들의 종류는 뭐가 있고 도커 컴포즈가 갖는 장점
4.
네트워크의 종류는 뭐가 있고 왜 써야 하는지, 볼륨의 종류는 뭐고 어떤 볼륨을 사용해야 문제가 없는지
5.
yml파일이 어떤 역할을 하는지 어떤식으로 동작을 하는지
6.
bash나 루프를 걸지 않고 도커를 써야하는 이유가 무엇인지, 어떻게 해야하는건지
7.
.env가 뭐고 왜 쓰고, yml파일에서 .env를 어떻게 쓰는지
8.
도커파일에서 설정할지 런타임에서 설정/을 하여 쓸 수 있는데 어떨때 어떤걸 해야하는지(기준을 잡는게 굉장히 중요)
9.
외부에서도 환경변수를 쓸 수 있도록 틀을 구성하는것(내 피씨에서만 쓰게 하는게 목적이 아니기 때문에)

vm이랑 도커 차이

예전의 서버는 하나 당 한 개의 어플리케이션을 할당 해주면서 남는 자원이 많았다. 이 부분을 해결해주기 위해 하이퍼바이저 라는 녀석이 등장. 이 녀석은 논리적으로 공간을 분리해주면서 가상 환경에 guest os를 구동할 수 있게 해준다.
기존의 가상화 방식은 vm이 늘때마다 guest os 를 할당해주게 된다. 하지만 도커의 경우 이런 guest os가 아닌 host os의 커널을 공유하기 때문에 자원의 효율성 측면에서 유리함을 가져가게 된다.
많은 블로그들에서 docker engine 위에 어플리케이션이 구동되는 것처럼 표현이 되어 있는데 약간 의미상 애매할 수 있다. 사실 컨테이너는 리눅스 커널의 능력으로 만들어지고 docker engine은 그 컨테이너가 잘 돌아가게 도와주는 역할의 느낌이기 때문에 마치 docker engine이 container가 구동 됨에 100% 공이 있는 것처럼 이해하는것에는 약간의 문제가 있다.
리눅스가 아닌 다른 운영체제의 경우 도커 그 자체로도 vm이기 때문에 그 안에 guest os로 리눅스가 들어가게 된다. 그 리눅스를 통해서 컨테이너가 만들어질 수 있게 되는 것이다.

도커를 왜 써야할까

도커 컴포즈란

Docker Compose 파일은 최상단에 버전을 정의하도록 되어있습니다. 각 버전별로 명령어 혹은 표기법이 다르기 때문에 정상적으로 작동하지 않는 경우 버전을 체크해보아야 합니다.
여러 가지의 컨테이너 돌리고 싶을 경우 사용
단일 호스트에서 여러 컨테이너를 관리하고 싶을때 도커 컴포즈를 사용하게 되고 멀티 호스트로 여러 컨테이너를 관리하고 싶을때부터 다른 컨테이너 오케스트레이션 툴이 필요하게 됨. 이 툴의 종류들은 각각 장단점이 있고 본인의 상황에 맞게 사용하면 됨
도커 스웜 / 쿠버네티스 / 아파치 메소스

도커 컴포즈 네트워크

도커 컴포즈란 결국 여러 개의 컨테이너를 관리하기 위해 사용이 되는데, 이 컨테이너 간에 통신이 필요한 경우가 있다. 그래서 네트워크 설정이 필요하다.
네트워크 종류로는 bridge, host, overlay가 있으며 각각 쓰이는 상황이 다르다

도커 볼륨

볼륨을 이용하여 컨테이너에 필요한 파일을 매번 COPY가 아닌 mapping하게 만들 수 있습니다.
컨테이너끼리 파일을 공유하기 위해서도 볼륨이 필요. 호스트의 위치에다가 저장하고 컨테이너마다 맵핑

yaml 파일

도커 컴포즈를 실행하기 위한 설정에 대한 내용이 담겨있는 파일이라고 보면 된다. JSON 이나 XML 같이 시스템 간 데이터 교환을 위해 만들어 졌다.
파일 안의 내용은 각 컨테이너 구성하기 위한 설정내용들이 들어가 있다
YAML 은 JSON과 마찬가지로 사람이 읽기 쉬운 형태 의 데이터 직렬화 양식이다. JSON은 성능에 초점을 두었다면 YAML은 가독성에 초점을 두었다

pid 1

컨테이너가 바로 꺼지는 이유

데몬 프로세스로 돌게 되면 그 프로세스 자체가 루트가 됨. 따라서 컨테이너 안의 pid 1 밑으로 자식이 되는게 아니라 자체적으로 루트가 되기 때문에 컨테이너 프로세스 입장에선 실행할게 없다 판단하여 컨테이너가 종료됨. 데몬 프로세스 목적자체가 루트가 종료되면 자식노드들이 종료되는 문제 때문에 또 다른 루트를 만드는 개념. 컨테이너가 실행되면 독립적인 프로세스 아이디를 가지게 되는데 pid 1 밑으로 속하는게 아니라 다른 루트로 실행됨

yaml파일 작성

command: 컨테이너가 실행될 때 수행할 명령어를 설정하며, docker run 명령어의 마지막에 붙는 command와 같습니다.
Plain Text
복사

Alpine Linux vs Debian Buster

웹서버 (nginx를 쓴 이유)

APT 패키지 매니저

앱스토어/플레이스토어처럼 프로그램의 설치를 개발사의 복잡한 방식말고 비교적 간편한 방식으로 설치를 도와주는 녀석

GRANT 옵션

Dockerfile RUN vs CMD vs ENTRYPOINT

FastCGI

Mysql query문

도커 명령어

사용하지 않는 네트워크, 이미지, 컨테이너, 볼륨 등 모두 삭제
docker system prune
Shell
복사
볼륨 삭제
#전부 삭제 docker volume prune #<해당 볼륨> 삭제 docker volume rm <해당 볼륨 이름> #볼륨 목록 docker volume ls
Shell
복사

진행사항

wordpress 띄우기 위해서 dockerfile 만들고 db랑 연결중
nginx 먼저 설치하고 띄우는중
참고서 보고 mariadb먼저 설정중
run 대신 cmd 명령어를 통해서 script.sh 실행. 바로 꺼지는 문제 발생
wordpress 띄우고 디비랑 연결해보기
nginx 실행은 되는데 접속이 안됨
wp-config.php 파일 설정에서 디비 설정부분에 환경변수가 필요함. 그래야 실행될때마다 바뀌는 host의 Ip를 넣을 수 있음
php fpm 설정 파일 수정 부분 하는중. listen 부분을 어떻게 바꿔야 할까 고민중. 저 부분에 wordpress host ip 주소를 넣어줬었는데 어떻게 넣어야하는지.
wp-config.php에 디비 설정 부분에 mv명령어로 옮겼는데 디비 설정부분에 그대로 수정이 안 되어 있음
Dockerfile에서 해당 경로로 바로 COPY를 해주고 script.sh에 의해 wordpress 설치가 실행되면서 옮겨놨던 설정 파일이 덮어쓰기 되는듯
Dockerfile에서 COPY명령어로 tmp로 옮겨놓고 이후에 스크립트로 tmp에서 원하는 경로로 mv명령어 통해서 이동
nginx ssl 적용이 안됨
oepnssl 명령어 사용시 -subj 옵션으로 인증서 생성시에 필요한 필드값들을 기입할 수 있음
db연결 실패
wordpress 컨테이너에 별도로 접속하여 db에 접속은 가능
환경변수 설정이 제대로 안 된 것인가라는 의문
환경변수 빼고 하드코딩으로 넣어주니까 돌아감. 환경변수 문제가 맞는듯.getenv 써봐야할듯
yml파일에 env_file 빼고 environment에 환경변수 추가해줌
wordpress foreground로 돌리기
/usr/sbin/php-fpm7.3 경로에서 php-fpm7.3을 실행하고 -F 옵션으로 foreground 돌려야하는데 아래와 같은 오류 발생
mkdir -p /run/php/ touch /run/php/php7.3-fpm.pid
Shell
복사
경로에 해당 파일 만들어 주고 실행해봤더니 잘 되더라
볼륨 설정
mariadb 컨테이너 띄워서 db 넣어보고 mariadb 컨테이너 내리고 다시 새롭게 수정한 mariadb 컨테이너를 올린 뒤에 그 디비가 남아있으면 성공이라 생각함
volume 설정을 하게 되면 host os에도 경로가 생겨야 하는데 맥이나 윈도우에서는 그 경로를 확인하기 쉽지 않음. docker가 가상으로 관리를 해주게 됨.
login user 이름으로 server name url이 자동으로 바뀔 수 있게 환경변수 설정중
nginx default 파일 수정
수정해주게 되면 /etc/hosts에도 hyson.42.fr로 접근할 수 있게 수정해줘야함
안해주면 localhost로 들어갔을때 css가 load가 안 되는것을 볼 수 있음
makefile작성
volume 설정
driver 옵션의 경우 local로 설정해줬기 때문에 해당 드라이버의 옵션들을 사용하는 것이라고 생각하면 됨
volumes: mariadb_volume: name: mariadb_volume #prefix 안 붙게 이 이름으로 볼륨 이름이 설정됨 driver: local #local driver를 사용할거임 driver_opt: #옵션 쓸거임 o: bind #-o bind옵션으로 할거임 type: volume #volume이랑 바인드 할거임 device: ${VOLUME_PATH}/mariadb # 경로는 여기임 wordpress_volume: name: wordpress_volume driver: local driver_opt: o: bind type: volume device: ${VOLUME_PATH}/wordpress
YAML
복사

TO_DO

bash로 돌리는거 말고 데몬 기능 빼고 돌리기
환경변수 사용해서 실행하기
makefile 만들기
볼륨 제대로 됐는지 확인(vm에서 확인해보기)
ps로 Pid1에 제대로 들어가있는지 확인
yml파일 의존성 설정(depends on)
wordpress 설정 미리 해두기
docker build 옵션이랑 up명령어 차이
localhost말고 hyson.42.fr로도 들어갈 수 있어야함
makefile re수정
Cgi공부

궁금증

wp-config.php에서 hostname에 아이피 주소를 적어줘야 하는 거 아닌가? 왜 다들 환경변수에 mariadb를 적지?
→ 아이피 주소를 명시해주지 않고 yaml파일에 정의한 service의 명을 적어주는 것만으로도 바로 바인딩이 가능
50-server.cnf파일에서 port 3306 주석해제하지 않아도 돌아가는 이유
→ default로 3306으로 열어주는 것으로 추정
왜냐면 openssl 명령어에 뭔가 문제가 있거든요 ㅎㅎ 그 명령어 뒤 명령어가 다 실행 안될걸 보면 거기에 뭔가 문제가 있네요 ㅎㅎ
그렇다면 한달정도만 기다려주세요 ㅎㅎㅎㅎㅎ