Docker #1 Docker로 Ubuntu, Apache, Php 환경의 이미지 만들기

Explanation

오랜만에 포스팅이네요. 요즘 회사 일이 바빠서…(는 핑계)
사실은 약간의 슬럼프??가 오려고 해서 6월, 7월은 일부러 좀 휴식의 시간을 보냈어요. 이제 다시 포스팅도 열심히 하고 소소히 프로젝트도 많이 할 예정이랍니다.

오늘은 Docker로 Ubuntu – Apache – PHP 환경의 이미지를 만들어보는 과정을 정리해 보려고 합니다.
그리고 예정된 다음 글은 Docker로 만든 이미지를 AWS(아마존 웹 서비스)의 ECR에 업로드하고 EC2에서 만든 이미지를 PULL 받아 적용하는? 글을 작성해보려 합니다.

1. Dockerfile 만들기

우선 간단하게 Ubuntu v18.04을 OS로 Apache2를 웹서버로 설치하는 Dockerfile 을 만듭니다.

간단히 살펴보면,
FROM 은 어떤 이미지를 기반으로 할지,
RUN 은 명령어를 실행하고 여기에서 -y는 apt install 설치 과정에서 yes 입력을 설정해주는 것 입니다.
ENV 는 환경 변수 선언입니다.

2. Docker 이미지 만들고 실행하기

이제 도커로 좀전에 만든 Dockerfile의 이미지를 만들건데요.
터미널을 열고 Dockerfile 파일의 디렉토리로 이동한 후 Docker에 로그인 한 후 빌드합니다.

-t 는 tag 의 줄임 옵션이으로 falsy-ubuntu 라는 태그로 이미지를 빌드합니다. 그리고 마지막에 . 은 오타가 아니고 Dockerfile 파일이 있는 디렉토리 경로랍니다.

이제 이미지를 구동? 합니다.

-p 는 포트를 나타내고요 앞에 80은 외부에서 접근하는 포트번호 뒤에 80은 내부로 연결하는 포트번호입니다.

Ubuntu 서버가 잘 돌아가고 있는지 확인합니다.

위 명령어로 돌아가고 있는 컨테이너의 ID 값을 기억합니다. 글에서는 ‘1a2b3c..’ 라고 가정할게요.
그리고 exec 모드로 방금 실행한 ‘1a2b3c’ 컨테이너로 접속합니다.

3. 패키지 설치해보기

이제 Docker로 만든 Ubuntu 이미지에 접속해서 필요한 패키지들을 설치해볼게요.
Php를 설치할건데 최신 버전인 7.3 버전을 설치해보려 합니다.
글 작성의 편의를 위해 슈퍼 유저 권한으로 작성할게요.

$ apt install php7.3
이렇게 설치하면 될 거 같지만 어드밴스 패키징 툴(APT)로는 최신의 버전의 PHP를 설치 할 수 없기 떄문에,
PPA(Personal Package Archive)를 통해 설치해줘야 합니다.

이렇게 하면 된다는데, 안되길래 알아보니

‘software-properties-common’ 요놈을 먼저 설치해야 ‘add-apt-repository’ 요놈을 사용할 수 있다고 하네요.
참고. https://askubuntu.com/questions/1120716/how-can-i-see-if-i-have-software-properties-common-installed

여기서 잠시, 예전 글들은 패키지를 설치할때 apt-get 커맨드를 많이 사용하는데요, 요즘 글들을 보면 대부분 apt를 사용하더라고요.
그래서 짧게 알아보니 대충 apt 커맨드는 apt-get과 apt-cache를 함께 쓰기 위한 커맨드라고 하네요.
참고. https://jhhwang4195.tistory.com/69

software-properties-common 를 설치했다면 다시 ppa에 ondrej 저장소의 php를 설치합니다.

이제 필요한 패키지들을 쭉쭉 설치해볼까요

이제 설치가 끝났으면 잘 설치가 되었는지 버전을 확인해 봅니다.

이제 아파치 서버를 통해서 php 파일을 잘 해석하는지 해볼까요?

다음으로 아파치의 가상호스트 설정을 해줍니다.

간략하게 이야기하면 80번 포트로 들어오는 localhost의 접근을 /home/falsylab 디렉토리로 향하게하고
/home/falsylab 디렉토리의 접근 권한을 열어 준 설정입니다.

다음으로 심볼 링크를 만들어 줍니다

이제 어느 정도 설정이 끝났으니 아파치를 재시작하고 접속해보면 되겠죠?

두둥.. 하지만 이렇게 하면 도커의 컨테이너가 종료됩니다…

하지만 당황하지 않고,
우리는 된다는 믿음으로.
본격적으로 방금 설치하고 설정했던 순서대로 Dockerfile을 수정해줍니다.

4. Dockerfile 수정하기

아까 우분투에서 입력했던 순서대로 쭈루룩 적은거에요. 약간 추가된 부분은

vim으로 작성했던 부분을 저는 Dockerfile 파일이 있는 디렉토리에 test라는 디렉토리 안에 미리 만들어 놓고 docker로 만들 이미지에 카피하도록 하였습니다.

이제 다시 빌드하고 배포를 하면!

끝 일 줄 알았지만, 역시 세상일이 생각처럼 되지 않습니다.
php를 설치하는 과정에서 타임존을 설정해야 하는데 이부분은 -y 같은 옵션으로는 넘길 수 없답니다.
그리고 이러한 당혹스러운 문제는 우리 스텍오버플로 형, 누나들에게 물어보면 됩니다.
참고. https://askubuntu.com/questions/909277/avoiding-user-interaction-with-tzdata-when-installing-certbot-in-a-docker-contai

스택오버플로 형, 누나들은 모르는게 없습니다.

이제 다시 이미지를 빌드하고

80번 포트로 컨테이너를 만들고

웹 브라우저를 열고 localhost 에 접속하면 ‘hello world’가 뜨는 것을 확인할 수 있습니다!