Recover WordPress container

Page content

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의 초반에 나오는 로그를 이용해서 구글링을 해봤는데 마침 이런 글이 눈에 띄었다.

Wordpress latest does not works with mysql latest container · Issue #313 · docker-library/wordpress · GitHub

바로 이거였다.

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년 째 유지하고 있는 블로그가 다시 살아났다 :-)