도커로 워드프레스를 설치하고 잘 사용하다가 업데이트를 마딱드린 순간이 찾아왔다. 워드프래스 내의 자동 업데이트 기능을 사용해 보려 했으나, FTP 정보를 입력 해라는둥 도커 시스템에는 적합하지 않는 업데이트 방법만 제시했다. 그래서 도커를 이용해서 WordPress를 업데이트할 방법을 찾아봤다.
방법은 간단하다. 파일 두개를 삭제한 후, Docker의 워드프레스 이미지를 업데이트 하고 컨테이너를 재생성 하면 된다.
rm index.php && rm wp-includes/version.php
docker-compose pull
docker-compose up -d
주의할 부분이 있다. 이 방식은 WordPress 코어를 최신 버전으로 덮어쓴다는 것이다. /wp-content 폴더나 /wp-config.php 파일을 제외한 모든 기본 워드프레스 파일들이 모두 덮어써진다. 플러그인등을 사용하지 않고 기존에 워드프레스 코어를 직접 수정한 경우라면 이 방법을 사용해서는 안된다. 이 방법을 사용했다가는 기존 수정했던 코드들이 다 날라갈 것이다.
이전 글에서는 Docker를 사용해 게스트 유저가 서버를 운영할 수 있는 가상 환경을 만드는 것을 했다. 그런데 이전 글을 잘 보면 Volume 설정을 하지 않아 컨테이너를 종료하면 컨테이너 내의 모든 작업 내역이 유실된다.
모든 데이터를 보존하려 아래와 같이 컨테이너의 루트 디렉터리를 호스트와 공유하여 데이터를 동기화해보는 방법을 시도할 수는 있겠지만,
docker run -dit -v ~/guest1:/ ubuntu:18.04
루트 디렉터리는 볼륨으로 바인딩 할 수 없다는 오류를 볼 수 있다.
docker: Error response from daemon: invalid volume specification: '/home/ubuntu/guest1:/': invalid mount config for type "bind": invalid specification: destination can't be '/'.
bind mount를 하거나 tmpfs mount를 해도 결과는 같다.
docker run -dit --mount type=bind,source=~/guest1,target=/ ubuntu:18.04
# or
docker run -dit --tmpfs / ubuntu:18.04
그렇다면 어떻게 해결할 수 있을까? Docker는 여러 명령어를 지원하는데 export와 import 명령어를 사용하면 이 문제를 어느 정도 해결 할 수 있다.
정확히 말하면 위의 방법들처럼 실제 데이터를 호스트와 공유하는 것이 아닌, 특정 시점의 컨테이너 파일 시스템을 파일로 저장하고 불러오는 방법이다.
먼저 컨테이너를 파일로 저장하는 방법은 아래와 같다. export 명령어를 사용하여 컨테이너의 파일 시스템을 guest1_export.tar 파일로 아카이빙 할 수 있다.
docker stop jellyfin
cd /opt/jellyfin/app/data/data/
sqlite3 library.db
pragma default_cache_size;
# (this will show current size)
pragma default_cache_size = 5000000;
pragma default_cache_size;
# (this will show current size, just to check it worked)
.exit
docker start jellyfin