Linux에서 Docker를 사용하면 Docker 옆에 생성된 파일이 루트에 문제가 될 수 있습니다

8503 단어 DockerLinuxtech
그냥 영어로 쓴 거 읽고 한 거예요.

정황


  • 만약 인산 효소가 Linux에서 Docker를 사용한다면 루트에서 실행해야 한다
    →일일sudo docker-compose 및 루트 실행 필요
    →이 점에 관해서는zsh에alias를 붙이면 해결할 수 있기 때문에 힘들지 않다

  • 컨테이너 내에서 자동으로 생성되는 경우(예: Laavel 등을 통해 파일을 생성하는 경우)
    → 생성된 파일이 루트가 됨: 루트
    →Read only가 되면 로컬에서 접촉할 수 없어 일일이 sudo chown

  • 원래 루트에서 Docker=docker한테 이상하게 훈련받으면 끝이에요.
    →안전 면에서도 좋지 않다
  • 나는 이런 문제들을 해결하고 싶다

    Rootless 모드


    이 문제는 userns-remap의 해결 방법이 있다
    Docker v19.03부터 루트리스 모드를 준비한 것 같은데 이걸로 해보고 싶어요.userns-remap 수호 프로세스 자체가 루트에서 이동하는 것과 비교하면
    Rootless 모드에서는 모든 작업에 루트 권한이 없습니다.
    (일부 기능은 아직 시작되지 않았습니다.)

    컨디션

  • ArchLinux
  • yay (AUR)
  • 설치하다.


    https://docs.docker.com/engine/security/rootless/
    대체로 Docker의 공식 홈페이지에 탑승한 것 같지만, Arch Linux의 사용자 창고(AUR)에 방법이 기재되어 있기 때문이다.
    AUR로 즐기고 싶어요.
    20/12/09 정도면 AUR 페이지에서 아래 정보를 사용하면서 사용할 수 있는지 확인하세요.
    https://aur.archlinux.org/packages/docker-rootless/
    21/01/03 위가 안 보여요.이하로 들어갈 수 있습니다.아무래도 요즘 이 일대는 엉망진창이니 역시 정부측에 보는 것이 좋을 것 같다
    https://aur.archlinux.org/packages/docker-rootless-extras-bin/

    AUR에서 docker-rootless 설치


    추기
    공식을 확인한 후 아래 장치를 설치하는 것을 추천합니다.
    $ sudo pacman -S fuse-overlayfs
    
    상기 AUR에 따라 먼저 AUR에 docker-rootless를 넣는다
    $ yay -S docker-rootless
    
    이 끝나면 표시됩니다.이건 아까 AUR의 댓글에서 말했듯이 이걸로 하겠습니다.
    === Post installation message from docker-rootless ===
    This is based on https://docs.docker.com/engine/security/rootless/
    To Run the Docker daemon as a non-root user (Rootless mode) for ArchLinux, you need t
    o do the following things:
    
    1. configure kernel settings
    
    create '/etc/sysctl.d/99-docker-rootless.conf': 'kernel.unprivileged_userns_clone=1'
    
    and then run: 'sudo sysctl --system'
    
    > see https://docs.docker.com/engine/security/rootless/#distribution-specific-hint for detailed information
    
    2. configure subuid and subgid
    
    and create '/etc/subuid' and '/etc/subgid' with: 'testuser:231072:65536' (for example
    , 'testuser' is username)
    
    > see https://docs.docker.com/engine/security/userns-remap/#prerequisites for detailed information
    
    3. start and enable user service: 'systemctl --user status|start|stop docker'
    
    4. finally set docker socket environment variable: 'export DOCKER_HOST=unix://$XDG_RU
    NTIME_DIR/docker.sock', you can also add it to '~/.bashrc' or somewhere alike
    =========
    

    커널 설정


    하다
    /etc/sysctl.d/99-docker-rootless.conf
    kernel.unprivileged_userns_clone=1
    

    subuid,subgid 설정


    각각 아래 내용에 따라 생성
    사용자 이름 에 사용자 이름 을 입력합니다.
    ※ 주의:subgid는 그룹의 id인 줄 알았는데 이것도 사용자의 id로 하면 됩니다.
    이것은 진흙탕에 빠져 시간을 낭비하는 것이다.짐승.
    /etc/subuid 및/etc/subgid
    ユーザ名:231072:65536
    
    ※ 231072와 관련해서는 절대 덮어쓰지 않는 시작 id만 지정하면 되므로 114514 또는
    subuid,subgid 모두 10000-65536개를 확보했는데 괜찮은 것 같아요.

    사용자의 Docker 시작, 자동 시작 유효


    # まず状態の確認
    $ systemctl --user status docker
    # State が running でなければ start
    $ systemctl --user start docker
    # 自動起動を有効に
    $ systemctl --user enable docker
    
    enable를 진행할 때 설정이 끝난 후에 docker가 시작되었는지 확인하는 것이 좋습니다
    마지막으로 status가 작동되는지 확인하는 게 좋을 것 같아요.
    시스템을 시작할 때 루트 측과 --user 측에서 각각 start enable
    root의 docker가 시작되지 않았습니다.user의 docker만 시작되면failed입니다
    그리고 시작하지 않는 이유로 사용자가 docker 그룹에서 뛰어나다
    원래는 그거 하기 싫어서 루트러스 docker였을 텐데 이렇게 되면 좀 그런거 같아
    https://stackoverflow.com/questions/60490529/docker-rootless-on-ubuntu-overlay2-failed-driver-not-supported
    어쨌든 이거 했어도 failed.
    추기: 20/12/09
    start rootless 모드의 docker만 있으면 됩니다.왜요?

    Docker Host


    PATH를 통과하는 데 사용된 셸 사용
    나는zsh 그래서.zshrc
    export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
    

    재부팅


    이후에 사용자 권한docker info을 사용할 수 있습니까?
    가능하다면 축하드립니다:tada:

    주의


    rootless의 Docker, sudo가 시작하는 것과 다른 용기 등
    즉, 같은 프로젝트라도 docker-compose up-d면 새build가 도망갈 수 있다는 거예요.
    신칸센에서 연결될 때 나는 일부러 컨테이너 빌딩을 뛰어다니다가 황급히 껐다
    그날은 통신 제한이 있어서 그 달은 매우 배고프니 주의해야 한다!

    추기


    docker의 파일 저장처를 되돌려주면 루트 옆에 있는 docker와 관계를 설정하는 파일이 일치하지 않습니까?생각
    build 컨테이너에 있을 때 이런 느낌이 들어요.
    Status: Downloaded newer image for php:8-fpm
     ---> edc6bf79d9ba
    Step 2/2 : RUN apt update && docker-php-ext-install pdo pdo_mysql
     ---> Running in 5616e0ab9a5a
    ERROR: Service 'php' failed to build : /run/containerd/s/60ceecf888f9382eafe6d7308496a508a83e2bd819ef77fb285590aaf9a7985b: mkdir /run/containerd/s: permission denied: unknown
    
    이것은 루트와 루트리스의 docker로 나뉘어진 환경이 아닌가?이런 느낌이 들어서.
    rootless의 docker가 다른 곳을 지정해 보십시오
    각자의 status를 확인해 보도록 하겠습니다.
    rootless
    $ systemctl --user status docker
    ● docker.service - Docker Application Container Engine
         Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: >
         Active: inactive (dead)
    TriggeredBy: ● docker.socket
    
    root
    이 두 개의 도커.서비스에 시작할 때의 설정 등을 주입합니다
    rootless docker의 docker입니다.service
    이 녀석의 ExecStart를 변경할 거야.
    $ sudo systemctl status docker
    ● docker.service - Docker Application Container Engine (Rootless)
         Loaded: loaded (/usr/lib/systemd/user/docker.service; disabled; vendor preset:
         Active: inactive (dead)
           Docs: https://docs.docker.com
    
    이번에는 사용자를 위한 docker 디렉터리입니다.docker를 써봤어요.
    [Unit]
    Description=Docker Application Container Engine (Rootless)
    Documentation=https://docs.docker.com
    
    [Service]
    Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    Environment=DOCKERD_FLAGS="--experimental"
    ExecStart=/usr/bin/dockerd-rootless.sh $DOCKERD_FLAGS
    ExecReload=/bin/kill -s HUP $MAINPID
    TimeoutSec=0
    RestartSec=2
    Restart=always
    StartLimitBurst=3
    StartLimitInterval=60s
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TasksMax=infinity
    Delegate=yes
    Type=simple
    
    [Install]
    WantedBy=default.target
    
    참조: https://xvideos.hatenablog.com/entry/move_docker_location

    bind는 1024 이하의 특권 포트를 사용할 수 없습니다


    재추기
    보통 하면 nginx를 만들 때 1024 이하의 포트를 사용할 수 없다는 욕을 먹어요.
    ExecStart=/usr/bin/dockerd-rootless.sh $DOCKERD_FLAGS --data-root /home/<USERの名前>/.docker
    
    욕을 먹겠지만 쓰고 싶을 때가 있어서 허락
    루트 이외의 사용자가 Docker 데몬 실행(Rootless 모드) - docker-docs-ja
    https://docs.docker.jp/engine/security/rootless.html#rootless-exposing-privileged-ports
    오류문이 추천한 대로 루트 lesskit 2진법 (setcap) 에 일부 권한을 넘깁니다.
    위의 URL에 따라 작업하는데 Arch의 rootlesskit이 있는 곳과 docker 베이스캠프는 좀 다르다고요?그래서
    ERROR: for hoge_nginx  Cannot start service hoge_nginx: driver failed programming external connectivity on endpoint hoge_nginx (<HASH_IS_HERE_114514>): Error starting userland proxy: error while calling PortManager.AddPort(): cannot expose privileged port 443, you might need to add "net.ipv4.ip_unprivileged_port_start=0" (currently 1024) to /etc/sysctl.conf, or set CAP_NET_BIND_SERVICE on rootlesskit binary, or choose a larger port number (>= 1024): listen tcp 0.0.0.0:443: bind: permission denied
    ERROR: Encountered errors while bringing up the project.
    
    로 교체해 보세요./etc/sysctl.d/에 추가된 부분도 어떤 설정/etc/sysctl.d/99-docker-rootless.conf을 배웠습니다.

    좋은 웹페이지 즐겨찾기