컨테이너와 호스트 간에 파일 복사하기
파일 복사
파일 복사는 컨테이너→호스트, 호스트→컨테이너로 양방향 모두 가능하다.
docker cp 원본_경로 복사할_경로
호스트→컨테이너
docker cp 호스트_경로 컨테이너_이름:컨테이너_경로
컨테이너→호스트
docker cp 컨테이너_이름:컨테이너_경로 호스트_경로
윈도우에서 호스트 경로는 C:\Users\사용자명\Documents\파일명 등으로 작성한다.
index.html 파일 만들기
<html>
<meta charset="utf-8" />
<body>
<div>안녕하세요? 도커 공부용 html입니다.</div>
</body>
</html>
호스트의 파일을 컨테이너 속으로 복사
항목 | 값 |
컨테이너 이름 | apa000ex19 |
이미지 이름 | httpd |
포트 설정 | 8089:80 |
윈도우 원본 경로 (제 바탕화면 경로입니다..)
C:/Users/whdms/Desktop/project/docker_practice/index.html
컨테이너 경로
/usr/local/apache2/htdocs
- 아파치 컨테이너 생성
docker run --name apa000ex19 -d -p 8089:80 httpd
2. 파일 복사
docker cp C:/Users/whdms/Desktop/project/docker_practice/index.html apa000ex19:/usr/local/apache2/htdocs/
아파치 초기화면 변경 확인
컨테이너의 파일을 호스트로 복사
파일 복사
docker cp apa000ex19:/usr/local/apache2/htdocs/index.html C:\\Users\\whdms\\Desktop\\
내 컴퓨터의 배경화면에 index.html이 잘 복사되었다.
컨테이너를 종료 및 삭제한다.
볼륨 마운트
- 볼륨
- 스토리지의 한 영역을 분할한 것.
- 하드디스크나 SSD를 분할한 하나의 영역이다.
- 마운트
- ‘연결하다’라는 의미 그대로, 대상을 연결해 운영체제 또는 소프트웨어의 관리 하에 두는 일
- USB 메모리가 컴퓨터에 마운트 되는 것과 같다.
- 데이터 퍼시스턴시(data persistency)
- 컨테이너 속에 데이터가 있다면 컨테이너와 함께 소멸되기 때문에, 데이터를 옮겨야 한다.
- 매번 데이터를 옮기기는 힘들기 때문에, 처음부터 컨테이너 외부에 둔 데이터에 사용하는 것
스토리지 마운트를 ‘볼륨 마운트’라고 하며, 볼륨 외에도 디렉터리, 파일, 메모리 등을 마운트 할 수 있다.
스토리지 마운트의 종류
- 볼륨 마운트
- 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트
- 조작이 어려워 임시나 자주 쓰지는 않지만 지우는 안 되는 파일을 두는 목적으로 사용
- 바인드 마운트
- 도커가 설치된 컴퓨터의 폴더 등 도커 엔진이 관리하지 않는 영역의 기존 디렉터리(파일)를 컨테이너에 마운트
- 자주 사용하는 파일을 둠
- 임시 메모리(tmpfs) 마운트
- 디스크 영역이 아닌 주 메모리 영역을 마운트
- 훨씬 빠르나 도커 엔진이 정지되거나 호스트가 재부팅하면 소멸
두 가지 마운트 방식의 차이점
- 간단한지
- 호스트 컴퓨터에서 파일을 다룰 필요가 있는지
- 환경의 의존성을 배제해야 하는지
볼륨 마운트는 도커 엔진의 관리 하에 있으므로 사용자가 실수로 지우거나 운영체제에 따라 명령어가 달라지는 등 의존성 문제도 일어나지 않는다.
따라서 도커 제작사에서도 볼륨 마운트 사용을 권장한다.
그러나 파일을 자주 편집해야하는 경우는 바인드 마운트 사용을 권장한다.
항목 | 볼륨 마운트 | 바인드 마운트 |
스토리지 영역 | 볼륨 | 디렉터리 또는 파일 |
물리적 위치 | 도커 엔진의 관리 영역 | 어디든 가능 |
마운트 절차 | 볼륨을 생성한 후 마운트 | 기존 파일 또는 폴더를 마운트 |
내용 편집 | 도커 컨테이너를 통해 | 일반적인 파일과 같음 |
백업 | 절차가 복잡 | 일반적인 파일과 같음 |
단, 볼륨 마운트의 볼륨은 미리 만들어두는 것이 좋다.
스토리지 영역을 만드는 커맨드
//볼륨 생성
docker volume create 볼륨_이름
//볼륨 삭제
docker volume rm 볼륨_이름
스토리지를 마운트하는 커맨드
//바인드 마운트 커맨드 예
docker run (생략) -v 스토리지_실제_경로:컨테이너_마운트_경로 (생략)
//볼륨 마운트 커맨드 예
docker run (생략) -v 스토리지_실제_경로:컨테이너_마운트_경로 (생략)
바인드 마운트 해보기
- 마운트 원본이 될 폴더/디렉터리 만들기
- run 커맨드로 아파치 컨테이너 실행
docker run --name apa000ex20 -d -p 8090:80 -v C:/Users/whdms/Desktop/project/docker_practice:/usr/local/apache2/htdocs httpd
index.html 파일이 없고 index2.html만 있으므로 index2.html이 뜬다.
3. index.html 파일 생성
index2.html 파일의 파일명을 index.html로 바꿨더니 파일 내용이 뜬다.
컨테이너 종료하고 삭제한다.
볼륨 마운트 해보기
//볼륨 생성
docker volume create apa000vol1
//볼륨 상세 정보 확인
docker volume inspect apa000vol11
- 마운트할 볼륨 생성
docker volume create apa000vol1
2. run 커맨드로 아파치 컨테이너 실행
docker run --name apa000ex21 -d -p 8090:80 -v apa000vol1:/usr/local/apache2/htdocs httpd
3. volume inspect 커맨드로 볼륨의 상세 정보 확인
docker volume inspect apa000vol1
[
{
"CreatedAt": "2025-01-05T14:04:48Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/apa000vol1/_data",
"Name": "apa000vol1",
"Options": null,
"Scope": "local"
}
]
4. container inspect 커맨드로 컨테이너의 상세 정보 확인
docker container inspect apa000ex21
....
"Mounts": [
{
"Type": "volume",
"Name": "apa000vol1",
"Source": "/var/lib/docker/volumes/apa000vol1/_data",
"Destination": "/usr/local/apache2/htdocs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
....
볼륨 마운트 확인
볼륨 마운트는 컨테이너를 거치지 않으면 볼륨 내용을 볼 수가 없다.
- 간접적 확인: inspect로 확인
- 파일을 읽고 쓰고있는지 확인: 별도 리눅스 컨테이너에 해당 볼륨을 마운트 후 확인
- 학습 환경에서: 볼륨에 쓰기 후, 컨테이너 삭제→똑같은 볼륨을 마운트→다시 컨테이너 생성하여 확인
볼륨 백업
주 컨테이너 종료→리눅스 운영체제 컨테이너를 만들고 tar명령어로 백업
docker run --rm -v 볼륨명 :/source -v 백업_저장_폴더명:/target 운영체제명(busybox) tar cvzf /sake/ 백업파일이름.tar.gz -C /source
docker run (옵션) 운영체제명(busybox) (인자)
- -v 볼륨명 :/source
- 볼륨을 busybox 컨테이너의 /source에 마운트 (볼륨 마운트)
- -v 백업_저장_폴더명:/target
- 백업이 저장될 호스트의 폴더를 busybox 컨테이너의 /target에 마운트 (바인드 마운트)
- tar cvzf /sake/ 백업파일이름.tar.gz -C /source
- /source의 내용을 /target 안의 ‘백업파일명.tar.gz’로 압축해 저장
- tar: tar 압축
- cvzf, -C: 압축 옵션 (xzvf: 압축 해제_
- 백업파일명.tar.gz: 파일명
컨테이너로 이미지 만들기
컨테이너로 이미지를 만드는 방법
- commit 커맨드로 기존 컨테이너를 이미지로 변환
- Dockerfile 스크립트로 이미지 생성
commit 커맨드로 컨테이너를 이미지로 변환
docker commit 컨테이너_이름 새로운_이미지_이름
- 아파치 컨테이너 생성 및 실행
docker run --name apa000ex22 -d -p 8092:80 httpd
2. 컨테이너를 이미지로 변환
docker commit apa000ex22 ex22_original1
3. 확인
docker image ls
C:\\Users\\whdms>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ex22_original1 latest 421da852de96 4 seconds ago 220MB
httpd latest 72f6e2460071 5 months ago 220MB
image 리스트에 ex22_original1이라는 이름의 image가 생긴 걸 볼 수 있다.
Dockerfile 스크립트로 이미지 만들기
docker build -t 생성할_이미지_이름 재료_폴더_경로
//Dockerfile 스크립트의 예
FROM 이미지_이름
COPY 원본_경로 대상_경로
RUN 리눅스_명령어
...
Dockerfile은 이미지 만들기만 가능하다.
인스트럭션 | 내용 |
FROM | 이미지 지정 |
ADD | 이미지에 파일, 폴더 추가 |
COPY | 이미지에 파일, 폴더 추가 |
RUN | 이미지 빌드 시 실행할 명령어 지정 |
- Dockerfile 스크립트 작성
윈도우에서는 .txt 확장자가 붙은 파일을 만든 다음 확장자를 삭제한다,
FROM httpd
COPY index.html /usr/local/apache2/htdocs
2. 이미지 빌드
docker build -t ex22_original2 C:\\Users\\whdms\\Desktop\\project\\docker_practice\\apa_folder
이미지가 추가 되었다.
4. 컨테이너 생성 및 실행
5. 컨테이너, 이미지 삭제
컨테이너와 이미지를 삭제한다.
이미지 옮기기
이미지를 옮기려면 도커 레지스트리를 통하거나 save 커맨드를 사용해 tar 포맷으로 내보내야한다.
docker save -o 파일_이름.tar 이미지_이름
컨테이너 개조
컨테이너를 개조하는 방법
- 파일 복사와 마운트
- 컨테이너에서 리눅스 명령어 실행→소프트웨어 설치, 설정 변경
컨테이너에서 리눅스 명령어 실행하기
리눅스 명령어를 실행하려면 shell이 필요하다.
shell에는 여러 종류가 있는데, bash 사용
- /bin/bash: bash 실행
- docker exec: 컨테이너 속에서 명령어를 실행하는 커맨드
- docker run: 컨테이너의 소프트웨어(아파치 등…) 대신 bash만 실행되므로, docker start로 컨테이너 재시작 필요 (자주 사용 x)
docker exec (옵션) 컨테이너_이름 /bin/bash
docker run (옵션) 이미지_이름 /bin/bash
docker exec -it apa000ex23 /bin/bash
docker run --name apa000ex23 -it -p 8089:80 httpd /bin/bash
bash 실행 시 shell에 입력된 명령은 도커 엔진이 아니라 해당 컨테이너에서 실행
bash 사용 시 도커 명령 사용 불가
- 컨테이너에서 도커 엔진으로 돌아오기: exit
우분투 명령어
//메세지 출력
echo "Hello World"
//아파치 설치
apt install apache2
//MySQL 설치
apt install mysql-server
도커 엔진을 통한 명령과 컨테이너 내부에서 실행하는 명령
도커 엔진을 통해야하는 명령
- 도커 엔진 시작, 종료
- 컨테이너 시작, 종료, 컨테이너 안팎의 파일 복사
- 도커 엔진과 컨테이너 전체 관리
컨테이너 내부에서 실행하는 명령
- 소프트웨어 설치, 실행, 종료, 설정 변경
- 파일 작업
도커 허브 등록 및 로그인
- 도커 레지스트리: 이미지를 배포하는 장소
- 도커 허브: 도커 제작사에서 운영하는 공식 도커 레지스트리
- 리포지토리: 레지스트리를 구성하는 단위
이미지 이름과 태그
이미지를 업로드하려면 이미지에 태그를 부여해야한다.
nyapa000ex22와 같이 대충 붙였던 이름을 zooozoo.coomm/nyapacchi:13 과 같이 레지스트리의 주소와 버전 표기를 추가해야함
태그 형식: 레지스트리_주소(도커_허브_ID)/리포지토리_이름:버전
버전은 생략 가능
docker tag
이미지 이름을 태그로 바꾸고 복제하는 커맨드
docker tag 원래_이미지_이름 레지스트리_주소/리포지토리_이름:버전
docker tag nyapa000ex22 zooozoo.coomm/nyapacchi:13
docker push
이미지를 업로드하는 커맨드
docker push 레지스트리_주소/리포지토리_이름:버전
docker push zooozoo.coomm/nyapacchi:13
레지스트리 만들기
비공개 레지스트리 만들기
컨테이너 생성→레지스트리에 로그인→이미지를 내려받을 곳으로 이 레지스트리를 지정
포트 번호는 5000번 사용
docker run -d -p 5000:5000 registry
도커 허브 사용
create a repository로 생성
'개발 공부 > 인프라' 카테고리의 다른 글
[그림과 실습으로 배우는 도커 & 쿠버네티스] Ch7 - 도커 컴포즈를 익히자 (1) | 2025.01.08 |
---|---|
[그림과 실습으로 배우는 도커 & 쿠버네티스] Ch5 - 여러 개의 컨테이너를 연동해 실행해보자 (0) | 2025.01.06 |
[그림과 실습으로 배우는 도커 & 쿠버네티스] Ch4 - 컨테이너를 실행해 보자 (0) | 2025.01.05 |
[그림과 실습으로 배우는 도커 & 쿠버네티스] Ch3 - 도커를 사용해보자 (0) | 2025.01.05 |
[그림과 실습으로 배우는 도커 & 쿠버네티스] Ch2 - 도커의 동작 원리 (0) | 2025.01.05 |