Docker in Docker(dind)를 통해 모든 항목을 Sandbox화하면 편리합니다.

9333 단어 Dockerdind

motivation


요즘은 거의 모든 프로젝트가 Docker나 Kubernetes 같은 컨테이너로 개발되고 있어요.
특히 프리랜서는 여러 가지 업무가 Docker 호스트의 컨테이너로 걸려 있다
큰 문제는 없었지만.
  • 프로젝트가 끝날 때 모든 용기를 삭제하기를 원합니다
  • 컨테이너, 이미지 이름은 덮어쓸 수 있음
  • 기타 항목의 이미지는
  • 고객 앞에서 또는 발송할 때 다른 사건의 용기 목록을 표시
  • 이 가능하다, ~할 수 있다,...
    우선, 조개 껍질 등을 총괄한 것은 다음과 같다.
    https://github.com/YukiMiyatake/util/tree/master/environment/docker_sandbox
    $ docker images
    
    REPOSITORY                TAG                   IMAGE ID            CREATED             SIZE
    docker                    dind                  3c34f16aeaa0        19 hours ago        505MB
    <none>                    <none>                31f248f7f9b6        19 hours ago        658MB
    kgb_secret_project        latest                bc7c96ecde80        3 days ago          814MB
    cia_secret_project        latest                4b7b8690eb05        6 days ago          2.89GB
    docker                    dind-alpine           a4b37e66ffc7        7 days ago          230MB
    rothschild_report         latest                10 days ago         3.09GB
    golang                    latest                54e71dcafb7c        2 weeks ago         803MB
    ubuntu                    16.04                 5f2bf26e3524        3 weeks ago         123MB
    ubuntu                    18.04                 775349758637        3 weeks ago         64.2MB
    buildpack-deps            stretch               81af74c34933        5 weeks ago         835MB
    golang                    1.12.7                be63d15101cb        4 months ago        814MB
    docker                    1.13.0-dind           7d6978320b24        2 years ago         99MB
    
    이런 정보가 노출되면 생명이 위험해!!
    물론 사건마다 컴퓨터를 교체하고 많이 시작하고 사용자를 전환하며 사건마다 VM을 만들고 Docker
    피하다
    예를 들어 Windows에서 Hyper-V를 사용할 경우 VM을 만들 수 없습니다.
    그러므로 현실의 회피 수단으로서
    딘드 생각났어.

    이른바


    Docker는 OS를 거의 조작할 수 있지만 일부 조작은 할 수 없습니다
    일반적으로 Docker는 컨테이너에서 Docker를 시작할 수 없습니다.
    $ docker run -it ubuntu:18.04 bash
    
    root@d3da654e2a5f:/# docker
    bash: docker: command not found
    
    컨테이너 내에서 Docker를 사용하는 방법은 두 가지가 있는데 그것이 바로 dind와 dood이다

    일반 Docker


    호스트 PC의 Docker에서 모든 이미지 시작하기
    모든 프로젝트의 컨테이너가 같은 Docker에 존재합니다 (형제자매)

    불편하죠?

    dind


    항목마다 dind Docker를 시작해야 합니다 (privileged 로고가 있어야 합니다!)
    각 항목의 Docker에 로그인하여 Docker 이미지를 만듭니다.
    Docker 이미지는 친자관계에서 나오는 거예요.
    $ docker run -it --privileged -v $('pwd'):/volume -w /volume  -d docker:dind
    
    root@e394f7876063:/volume# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    
    root@e394f7876063:/volume# docker run -it busybox
    Unable to find image 'busybox:latest' locally
    latest: Pulling from library/busybox
    0f8c40e1270f: Pull complete 
    Digest: sha256:1303dbf110c57f3edf68d9f5a16c082ec06c4cf7604831669faf2c712260b5a0
    Status: Downloaded newer image for busybox:latest
    / # exit
    
    root@e394f7876063:/volume# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    root@e394f7876063:/volume# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    busybox             latest              020584afccce        3 weeks ago         1.22MB
    
    다른 항목의 컨테이너가 보이지 않아 영향을 주지 않습니다
    모든 프로젝트의 Sandbox 환경에서 완전히 성공했습니다!

    dood


    Docker Out of Docker
    dind Docker를 시작합니다.
    provilegid 로고, docker를 세울 수 없습니다.Volume을 사용하여 soc 파일 마운트
    로그인 항목의 Docker 컨테이너, docker 명령을 사용하여 호스트 연결
    여기에 만들어진 용기는 본체에서 만들어집니다 = 형제 관계
    $ docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker:dind bash
    
    root@b49f798ae8ca:/# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    b49f798ae8ca        docker:dind         "bash"              6 seconds ago       Up 5 seconds                            crazy_goodall
    root@b49f798ae8ca:/# docker images
    REPOSITORY                TAG                   IMAGE ID            CREATED             SIZE
    docker                    dind                  3c34f16aeaa0        24 hours ago        505MB
    <none>                    <none>                31f248f7f9b6        24 hours ago        658MB
    ubuntu                    16.04                 5f2bf26e3524        3 weeks ago         123MB
    ubuntu                    18.04                 775349758637        3 weeks ago         64.2MB
    buildpack-deps            stretch               81af74c34933        5 weeks ago         835MB
    golang                    1.12.7                be63d15101cb        4 months ago        814MB
    docker                    1.13.0-dind           7d6978320b24        2 years ago         99MB
    
    (ホストのDockerイメージが見えている)
    
    root@b49f798ae8ca:/# docker pull busybox
    Using default tag: latest
    latest: Pulling from library/busybox
    0f8c40e1270f: Pull complete 
    Digest: sha256:1303dbf110c57f3edf68d9f5a16c082ec06c4cf7604831669faf2c712260b5a0
    Status: Downloaded newer image for busybox:latest
    docker.io/library/busybox:latest
    
    root@b49f798ae8ca:/# docker images
    REPOSITORY                TAG                   IMAGE ID            CREATED             SIZE
    docker                    dind                  3c34f16aeaa0        24 hours ago        505MB
    <none>                    <none>                31f248f7f9b6        24 hours ago        658MB
    ubuntu                    16.04                 5f2bf26e3524        3 weeks ago         123MB
    ubuntu                    18.04                 775349758637        3 weeks ago         64.2MB
    busybox                   latest                020584afccce        3 weeks ago         1.22MB
    buildpack-deps            stretch               81af74c34933        5 weeks ago         835MB
    golang                    1.12.7                be63d15101cb        4 months ago        814MB
    docker                    1.13.0-dind           7d6978320b24        2 years ago         99MB
    
    (ホストのDockerイメージに追加された)
    
    일반적인 Docker 시동과 달리 Docker 컨테이너에서 형제 관계를 제작하고 이용할 수 있는 컨테이너
    프로젝트마다 Docker 이미지가 분리되지 않기 때문에 이번 목적과 일치하지 않습니다
    Dood은 CI, 상황에 따라 용기를 파괴하는 서비스에 적합합니다(일반적으로 Dind를 사용하지 않아도 됩니다)

    자유자재로 운용하다.


    먼저 Docker in Docker 개발자에 따라
    딘드 쓸 때 진짜 딘드가 필요한가요? 다시 생각해볼게요.
    대부분의 일은 od로 할 수 있어요.
    dind는 Docker의 개발 용도입니다.
    그래서 아마 제가 사용하는 딘드는 개발자도 사용하지 말라고 했을 거예요.
    재미있어요. 한번 해볼게요.
    실제 사용 방법
    위에 스크립트 추가 등 더 좋은 환경 구축 중

    두 번째 이미지 만들기


    각 항목에 대한 dind Docker 이미지 만들기
    딘드의 공식 이미지는 알피니지만 개발용 호스트로 사용하기 힘들다
    ubuntu든 arch든 좋은 인상을 줘야 돼요.
    위에 있는 Docker file과 wrapdocker는 좋아하는 OS의 이미지를 만들 수 있습니다.

    용기의 제작


    환경 변수로 용기 이름을 지정하려면direnv를 사용하십시오
    docker run -it --privileged --name $PROJECT_GROUP -v $('pwd'):/volume -w /volume  -d docker:dind
    
    docer_run.sh에 용기의 제작 예가 적혀 있어요.
    디렉터리를 마운트하는 것은 일반적으로 매우 편리하다
    스크립트에 dind 이미지를 직접 사용했습니다. 프로젝트에 사용할 도구와 언어 등을 Dokerfile로 쓰면 편리합니다

    컨테이너의 실행

    docker start $PROJECT_GROUP
    docker exec -it $PROJECT_GROUP bash
    
    컨테이너에 들어가다
    평소대로 컨테이너를 만들어 개발하다

    기타


    프로젝트가 끝났을 때 부모님의 용기를 삭제하면 모두 깨끗해진다!
    하지만 dind는 자동으로 volume를 만들기 때문에 volume도 삭제하세요(volum과 용기를 모두 클린으로 만드는 스크립트를 만들고 싶어요)
    그리고 항상commiit가 용기를 인상적으로 구우면 안심이 돼요.

    장점


    모든 항목의 디렉터리와 용기는 분리되어 있기 때문에 만일 발생하는 상황을 걱정할 필요가 없다
    만일 다른 항목의 수정의 영향을 받지 않는다면
    폴더를 항목별로 Sandbox화할 수도 있기 때문에 이상한 일이 일어나기 어렵다
    화면 캡처를 표시할 때 다른 서비스의 용기 목록을 표시하지 않습니다
    여러 개의 마이크로 서비스 등 용기가 있는 서비스에서 모든 용기를 끄는 것은 매우 간단하다

    결점


    각 Sandbox는 OS 및 DB의 이미지를 Pull하므로 스토리지 용량 사용
    Privilege 플래그가 필요합니다.

    좋은 웹페이지 즐겨찾기