Recover WordPress container
One day
The Wordpress container does not work at all. docker ps
로 확인하면 1분 주기로 restart를 반복하고 있다. 경험상 이건 wordpress 앱이 초기화 과정에서 문제가 있는 거라는 걸로 짐작된다. 로그를 확인해 보니 아래와 같은 에러만 출력.
뭐가 문제일까 멀쩡히 잘 돌던 녀석들인데.
mini2:html cychong$ docker logs -f f12c3b3a57ef
...
Warning: mysqli::__construct(): Unexpected server respose while doing caching_sha2 auth: 109 in Standard input code on line 22
MySQL Connection Error: (2006) MySQL server has gone away
Warning: mysqli::__construct(): MySQL server has gone away in Standard input code on line 22
Warning: mysqli::__construct(): (HY000/2006): MySQL server has gone away in Standard input code on line 22
Warning: mysqli::__construct(): Unexpected server respose while doing caching_sha2 auth: 109 in Standard input code on line 22
Warning: mysqli::__construct(): MySQL server has gone away in Standard input code on line 22
Warning: mysqli::__construct(): (HY000/2006): MySQL server has gone away in Standard input code on line 22
MySQL Connection Error: (2006) MySQL server has gone away
Warning: mysqli::__construct(): Unexpected server respose while doing caching_sha2 auth: 109 in Standard input code on line 22
MySQL Connection Error: (2006) MySQL server has gone away
Warning: mysqli::__construct(): MySQL server has gone away in Standard input code on line 22
Warning: mysqli::__construct(): (HY000/2006): MySQL server has gone away in Standard input code on line 22
Let’s debug
하지만 뭔가 달라진 게 있으니 갑자기 문제가 발생했겠지.
하지만 좀처럼 실마리를 찾기가 어렵고 급한 서비스도 아니라서 제대로 파서 해결할 생각을 하지 않았다. 방문자도 없는 블로그인데 뭐 라는 생각에.
그래도 책 읽을 때마다 책 제목을 적어두는 페이지가 이 블로그에 있어 책을 한 권 다 읽은 김에 시간을 내서 고쳐보기로 했다.
이런 문제의 가장 쉬운 해결책 검색은 에러 메시지를 그대로 검색하는 것. 위 로그에 있는 에러 메시지 몇 가지를 넣어봤지만 쓸모있는 정보(해결책이나 실마리라도)가 담긴 글이 잘 나오질 않는다. 대부분 일반적인 mysql에 대한 에러 해결책인데 그런 문제는 아닌 듯 하고.
이 전에 추측한 것이 그냥 wordpress container에서 mysql container로의 통신에 문제가 있는게 아닐까 싶었다. 마침 docker for mac을 edge 버전으로 사용하고 있어서 그런가 하는 생각도 들고. 그래서 docker for mac을 stable 버전으로 바꿔도 보고, mysql, wordoress container 삭제/생성을 수차례 반복했다. 하지만 백약이 무효였다.
Resolution
이것저것도 다 안되니 지푸라기라도 잡는 심정으로 mysql을 mariaDB등으로 바꿔볼까 라는 생각을 했다. 백업해 놓은 mysql db 파일은 mariaDB에 사용할 수 있는 걸까? 아니면 sqlite3로 바꿀까? 근데 이건 정보가 너무 없네. 몇 개 나오는 게 5-6년 전 내용이라 지금도 유요한 방법인 지 의심스러웠다.
그러다 wordpress container의 초반에 나오는 로그를 이용해서 구글링을 해봤는데 마침 이런 글이 눈에 띄었다.
바로 이거였다.
MySQL 8 changed the password authentication method. You’re looking for the mysql_native_password plugin https://dev.mysql.com/doc/refman/8.0/en/native-pluggable-authentication.html So you’ll want to connect with mysql —default-auth=mysql_native_password -p Or you could use mysql 5.7
mysql을 5.7 버전을 사용하거나 8버전을 사용하면서 인증 방식을 지정하면 된단다.
Docker-compose를 사용하는 경우 이렇게 지정하면 된다고 한다.
mysql:
image: mysql:5.7
# or
image: mysql:8
command: '--default-authentication-plugin=mysql_native_password'
Ansible을 사용해서 container를 만들고 있는 나도 그냥 똑같이 해 봤다.
---
- hosts: mini2
tasks:
- name: Start mysql
docker_container:
name: mysql
image: mysql
command: '--default-authentication-plugin=mysql_native_password'
docker-compose.yml 기준으로 옵션을 설명하고 있어 ansible에서도 같은 걸 사용하는 지 몰라 제대로 옵션이 적용되었는 지 확인해 보니 아래 Args
에 있다
mini2:html cychong$ docker inspect mysql
[
{
“Id”: “a6336d1ef9a428564ff91aff396d5fa60bfa4bff092980758fc656e303b24fb6”,
“Created”: “2018-09-04T14:55:24.440551604Z”,
“Path”: “docker-entrypoint.sh”,
“Args”: [
“—default-authentication-plugin=mysql_native_password”
],
Finally
container들을 실행시킨 후 다시 docker logs wordpress
명령으로 확인해 보니 이제 그 지긋지긋한 mysql 관련 에러가 보이지 않는다.
Complete! WordPress has been successfully copied to /var/www/html
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 172.17.0.3. Set the ‘ServerName’ directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 172.17.0.3. Set the ‘ServerName’ directive globally to suppress this message
[Tue Sep 04 14:55:54.842454 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.9 configured — resuming normal operations
그리고 블로그 접속해 보니 정상적으로 동작. 덕분에 15년 째 유지하고 있는 블로그가 다시 살아났다 :-)