[Docker] 연습하기

2023. 2. 27. 02:15Tools/Docker

 

1. 연습 시작

 

0) 실습 환경 조성

mkdir -p ~/Desktop/docker-test/mountDir

 

1) 이미지로 컨테이너_1 만들기

docker run -d --name con_1 docker/getting-started

 

2) 컨테이너_1에 test.txt 만들기

docker exec con_1 mkdir /app;
docker exec con_1 touch /app/test.txt;
docker exec con_1 ls /app | grep test.txt;

 

3) 컨테이너_1을 commit해서 이미지로 만들기

docker commit con_1 con_2;
docker images | grep con_2;

 

4) 컨테이너_2 만들기. 이때 호스트에 bind mount하기

docker run -d --name con_2 -v ~/Desktop/docker-test/mountDir:/app con_2;
docker ps;

 

5) test.txt가 마운트한 호스트에 있는지 확인

ls -al ~/Desktop/docker-test/mountDir/

→ 없다

 

6) 컨테이너_2 안에 test.txt가 있는지도 확인

docker exec con_2 ls /app | grep test.txt;

→ 없다

→ 아마 마운트 시점에 호스트의 디렉터리는 비어있었고 마운트 되면서 컨테이너의 디렉터리도 덮어쓰면서 비워졌다.

 

docker run -d --name con_2_a  con_2;
docker exec con_2_a ls /app | grep test.txt;

→ 마운트 하지 않으면 test.txt는 존재한다.

 

docker stop con_2_a && docker rm con_2_a;
docker exec con_2 touch /app/test.txt;
docker exec con_2 ls /app | grep test.txt;

추후 진행을 위해서 con_2_a 컨테이너를 지우고 con_2 컨테이너의 /apptest.txt를 생성한다.

 

5-2) 다시 test.txt가 마운트한 호스트에 있는지 확인

ls -al ~/Desktop/docker-test/mountDir/

→ 이번에는 있다.

→ 마운트 이후의 컨테이너의 변화는 호스트나 볼륨에 영향을 준다.

 

7) 컨테이너_2 안에 test.txt 수정해 보기

docker exec -it con_2 sh -c "echo 'hello' > /app/test.txt";
docker exec con_2 cat /app/test.txt;

 

8) 호스트에서 test.txt의 내용이 수정되었는지 확인하기

cat ~/Desktop/docker-test/mountDir/test.txt

 

9) 컨테이너_1과 2를 삭제한다

docker stop con_1 && docker rm con_1;
docker stop con_2 && docker rm con_2;
docker ps -a;

 

10) 호스트에 test.txt가 존재하는지 확인

ls -al ~/Desktop/docker-test/mountDir/

→ 있다.

→ 컨테이너의 데이터가 다른 곳에 bind mount되거나 volume에 mount된 경우 컨테이너가 지워져도 보존된다.

 

11) 이후에 이미지로 컨테이너_3을 만들면서 호스트와 bind mount 하기.

docker run -d --name con_3 -v ~/Desktop/docker-test/mountDir:/app con_2

 

12) 컨테이너_3에 test.txt가 있는지 확인한다.

docker exec con_3 ls /app | grep test.txt

 

13) 호스트에도 test.txt가 존재하는지 확인한다.

ls -al ~/Desktop/docker-test/mountDir/

 

14) 컨테이너_3과 호스트의 test.txt 파일의 내용을 확인한다.

echo "host";
cat ~/Desktop/docker-test/mountDir/test.txt;
echo "con_3 ";
docker exec con_3 cat /app/test.txt;

→ 둘 다 hello라고 답한다.

→ 호스트의 test.txt가 컨테이너의 test.txt를 덮어썼다.

 

15) 종료

docker stop con_3 && docker rm con_3;
docker ps -a;
docker rmi con_2;
docker images;

Done~

 


2. 결론

 

마운트 시점에 호스트의 디렉터리나 파일 또는 볼륨이 컨테이너의 디렉터리나 파일을 덮어쓴다.

 

이 과정에서 이미지로부터 생성된 컨테이너의 디렉터리는 사실상 처음부터 없던 것과 같다.

 

하지만 마운트 이후의 컨테이너의 변화는 호스트나 볼륨에 영향을 준다.

 

컨테이너의 데이터가 다른 곳에 bind mount되거나 volume에 mount된 경우 컨테이너가 지워져도 보존된다.

 

연습하면서 혼란스러운 부분을 많이 줄었다.

 

(+이미지로 만들어도 다시 컨테이너로 만들어서 수정할 수 있다. 이미지는 불변은 아니다.)

 


'Tools > Docker' 카테고리의 다른 글

[Docker] Multi-architecture build  (0) 2023.03.07
[Docker] Github와의 연동  (0) 2023.02.28
[Docker] Compose  (0) 2023.02.27
[Docker] 가상화된 Docker host에 접근하기  (0) 2023.02.27
[Docker] 이미지 배포  (0) 2023.02.27