🧠
Hi, Daehuyn Lee
  • Fork-my-brain
  • Network
    • 7. "데이터가 전달되는 원리" OSI 7계층 모델과 TCP:IP 모델
    • [Netwhat] 연습문제 정리
    • 11. IP 라우팅(routing) 동작 과정
    • 3. IP address 란?
    • 2. 컴퓨터 구조를 통해 이해하는 파일(File)과 소켓(Socket)
    • 10 "더 편리한 인터넷을 위해" DHCP && DNS 프로토콜
    • 9. 데이터? 세그먼트? 패킷? 헷갈릴 땐 PDU를 알아보자
    • 8. TCP 와 UDP 차이를 자세히 알아보자
    • 5. 서브넷팅(subnetting)으로 네크워크를 효율적으로 관리하자
    • 4. 넷마스크(Netmask)와 서브넷마스크(Subnetmask)
    • 1. 비유로 이해하는 컴퓨터 구조
    • 6. 공인(Public) && 사설(Private) IP의 차이점
  • Django
    • [Django 1] 가상환경에 Django 설치하기
    • [Django 3] Hello World 웹사이트 만들기
    • [Django 9] static 으로 css 로드하기
    • [Django 10] 한 템플릿에서 복수의 css 파일 적용하기
    • [Django 11] URL app별로 관리하기
    • [Django 8] 템플릿 상속
    • [Django 4] MTV 패턴
    • [Django 6] 블로그 model 만들기
    • [Django 2] Django는 어떻게 작동할까
    • [Django 7] '새 글 작성' 기능 만들기
    • [Django 5] 템플릿 언어
  • Projects
    • 예발자닷컴
      • 4. 프론트엔드의 역할은 어디까지 - 더미데이터 만들기
      • 7. [React 리팩토링] CSS Inline Styling에 Props 사용하기
      • 6. [React 리팩토링] JSX에서 조건문 사용해 렌더링하기
      • 3. 예발자닷컴 프론트서버 업데이트 하기
      • 8. [React 리팩토링] 예발자 프로젝트에 Redux 적용하기
      • 5. [React 리팩토링] JSX로 HTML 렌더링하기
      • 1. 👨‍👨‍👦‍👦 Github로 협업 프로젝트 관리하기
      • 2. React Component를 활용한 웹페이지 디자인 연습
  • Git
    • [Git] Interactive Rebase 실습
    • 오픈소스 개발 참여에 필요한 Git 명령어 정리
    • 개발자가 오픈소스를 읽는 방법
    • 오픈소스 프로젝트 시작하기
    • SSH agent ; Passphrase 입력 없이 Push하기
    • SSH로 원격저장소 접속하기
    • [Github] 개인 저장소를 팀 저장소로 변경하기
    • GitHub Dependabot
    • Git add, commit, push 취소하기
    • 깃헙 잔디 관리 팁
    • 원격저장소 여러개 연결하기
    • Typora(마크다운 에디터) 사용법
  • C
    • C Piscine
      • 메모리 구조를 알아보자
      • Makefile 만들기
      • GCC로 정적 라이브러리 파일 만들기
      • 외부 라이브러리 GCC로 컴파일 하기
      • 정적(Static) 변수
      • 저수준 파일 입출력
      • Makefile 자주 사용하는 문법 정리
      • segmentation fault 해결하기
      • C의 구조체 개념
      • 연결 리스트(linked list)에서 이중 포인터 사용하기
      • 로컬에 Norminette 설치하기
    • GetNextLine
      • [GetNextLine] 과제소개-Reading a line on a fd is way too tedious
      • [GetNextLine] 삽질의 기록
      • [GetNextLine] 리팩토링-프로그램의 목적을 고려한 코드
    • ft_printf
      • 1. 과제소개
      • 2. 가변인자 (Variadic Arguments)
      • 3. 형식태그와 서식지정자 printf 함수의 옵션 알아보기
    • Libft
      • [Libft] Bonus
      • [Libft] Test Program
      • [Libft] 나만의 C 라이브러리 만들기
      • [Libft] Part 2
      • [Libft] Part 1
  • UNIX shell
    • [minishell] 4. 종료상태와 에러메세지 처리
    • [minishell] 1. 과제소개 및 선행지식
    • [minishell] 2. 프로그램 구조 및 개발 기록들
    • [minishell] 5. 파이프(Pipe) 처리
    • [minishell] 3. 시그널(Signal) 처리하기
    • [minishell] 6. 리다이렉션(Redirection) 처리
  • Web
    • Next.js
      • [Next.js] CSS모듈과 복수의 class 사용하기
    • Node.js
      • [Node.js] 웹페이지에 파일 띄우기
      • [Node.js] URL에서 쿼리스트링 추출하기
      • [Node.js] '새 글 작성' 페이지 만들기
    • React
      • [React] 2. 컴포넌트(Component) 생성 및 파일별로 분리하기
      • [React] 1. 파일 구조 이해하기
      • [React] 4. 컴포넌트의 State 란
      • [React] 3. 컴포넌트의 Props 란
    • Javascript
      • Click, Enter 두 개의 이벤트 동시에 등록하기
      • Click eventListener 등록하기
      • JavaScript & C 문법 비교
      • JavaScript 객체 지향의 특징
    • CSS
      • [CSS] box-model, display, position
  • Docker
    • ft_server
      • 2. 도커 설치부터 워드프레스 구축까지
      • 1. 선행지식-Docker? Debian Buster? Nginx? ...
      • 3. Dockerfile 만들기
  • Kubernetes
    • 🌌[쿠버네티스 아키텍처] 3. API 호출
    • 🌌[쿠버네티스 아키텍처] 1. 구성 및 설계
    • 🌌[쿠버네티스 아키텍처] 2. 오브젝트 (Objects)
  • Operating System
    • Philosophers
      • [Philosophers] 예시예제로 보는 뮤텍스와 세마포어의 차이
      • [Philosophers] 식사하는 철학자 문제 소개
  • CPP
    • [CPP-08] STL containers, iterators, algorithms
    • [CPP-06] CPP 형변환 연산자
    • [CPP-04 ex02] 인터페이스(Interface) 클래스
    • [CPP-04 ex00] 다형성(Polymorphism) 및 가상함수
    • [CPP-02] Canonical 클래스 복사 생성자와 대입 연산자 오버로딩
    • [CPP-07] Templates
    • [CPP-01] this 포인터와 문자열 스트림(stringstream)
    • [CPP-01] 클래스의 정적할당과 동적할당 new, delete
    • [CPP-01] 파일 입출력 및 문자열 치환하기
    • [CPP-01] 참조자(reference)와 포인터는 다르다
    • [CPP-02] 정수부동소수값 - 고정소수값 변환
    • [CPP-04 ex01] 추상 클래스의 필요성 순수 가상함수
    • [CPP-00] Megaphone! CPP 표준입출력
    • [CPP-03] (ClapTrap이 뭐지) 다중 상속과 가상 상속
    • [CPP-05] 예외 처리 (exception handling)
    • [CPP-00] 객체지향의 관점으로 클래스 이해하기
    • [CPP-01] 랜덤값 얻기
  • IBM Cloud
    • [IBM Cloud] 1. 클라우드 컴퓨팅 개요
    • [IBM Cloud] 5. 클라우드 컴퓨팅의 구성 요소
    • [IBM Cloud] 3. 클라우드 서비스 모델 및 배포 모델
    • [IBM Cloud] 2. 클라우드를 활용하는 새 기술들
    • [IBM Cloud] 4. 떠오르는 클라우드 트렌드
    • [IBM Cloud] 6. 클라우드 스토리지 유형 및 CDN
  • Assembly
    • [libasm] 어셈블리 프로그램 구조와 x64 레지스터 이해하기
    • [libasm] strlen 함수를 어셈블리어로 짠다면
    • [libasm] 어셈블리 명령어(opcode) 정리
Powered by GitBook
On this page
  • 해야할 일
  • 고민했던 부분
  • 시작하기
  • 1. Dockerfile 작성하기
  • 2. container 내부의 파일들 hostOS/srcs 폴더로 옮기기
  • 3. 빌드 자동화를 위한 쉘 스크립트 작성하기
  • 4. Dockerfile 빌드하기
  • 5. ft_server 과제 요구사항 체크하기

Was this helpful?

  1. Docker
  2. ft_server

3. Dockerfile 만들기

돌아보니 한 프로젝트의 Dockerfile을 만드는 과정은, 내가 지금까지 차근차근 만들어온 프로젝트를 적절히 분해해서 srcs, Dockerfile, 쉘스크립트에 잘 나눠 담는 일인 것 같다.

Previous1. 선행지식-Docker? Debian Buster? Nginx? ...NextKubernetes

Last updated 3 years ago

Was this helpful?

해야할 일

  • Dockerfile 문법 확인 및 작성하기.

  • docker container 내부의 설정파일들 hostOS의 srcs 폴더로 옮기기.

  • 빌드 자동화를 위한 쉘 스크립트 작성하기.

  • Dockerfile 빌드하기

  • ft_server 과제 요구사항 체크하기

고민했던 부분

과제 요구사항에 맞게 프로젝트 루트 폴더에는 srcs/ 와 Dockerfile 만 둬야한다. 에서 진행한 과정을 그대로 Dockerfile과 쉘스크립트에 옮겨 적는다고 생각하면 된다.

가장 막막했던, 고민했던 부분은 아래 두 가지였다.

Q1. 많은 명령어들과 설정 파일 내용들을 어떻게 도커파일과 쉘스크립트에 적절히 나눠 적을 것인지?

Q2. srcs/ 에 어떤 파일들을 미리 넣어둬야할지?

깃허브와 구글링을 통해 다른 분들의 ft_server 과제를 최대한 많이 참고하면서 감을 잡아나갔던 것 같다. 돌아보니 한 프로젝트의 Dockerfile을 만드는 과정은, 내가 지금까지 차근차근 만들어온 프로젝트를 적절히 분해해서 srcs, Dockerfile, 쉘스크립트에 잘 나눠 담는 일인 것 같다. 어느 하나 간단한 설정이라도 빠져서는 안되고, 순서에 맞게, 다른 사람이 처음 봤을 때 이해하기 쉽게 나눠야한다.

이게 맞는 기준일리는 없고, 어떤 게 배포 및 속도 처리에서 유리할지는 잘 모르겠지만 나는 각각의 세 그릇에 아래와 같은 기준으로 ft_server 프로젝트를 옮겨 담기로 했다.

  • srcs : 채점자(사용자)가 직접 작성하기 복잡한 설정파일들. 1. etc/nginx/sites-available/default

      nginx 서버의 ssl, autoindex, redirection 설정파일.
    1. var/www/html/phpmyadmin/config.inc.php

      blowfish 설정파일.

    2. var/www/html/wordpress/wp-config.php

      mysql의 wordpress DB 설정파일.

    3. run.sh

  • Dockerfile : 프로젝트 구축에 필수적인 패키지 설치 명령어들.

    • nginx

    • php7.3-fpm

    • mariadb-server, php-mysql, php-mbstring

    • openssl

    • vim

    • wget

  • 쉘스크립트(run.sh) : 그 외 프로젝트 설정을 위해 작성했던 모든 명령어들.

고민이 해결되었으니, 해야할 일을 순서대로 진행해보자.

시작하기

1. Dockerfile 작성하기

FROM    debian:buster 
# 프로젝트를 시작할 베이스 image 를 지정한다.
# 우리 과제에서는 `debian:buster`로 설정.

LABEL    maintainer="daelee@student.42seoul.kr"
# image에 metadata를 추가한다.

RUN    apt-get update && apt-get install -y \
    nginx \
    mariadb-server \
    php-mysql \
    php-mbstring \
    openssl \
    vim \
    wget \
    php7.3-fpm
# 쉘 명령어를 실행하고 결과를 커밋한다. 

COPY    ./srcs/run.sh ./
COPY    ./srcs/default ./tmp
COPY    ./srcs/wp-config.php ./tmp
COPY    ./srcs/config.inc.php ./tmp
# HostOS의 파일 또는 디렉토리를 컨테이너 안의 경로로 복사한다.

EXPOSE    80 443
# 이 컨테이너가 해당 포트를 사용할 예정임을 사용자에게 알려준다.
# 실제로 포트를 열기 위해서는 run 명령어에서 -p 옵션을 사용해야한다.

CMD     bash run.sh
# 생성된 컨테이너를 실행할 명령어를 지정한다.

2. container 내부의 파일들 hostOS/srcs 폴더로 옮기기

docker cp [container name]:[container 내부 경로] [host 파일경로]

3. 빌드 자동화를 위한 쉘 스크립트 작성하기

3.1. 쉘 스크립트란?

  • 쉘 명령어를 한줄씩 순차적으로 읽어 실행되도록 작성된 프로그램.

  • .sh 확장자를 가진 파일.

3.2. 작성법

  • 헤더

    아래 내용을 파일 상단에 써주면, 뒤에 나오는 코드를 모두 bash 명령어로 인식한다.

      #!/bin/bash
  • 개행

    모든 명령어는 개행을 기준으로 순서대로 실행된다.

  • 주석

      # 을 사용한다.
  • 변수

    • =를 이용해서 선언하고 ${변수명}으로 사용한다.

    • =는 공백 없이 붙여써야한다.

    • ""로 감싸서 사용하면 더 안전하다. (문자열에 공백도 포함해서 값을 이용할 수 있기 때문이다.)

    • 지역변수에는 local을 붙인다.

      #!/bin/bash
      
      test="abc"
      num=100
      
      echo "${test}"
      echo "${num}"
  • 백그라운드 실행

    한 명령어을 실행하는 동안 다른 명령어를 수행하고 싶다면 &를 사용하면 된다.

      [파일명] &

3.3. 실행방법

$ ./파일명
$ sh 파일명
$ bash 파일명

4. Dockerfile 빌드하기

docker build <옵션> <Dockerfile 경로>

도커의 build 명령어를 사용한다. -t 옵션을 사용하면 저장소 이름, 이미지 이름, 태그를 설정할 수 있다. <저장소 이름>/<이미지 이름>:<태그> 형식.

아래 처럼 빌드했을 때 localhost에 접속할 수 있다면 성공이다.

docker build . -t ft_server
docker run -it -p80:80 -p443:443 ft_server

5. ft_server 과제 요구사항 체크하기

  • SSL CA 인증서가 있는지?

  • autoindex가 잘 동작하는지?

  • phpmyadmin 에서 워드프레스 DB 연동이 되는지?

![](/images/c5ca3d5d-d8a3-4af2-bf15-4299c379d783-image.png)

그 외 더 다양한 문법은 참고

, 했을 때 https로 리다이렉션 되는지?

로 접속 가능한지?

로 접속 후 웹 홈페이지 구축 가능한지?

로 접속 시 설정한 유저명 + 비밀번호로 로그인 가능한지?

에서 좌측 메뉴를 보면 wordpress 테이블이 있다. 내용을 수정하고 맨 아래 실행 버튼을 누르면 자동으로 변경내용이 DB에 저장된다.

로 접속했을 때 아래처럼 수정사항이 잘 반영되었으면 연동이 잘 된 것이다.

총 정리 : 도커 설치부터 워드프레스 구축까지
여기
http://localhost
http://localhost:80
https://localhost:443
https://localhost/wordpress
https://localhost/phpmyadmin
https://localhost/phpmyadmin
https://localhost/wordpress
출처