Docker 실습-2 Docker, Dockerfile, Image, Container

Kyoungchan Cho·2023년 1월 2일
0

Docker

목록 보기
2/5
post-thumbnail

intro

동빈나님의 도커 강좌를 실습하면서 남긴 진행 기록입니다.

인스턴스의 도커를 설치하고, 이미지를 빌드하고 컨테이너를 구동시킨다.
그리고 php의 소스코드를 컨테이너에 빌드한다.


1. 도커 설치

도커의 이미지를 로드할 때 메모리가 부족할 수 있으므로 메모리를 체크하며 진행한다.
df -h

패키지 업데이트
sudo apt update

유틸리티 설치
sudo apt install apt-transport-https
sudo apt install ca-certificates
sudo apt install curl (특정한 웹사이트에서 데이터를 다운로드 받을 때 사용)
sudo apt install software-properties-common

curl을 활용하여 도커 설치를 위한 gpg를 다운로드하고 apt 기능 리스트에 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

도커 레포지터리에서 wubunutu 18.04 버전에 맞는 도커를 다운로드하고 리포지터리 리스트에 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/unbuntu bionic stable"

sudo apt update

apt list에 도커를 다운받기 위한 경로가 추가돼었으므로 도커 ce 설치
apt-cache policy docker-ce
sudo apt install docker-ce

Docker-ce가 설치되지 않고 에러가 발생하면 아래 커맨드를 입력해준다.
Package docker-ce is not available, but is referred to by another package.

sudo apt-get update
sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io


2. 컨테이너 실행

도커는 설치하면 자동으로 시스템 서비르 등록되므로 시스템 서비스 상태 확인이 가능하다.
sudo systemctl status docker

docker pull 명령어로 특정한 서버 파일을 이미지 형태로 다운받게 해준다.
docker pull hello-world

도커 이미지 확인
docker images

컨테이너 실행
docker run hello-world

컨테이너 동작 확인
docker ps -a


3. 이미지 만들어 아파치 웹 서버 구동

간단한 웹 서버 컨테이너를 아파치 웹서버로 구동되게 도커파일 작성

cd /home/wubuntu

도커파일 이름은 Dockerfile로 고정
sudo vi Dockerfile

FROM ubuntu:18.04
MAINTAINER whrod whrodtube@gmail.com

RUN apt-get update
RUN apt-get install -y apache2 # Install Apache web server (only 'yes')

EXPOSE 80

CMD ["apachectl", "-D", "FOREGROUND"]

이미지 빌드
docker build -t example .
이미지 확인
docker images

컨테이너 포트(우측)와 서버 포트(좌측)를 연결해서 컨테이너를 실행
docker run -p 80:80 example

AWS EC2 인스턴스 보안 그룹에 인바운드 규칙 설정 (80번 HTTP 포트)

실제로 아파치 웹 서버가 구동
ex) http://13.125.218.128/:80


4. 이미지에 php index 적용하기

앞서 만든 example 이미지에 php 소스코드를 빌드한다.

컨테이너 삭제 (커맨드)

example 이미지를 수정하기 위해 실행하고 있는 컨테이너를 확인 후 삭제해준다.

컨테이너 확인
docker ps -a

컨테이너 삭제 (컨테이너를 삭제해도 이미지는 삭제되지 않는다.)
docker rm -f 컨테이너id

모든 컨테이너 강제 삭제
docker rm -f 'docker ps -a -q' (docker ps -a -q 앞뒤로 백틱)

이미지 확인
docker images

이미지 삭제
docker rmi -f 이미지id

모든 이미지 삭제
docker rmi -f 'docker images' (docker images 앞뒤로 백틱)

도커파일 수정

기존 example 도커파일에 있는 경로로 이동해서
cd /home/ubuntu/

도커파일을 수정한다.
sudo vi Dockerfile

도커 파일에 PHP 설치와 인터렉션을 방지하는 환경 변수를 추가해준다.

FROM ubuntu:18.04
MAINTAINER whrod whrodtube@gmail.com

# Avoiding user interaction with tzdata
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN apt-get install -y apache2 # Install Apache web server (only 'yes')
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php # For Installing PHP 5.6
RUN apt-get update
RUN apt-get install -y php5.6

EXPOSE 80

CMD ["apachectl", "-D", "FOREGROUND"]


php 소스 코드 적용

수정한 example의 도커파일을 빌드하고
docker build -t example .

볼륨 옵션을 열어서 마운팅해서 컨테이너 실행( /var/www/html는 php의 기본 소스코드 경로 )
볼륨마운팅 된 경로에서 html문서나 php의 소스코드를 작성하면 컨테이너 내부에 있는 php 소스코드 경로와 연결이 됨
docker run -p 80:80 -v /home/ubuntu/html:/var/www/html example

터미널에서 볼륨마운팅 된 경로 /home/ubuntu/html로 이동하여 php의 버전을 확인할 수 있는 소스코드로 index.php를 수정해서 적용되는지 확인해본다.
cd /home/ubuntu/html
sudo vi index.php
<?php phpinfo(); ?>

80 포트(http://13.125.218.128/:80)에 재접속하면 php 소스코드가 적용된 것을 확인할 수 있다.


컨테이너 추가 실행

컨테이너를 실행하면서 다른 포트를 설정해주면 같은 인스턴스 내에서 여러 컨테이너를 실행시켜 서버를 구동시킬 수 있다.
81번 포트로 컨테이너를 실행 시킨후
AWS EC2 인스턴스 보안그룹에서 인바운드 규칙에 81번 포트를 추가해준다.
docker run -p 81:80 -v /home/ubuntu/html:/var/www/html example

81 포트(http://13.125.218.128/:81)에 접속하면 php 버전 확인 페이지를 볼 수 있다.




참고)
https://www.youtube.com/watch?v=odmG6RJQboE&list=PLRx0vPvlEmdChjc6N3JnLaX-Gihh5pHcx&index=4

profile
https://lying-lettuce-69f.notion.site/KyoungchanCho-Blog-f9f150b9e3be4467a67cf2a21932650d (게시글 자동 비공개 현상으로 일단 노션으로 이동합니다. 소개에서 URL 링크 클릭으로 연결됩니다.)

0개의 댓글