"Docker 소프트웨어 엔지니어를 실천하는'Docker 잘 몰라'를 끝으로 한 권의 책을 만들었습니다."

VSCode의 devcontainer에서 개발 환경을 조정할 수 있게 된 후에 저도 이 트렌드를 타고 개인의 개발은 devcontainer에서 왔지만 조금만 사용하면 자신의 Docker에 대한 이해가 너무 얕아서 그런지 생각보다 개발 환경을 구축하지 못하는 현상이 나타났습니다.
그래서 저는 Docker를 잘 배우고 싶어요. 여러 조사를 통해 Zenn의 hongsan이 Docker의 입문서도 무료로 공개했고 처음부터 시도해 봤어요.
https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59
지령의 설명뿐만 아니라 가상화란 무엇입니까?이 점부터 설명하자면 제목과 같이 이 책은'잘 모르겠다'는 상태에서 벗어나기에 적합하다.
2022년 4월은 현재 무료이기 때문에 Docker 주변 지식에 불안한 점이 있는 사람은 꼭 한번 읽어보는 것을 추천한다.
하지만 작은 이삭과 환경이 나빠서 그런지 수레에 막힌 곳이 있으니 적어야 한다.
앞으로 이 책에 몰두하는 사람들을 도울 수 있다면 정말 좋겠다.
참고로 제 개발 환경은 다음과 같습니다.
  • OS : Windows10
  • Docker version : 20.10.7
  • 터미널: VScode의 bash
  • !
    이 글은'실천 Docker 소프트웨어 엔지니어가'Docker가 잘 모른다'고 끝낸 책'을 읽었다는 전제로 실렸다.
    책에 사용된 요소는 기사에서도 사용될 수 있으니 양해해 주십시오.

    mount path must be absolute.

    3部:ボリューム 근처에 다음 명령이 나타납니다.
    게재 명령
    $ docker container run                                                   \
        --name db                                                            \
        --rm                                                                 \
        --detach                                                             \
        --platform linux/amd64                                               \
        --env MYSQL_ROOT_PASSWORD=rootpassword                               \
        --env MYSQL_USER=hoge                                                \
        --env MYSQL_PASSWORD=password                                        \
        --env MYSQL_DATABASE=event                                           \
        --mount type=volume,src=docker-practice-db-volume,dst=/var/lib/mysql \
        docker-practice:db
    
    나는 이것을 시도해 보았는데, 아래의 오류가 발생했다.
    docker: Error response from daemon: invalid mount config for type "volume": invalid mount path: 'C:/Program Files/Git/var/lib/mysql' mount path must be absolute.
    
    에 따르면 지정된 설치권의 경로dst=/var/lib/mysql는 인산염의 상대적인 경로로 여겨진다.
    조사를 많이 했는데 이런 기사가 나왔어요.
    https://fukuchiharuki.me/static/pukiwikidump/page/Windows에서 암호화 볼륨을 마운트할 수 없습니다.html
    이를 참조하여 경로 지정을 //부터 변경합니다.
    수정 후
    $ docker container run                                                   \
        --name db                                                            \
        --rm                                                                 \
        --detach                                                             \
        --platform linux/amd64                                               \
        --env MYSQL_ROOT_PASSWORD=rootpassword                               \
        --env MYSQL_USER=hoge                                                \
        --env MYSQL_PASSWORD=password                                        \
        --env MYSQL_DATABASE=event                                           \
        --mount type=volume,src=docker-practice-db-volume,dst=//var/lib/mysql \
        docker-practice:db
    
    위와 같은 명령으로 변경해 컨테이너를 만들었다.

    init.sql라는 디렉터리를 만들었습니다.

    3章:バインドマウント에는 DB의 초기화 조회를 용기에 연결하고 설치하는 주석이 있다.
    $ docker container run                                                                       \
        --name db                                                                                \
        --rm                                                                                     \
        --detach                                                                                 \
        --platform linux/amd64                                                                   \
        --env MYSQL_ROOT_PASSWORD=rootpassword                                                   \
        --env MYSQL_USER=hoge                                                                    \
        --env MYSQL_PASSWORD=password                                                            \
        --env MYSQL_DATABASE=event                                                               \
        --mount type=volume,src=docker-practice-db-volume,dst=/var/lib/mysql                     \
        --mount type=bind,src=$(pwd)/docker/db/init.sql,dst=/docker-entrypoint-initdb.d/init.sql \
        docker-practice:db
    
    이 조작을 실행한 후 컨테이너 검사표에 들어갈 때 표를 작성하지 않습니다.
    컨테이너 안/docker-entrypoint-initdb.d,init를 조사해 보세요.sql라는 디렉터리를 만들었습니다.
    이것에 관해서는 실행하는 지령도 틀림없기 때문에 어떤 Docker의 새로운 방법입니까??상당히 어려운 부분을 조사했지만 사실상 이유는 간단했다./work 디렉토리에 명령이 실행되지 않았습니다.
    명령 내$(pwd)는 명령을 실행하는 디렉터리이기 때문에 참조할 때 init입니다.ql를 찾을 수 없습니다. Docker 측에서 빈 디렉터리를 만들었습니다.
    디렉터리에서 잘 /work 실행된 결과 초기화 조회가 실행되고 표가 만들어졌습니다.
    실행할 카탈로그를 확인하지 않으면서 회사에서 이러한 환경 구축을 하고, 여러 구성원에게 가로로 펼칠 때 각 구성원의 카탈로그 구조 등에 의존하지 않는 구조를 원한다.

    DB에 로그인할 수 없습니다.

    3部:Docker Compose에서 지금까지의 명령을 docker-compose로 설정합니다.yml로 재현하는 절차를 설명했다.
    절차가 끝난 후docker compose up 컨테이너를 시작하고 프로그램을 보면 첫 페이지와 메일을 보내는 페이지를 볼 수 있지만history 페이지가 보이지 않는다.
    오류 로그를 보고 다음과 같은 정보를 발견했습니다
    PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'hoge'@'172.28.0.4' (using password: YES) in /src/history.php:15
    
    DB에 연결되지 않은 것 같습니다.
    다시 한 번 봤는데 MySQL의 로그인 비밀번호에 typo가 있어요.
    docker-compose.yml
      db:
        container_name: docker-practice-db
        build:
          dockerfile: docker/db/Dockerfile
          context: .
        environment:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: hoge
          MYSQL_PASSWORD: pasword
          MYSQL_DATABASE: event
        volumes:
          - type: volume
            source: docker-practice-db-volume
            target: /var/lib/mysql
          - type: bind
            source: ./docker/db/init.sql
            target: /docker-entrypoint-initdb.d/init.sql
    
    그림% 1개의 캡션을 편집했습니다.
    docker-compose.yml(수정 후)
      db:
        container_name: docker-practice-db
        build:
          dockerfile: docker/db/Dockerfile
          context: .
        environment:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: hoge
          MYSQL_PASSWORD: password
          MYSQL_DATABASE: event
        volumes:
          - type: volume
            source: docker-practice-db-volume
            target: /var/lib/mysql
          - type: bind
            source: ./docker/db/init.sql
            target: /docker-entrypoint-initdb.d/init.sql
    
    그런데 아직 연결이 안 된 것 같아요.docker compose up --build 컨테이너에 들어가면 환경 변수를 조사해도 이상한 점이 없다.
    # echo $MYSQL_ROOT_PASSWORD
    rootpassword
    # echo $MYSQL_USER
    hoge
    # echo $MYSQL_PASSWORD
    password
    # echo $MYSQL_DATABASE
    event
    
    도대체 어떻게 된 일인지 고민이 좀 돼서 DB의 데이터가 volume에 설치되어 있는 게 생각났어요.
    따라서volume를 삭제한 후에 구축합니다.
    $ docker volume ls
    DRIVER    VOLUME NAME
    local     work_docker-practice-db-volume
    
    $ docker compose down
    [+] Running 4/4
     - Container docker-practice-mail  Removed   0.9s 
     - Container docker-practice-db    Removed   0.9s 
     - Container docker-practice-app   Removed   0.9s 
     - Network work_default            Removed   0.1s
    
    $ docker volume rm work_docker-practice-db-volume
    work_docker-practice-db-volume
    
    $ docker compose up --build
    
    이렇게 하면 DB에 안전하게 연결할 수 있고 히스토리 페이지도 볼 수 있다.
    모든 페이지의 마지막 부분에는 그 페이지에 만들어진 자원을 삭제하는 절차가 기재되어 있지만, 페이지마다 다시 정렬할 때는 자원을 모두 삭제한 후에 다시 하는 것을 권장합니다.

    총결산


    내가 막힌 곳은 대략 상술한 세 곳이다.
    제 과실도 있었지만 책 마지막에 디버깅 기법이 기재돼 있어 처음부터 잘 이해하면 다소 좌절된 부분도 스스로 해결하고 추진할 수 있다는 게 실감입니다.
    제가 처음에도 말씀드렸지만 아직 이 책을 못 보신 분들은 꼭 한번 보세요.
    마지막으로, 이렇게 간단하고 알기 쉬운 책을 무료로 공개해 주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기