Docker Engine 소개

5956 단어 Dockertech

개시하다


Docker는 매우 편리하지만 그 구조와 구조를 완전히 이해하는 사람은 드물다.기본적으로 이미지 구축, 용기 시작 등일 뿐 지령 집행의 결과를 이해할 수 있다면 그 구조를 이해할 필요가 없다.그러나 최소한의 메커니즘이라도 갑작스러운 오류가 발생했을 때'왜 이 오류가 발생했을까','어디서 이 오류가 발생했을까'를 깨닫고 적절한 처리를 할 수 있었다.

구조를 왜 꼭 알아야 돼요?


$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
어느 날 갑자기 이런 오류가 발생했다.이미 구조를 알고 있거나 잘못된 정보에서 냉정하게 상상해냈으면 좋았을 텐데, 모른 채 분명히 시간 안에 해야 할 일이 있는데 갑자기 이런 잘 모르는 착오가 생기면 어떻게 생각할까.이어 "빨리 목적 작업을 고치고 싶어 잘못된 내용으로 검색한 뒤 맨 위에서 검색 결과를 찾았는데 비슷한 해결책이 있다면 잠시 고쳐보자"고 덧붙였다.스스로 급하게 구조를 모르면 대체로 그렇게 처리한다.하지만 해결되더라도 매번 불쾌해'도대체 그게 뭘까'라는 역겨운 마음을 남긴다.십중팔구는 다시 발생하면 해결 방안을 조사할 것이다.그렇다면'구조를 모르고 도구만 사용한다'는 상태도 크게 문제가 되지 않겠죠.

Docker Engine의 구성 요소는 세 가지입니다.


Docker Engine은 세 가지 구성 요소로 구성됩니다.
  • Docker CLI
  • REST API
  • Docker 데몬

  • (출처: Docker Docs-ja, Docker 개요 "Docker Engine은 무엇입니까?"docker run 등 Docker CLI를 실행하면 REST API는 UNIX 도메인 플러그/var/run/docker.sock를 통해 두드려지고, Docker 데몬은 실제로 용기를 만들어 이미지 구축 등을 처리한다.따라서 이러한 오류는 Docker 데몬 중지 또는 올바르게 연결할 수 없음으로 인해 발생합니다.구조를 알면 이렇게 봐야 할 곳을 알 수 있다(이렇게 말하지만 이 예에서 잘못된 정보를 읽으면 문제가 바로 기술되기 때문에 구조를 잘 몰라도 고장난 슛에 익숙해진 분들은 대처할 수 있다)

    (출처: GitHub、docker/docker.github.io「Docker architecture」

    실제로 curl로 Docker Engine API 두드리기


    나는 Docker CLI가 API를 통해 Docker Damon과 대화를 했다고 들었지만 도메인 네임을 통해 플러그를 꽂았기 때문에 설명만으로는 이해할 수 없는 사람이 있다고 생각한다(동료가 실제로 보기 전에 이해하지 못했다고 한다).Docker Engine API가 필드 소켓을 통해서만'보통 API입니다'라는 것을 직접 보여드리기 위해 Curl로 API를 두드리고 싶습니다.curl에서 7.4이상--unix-socket <domain_socket_path>에서 필드 플러그인을 지정한 다음 컨테이너 정보를 얻을 때까지 Docker Engine API를 두드려 Docker 수호 프로세스에 메시지를 보낼 수 있습니다."API를 보면서 두드리고 싶다"는 말은 해당 docker 버전을 확인하고 docker docs, Develop with Docker Engine API의 해당 버전의 링크 주소를 참조하십시오.
    $ docker version
    Client: Docker Engine - Community
     Version:           19.03.5
     API version:       1.40
    
     ...
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.5
      API version:      1.40 (minimum version 1.12)
    
      ...
    
    

    (출처: docker docs, Develop with Docker Engine API「API version matrix」
    그럼 우선 존재하지 않는 URL을 쳐보세요.
    $ curl --unix-socket /var/run/docker.sock http://127.0.0.1:9323/path/not/exists
    {"message":"page not found"}
    
    이번에는 용기 정보 목록을 얻는 API/containers/json를 두드려 보겠습니다.
    $ curl --unix-socket /var/run/docker.sock http://127.0.0.1:9323/containers/json
    []
    
    빈 응답이 Docker 데몬에서 반환됩니다.실제 가동된 컨테이너가 없기 때문이다.
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    
    Nginx 컨테이너를 만든 다음 API를 두드립니다.
    ~ $ docker run --rm -d --name nginx nginx
    2b9896d63b8140871fc875a5b2c2f27ad1c2de8ca7a4cbcada49c124a3d39532
    
    ~ $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    2b9896d63b81        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              nginx
    
    # そのままAPIを叩くとレスポンスが見辛くなるため末尾にjqを入れてます
    $ curl --unix-socket /var/run/docker.sock http://127.0.0.1:9323/containers/json | jq
    [
      {
        "Id": "2b9896d63b8140871fc875a5b2c2f27ad1c2de8ca7a4cbcada49c124a3d39532",
        "Names": [
          "/nginx"
        ],
        "Image": "nginx",
        "Command": "nginx -g 'daemon off;'",
        "Created": 1620082854,
        "Ports": [
          {
            "PrivatePort": 80,
            "Type": "tcp"
          }
     
        ...
        
        "Mounts": []
      }
    ]
    
    컨테이너 정보가 되돌아옵니다.이렇게 보면'Docker는 정말 API로 교환하는구나'라는 것을 알 수 있다.

    보태다


    이후 추가 설명에 따르면 Docker는 리눅스 기능을 이용해 개발했기 때문에 리눅스에서만 실행됐다.따라서 MacOS와 Windows에서는 일반적으로 VirtualBox와 같은 가상화 소프트웨어를 사용합니다.리눅스를 게스트로 OS에 Docker를 설치하지 않으면 사용할 수 없다(자신은 단순히 생각하기 귀찮아서 뇌사의 무거운 Docker Desktop for Mac를 넣고 Docker를 사용하지만 Elixir로 컴파일할 때는 너무 무거워서 다른 방법을 생각해야 할 것 같다).이 점을 더 깊이 있게 알고 싶다면docker-machine 부근의 구조를 조사해 보면 이해가 깊어질 수 있지만 docker-machine에 대한 기사도 쓸 수 있을 것 같으니 기대해 주십시오.

    최후


    나는 네가 Docker가 어떻게 구성되고 어떻게 작동하는지 이해했다고 생각한다.구조를 알면 의외로 간단해지고, 다음에 문제가 발생하면 대부분의 문제를 알게 돼 금방 해결될 것이다.공식 촬영 환경에서 이상이 발생했다고 해도 "아, 구조는 이렇고 실제 본촬영에는 영향이 없다"는 설명으로 구조를 모르는 다른 개발자와 격차를 벌릴 수 있다.Docker뿐만 아니라 하나의 기술만 사용하는 것이 아니라 구조를 이해하는 것도 중요하다.

    참고 문헌

  • Docker-docs-ja, Docker 개요
  • GitHub、docker/docker.github.io
  • Docker Engine API (v1.40)
  • 좋은 웹페이지 즐겨찾기