호스트와 컨테이너 간 파일 전송
컨테이너에서 로컬 머신으로 데이터를 옮길 때 docker cp를 활용합니다. 다음은 대상 경로를 지정하는 기본 문법입니다.
docker cp <대상_컨테이너>:<내부_경로> <호스트_저장위치>
실제 사용 예시:
docker cp web_app:/var/log/nginx/access.log /home/admin/logs/access.log
반대로 호스트의 파일을 컨테이너 내부로 복사하려면 순서를 바꿉니다.
docker cp /home/admin/config.yml web_app:/app/settings/config.yml
파이프라인을 활용한 스트리밍 방식도 가능합니다. 컨테이너의 쉘에 접근하지 않고 바로 내용을 전달할 수 있습니다.
cat /home/admin/source.txt | docker exec -i web_app tee /app/target.txt
이미지 조작 명령어
| 동작 | 명령어 |
|---|---|
| 저장소 이미지 목록 확인 | docker images 또는 docker image ls |
| 원격 이미지 내려받기 | docker pull nginx:alpine |
| 불필요한 이미지 제거 | docker rmi nginx:alpine |
| 이미지 메타데이터 확인 | docker inspect nginx:alpine |
| Dockerfile로 빌드 | docker build -t myapp:v2.1 . |
컨테이너 생명주기 관리
실행 중인 프로세스를 확인하고 상태를 제어하는 방법입니다.
# 활성화된 컨테이너만 표시
docker ps
# 중단된 것 포함 전체 조회
docker ps -a
# 백그라운드 실행 및 포트 바인딩
docker run -d -p 9000:3000 --name api_server node:18
# 대화형 터미널 접속
docker run -it node:18 /bin/sh
# 실행 중인 인스턴스 재시작
docker restart api_server
# 완전한 제거 (실행 중인 경우 먼저 중지 필요)
docker stop api_server
docker rm api_server
# 내부 쉘 진입
docker exec -it api_server /bin/sh
# 실시간 자원 소비 모니터링
docker stats
네트워크 및 스토리지 구성
가상 네트워크 인프라를 직접 구축하여 컨테이너 간 통신을 관리합니다.
# 사용자 정의 네트워크 생성
docker network create backend_net
# 특정 네트워크 상세 정보
docker network inspect backend_net
# 컨테이너를 네트워크에 연결/분리
docker network connect backend_net db_container
docker network disconnect backend_net db_container
영속 볼륨을 생성하여 데이터를 호스트에 안전하게 보관합니다.
# 볼륨 생성 및 마운트
docker volume create app_data
docker run -v app_data:/var/lib/postgresql/data postgres:15
Docker Compose 다중 서비스 운영
여러 컨테이너를 선언적으로 정의하고 일괄 제어합니다.
# 전체 스택 기동 (백그라운드)
docker-compose up -d
# 이미지 재빌드 후 실행
docker-compose up --build
# 서비스 중단 및 트워크/볼륨 정리
docker-compose down
# 개별 서비스 로그 추적
docker-compose logs -f web
시스템 정리 및 유지보수
# 사용하지 않는 모든 리소스 일괄 삭제
docker system prune -f
# 카테고리별 선택적 정리
docker container prune # 중지된 컨테이너
docker image prune # 그 없는 이미지
docker volume prune # 마운트되지 않은 볼륨
docker network prune # 연결 없는 네트워크
QNAP NAS 환경에서 프록시 설정
Container Station이 설치된 경로로 이동하여 실행 스크립트를 수정합니다.
cd /share/CACHEDEV1_DATA/.qpkg/container-station
vim script/run-docker.sh
스크립트 하단에 프록시 환경변수를 추가합니다.
export http_proxy="http://192.168.50.22:7890"
export https_proxy="http://192.168.50.22:7890"
export no_proxy="192.168.50.0/24,localhost,127.0.0.1"
변경사항 적용을 위해 Container Station 서비스를 재시작합니다.
실전 배포 예시
미디어 서버 (Emby)
docker run -d \
--name streaming_svc \
--network host \
--restart always \
--device /dev/dri:/dev/dri \
-e UID=0 -e GID=0 \
-e http_proxy=http://192.168.1.22:7890 \
-e https_proxy=http://192.168.1.22:7890 \
-e no_proxy=localhost,127.0.0.1 \
--privileged \
-v /share/docker/emby/config:/config \
-v /share/video:/media \
amilys/embyserver:4.8.0.56
관계형 데이터베이스 (MySQL 8.0)
쉘 스크립트로 재사용 가능하게 작성합니다.
#!/bin/sh
docker run \
-p 3307:3306 \
--name rdb_primary \
--privileged=true \
--restart unless-stopped \
-v /user/local/server/mysql8.0.33/conf:/etc/mysql \
-v /user/local/server/mysql8.0.33/logs:/logs \
-v /user/local/server/mysql8.0.33/data:/var/lib/mysql \
-v /user/local/server/mysql8.0.33/etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=SecurePass123! \
-e MYSQL_ROOT_HOST='%' \
-d mysql:8.0.33
실행 후 원격 접속 권한을 부여합니다.
docker exec -it rdb_primary bash
mysql -u root -p
# MySQL 프롬프트 내에서
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;