이번글에서는 Ubuntu에서 Docker가 설치된 상태에서 Volume을 이용해 도커내부파일 수정하는 법과 Dockerfile를 사용하여 편리하게 작업하는 간단한 테스트를 진행 하겠습니다.
Docker 를 다룬지 오래되어 복습 차원에서 진행해봅니다.^^
Volume 역할
-
데이터 지속성:
Docker를docker-compose.yml
파일로 실행할 때, 컨테이너 내부의 데이터는 기본적으로 휘발성입니다. 즉, 컨테이너가 재시작되거나 삭제되면 데이터가 사라질 수 있습니다. 이를 해결하기 위해 **볼륨(volume)**을 사용하여 데이터를 지속적으로 보존할 수 있습니다. 볼륨을 설정하면 컨테이너가 재시작되더라도 중요한 데이터가 안전하게 유지됩니다. -
파일 동기화:
도커 내부 파일을 직접 수정하는 대신, 로컬에서 파일을 수정하고 볼륨을 통해 컨테이너와 동기화할 수 있습니다. 이를 통해 도커 컨테이너와 로컬 환경 간에 파일을 쉽게 공유하고, 로컬에서 작업한 내용을 즉시 컨테이너에 반영할 수 있습니다. 이는 개발 환경에서 매우 유용하게 사용됩니다.
Dockerfile 역할
-
이미지의 베이스 정의 (
FROM
):
어떤 기본 이미지를 사용할지 결정합니다. 예를 들어,php:8.1-apache
는 PHP 8.1과 Apache가 포함된 이미지를 기반으로 컨테이너를 생성하게 해줍니다. -
필요한 소프트웨어 설치 (
RUN
):
컨테이너 내에서 필요한 패키지나 애플리케이션을 설치합니다. 예를 들어,RUN apt-get install vim
명령어를 통해 Vim을 설치할 수 있습니다. -
파일 복사 (
COPY
):
로컬 시스템에서 도커 이미지로 파일을 복사하여 컨테이너 내에서 사용할 수 있도록 합니다. -
컨테이너 시작 시 실행할 명령어 정의 (
CMD
):
컨테이너가 시작될 때 실행할 기본 명령어를 지정합니다. 예를 들어,CMD ["apache2-foreground"]
는 Apache 서버를 실행하는 명령어입니다.
Dockerfile 에서는 FROM,RUN 만 테스트 진행하겠습니다.
[테스트 환경]
OS: Ubuntu 24.04
Docker 설치 버전
# docker –version
Docker version 28.0.4, build b8034c0
# docker-compose -v
docker-compose version 1.29.2, build unknown
docker-compose.yml (apm 이미지 다운 및 설치 진행)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
version: ‘3.7’
services:
# Apache + PHP
web:
build: .
image: php:8.1-apache
container_name: apache_php
ports:
– “80:80”
#volumes: ( 도커 내부에서 파일 및 디렉토리를 아직 복사하지 않았기 때문에 주석처리를 한 상태로 실행)
#- ./apache:/etc/apache2 # Apache 설정 디렉토리를 로컬과 연결
#- ./html:/var/www/html # 웹 애플리케이션 파일을 로컬 ./html 디렉토리와 연결
networks:
– app-network
depends_on:
– db
# MySQL
db:
image: mysql:5.7
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: example_password
MYSQL_DATABASE: my_database
MYSQL_USER: my_user
MYSQL_PASSWORD: my_password
volumes:
– mysql_data:/var/lib/mysql
networks:
– app-network
networks:
app-network:
driver: bridge
volumes:
mysql_data:
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
# docker ps (apache+php 는 편의상 합쳐서 진행하였습니다.)
# docker exec -it apache_php bash (필요한 파일과 디렉토리를 복사해오기 위해 도커 내부 아파치에 접속)
root@63e57eacdda6:/var/www/html# (도커 내부)
원하는 디렉토리 경로가 /etc/apache2 인것을 확인
이때 복사하는 방법에는 즉시 복사와 한번 걸쳐서 복사하는 방법이 있습니다. (※주의 즉시복사는 권한문제로 인해 안될경우가 있음)
저는 편리한것을 좋아하기에 즉시복사를 진행하겠습니다. (exit로 도커내부에서 빠져나온다)
# docker cp apache_php:/etc/apache2 ./apache (도커내부에 /etc/apache2 디렉토리를 로컬에 /root/apache 디렉토리로 복사한다 apache 디렉토리가 없을시 자동생성)
(생성된 모습)
drwxr-xr-x 8 root root 4096 Apr 9 09:39 apache/
내부 모습또한 똑같다
이제 docker-compose.yml 파일에서 아까 주석했던 부분을 해제하겠습니다.
# vi docker-compose.yml
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
volumes: ( 도커 내부에서 파일 및 디렉토리를 아직 복사하지 않았기 때문에 주석처리를 한 상태로 실행)
– ./apache:/etc/apache2 # Apache 설정 디렉토리를 로컬과 연결
– ./html:/var/www/html # 웹 애플리케이션 파일을 로컬 ./html 디렉토리와 연결
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
# docker-compose down (중지)
# docker-compose up -d (시작)
성공했다면 docker ps를 했을때 아래와 같이 둘다 실행되어 있어야 합니다.
html 디렉토리와 apache 디렉토리가 생성된 모습을 확인합니다.
html 은 복사한적이 없는데 자동으로 생기는 이유에 대해서는 볼륨으로 연결했기때문에 도커내부에 있던 html 디렉토리가 권한,소유자 까지 합쳐서 로컬에 생긴겁니다. (하지만 빈껍데기죠)
html 디렉토리는 도커내부에서도 비어있기 때문에 사이트를 접속할시 나타날 index.php 파일을 생성해줍니다.
# vi html/index.php
내용
<?php
echo “Hello, Docker!”;
?>
자 이제 사이트를 접속하면 정상적으로 뜨는걸 확인할수있습니다.
테스트1
로컬에 있는 html/index.php를 생성했으니 도커 내부에서 똑같은 경로에 index.php 파일이 생성되었을 겁니다. (해당 index.php는 휘발성으로 로컬에 html 디렉토리에 생성되어있지 않으면 docker-compose.yml 파일 재시작시 사라지게 됩니다.)
테스트2
# vi Dockerfile (docker-compose.yml 파일과 같은 경로에 생성하였습니다. build: . 의미가 같은 경로라는걸 뜻함)
내용
# php:8.1-apache 이미지를 기반으로
FROM php:8.1-apache
# 필요한 패키지 설치 (vim)
RUN apt-get update && apt-get install -y vim && rm -rf /var/lib/apt/lists/*
# .bashrc 파일에 alias 추가
RUN echo “alias ll=’ls -al'” >> /root/.bashrc
도커내부에서 명령어를 진행해야 할 때가 있는데 테스트 1번을 진행하며 불편했던게 vi 와 ll 이 안된다는 것 이었습니다.
vi 할수있게 하기위해 필요한 패키지 설치(vim)을 추가했고
ls -al 이 아닌 ll 로 할수있게 하기 위해 .bashrc 파일에 alias 추가 하였습니다.
# docker-compose build (yml 파일 재빌드)
# docker-compose down (중지)
# docker-compose up -d (시작)
# docker exec -it apache_php bash 도커 내부에 접속후
vi , ll 을 사용
원할하게 잘 되는 모습입니다.