docker

Published by onesixx on

https://blog.roboflow.com/nvidia-docker-vscode-pytorch/

$ docker images
REPOSITORY                      TAG                              IMAGE ID       CREATED        SIZE
nvcr.io/nvidia/pytorch          24.08-py3                        c4c51e501ca9   3 weeks ago    20.4GB

$ mkdir -p /raid/templates/sixxdisk/

$ cd ~
$ ln -s /raid/templates/sixxdisk/

$ docker run -it -d --name sixxos -v ~/sixxdisk:/workspace nvcr.io/nvidia/pytorch:24.08-py3 /bin/bash
2e3..................

$ docker run --gpus all  --name sixxos -v ~/sixxdisk:/workspace -it -d --rm nvcr.io/nvidia/pytorch:24.08-py3 /bin/bash
# rm은 docker stop하면 알아서 rm됨.

$ docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --name sixxos -v ~/sixxdisk:/workspace -it -d nvcr.io/nvidia/pytorch:24.08-py3


$ docker exec -it sixxos /bin/bash
$ docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --name sixxos -v ~/sixxdisk:/workspace -it -d nvcr.io/nvidia/pytorch:24.08-py3


docker run: Docker 컨테이너를 실행하는 기본 명령어
--gpus all: 컨테이너가 호스트 시스템의 모든 GPU를 사용할  있도록 설정합니다. 
--ipc=host: 컨테이너가 호스트의 IPC 네임스페이스를 사용하도록 설정. 
            이는 프로세스  통신을 위해 메모리를 공유할  유용
--ulimit memlock=-1: 컨테이너 내에서 메모리 잠금 제한을 해제. 
                     이는 애플리케이션이 메모리를 잠글  있도록 허용합니다.
--ulimit stack=67108864:  컨테이너 내에서 스택 크기 제한을 설정합니다. 
                          여기서는 스택 크기를 64MB로 설정합니다.
--name sixxos: 컨테이너의 이름을 sixxos로 설정 
-v ~/sixxdisk:/workspace: 호스트 시스템의 ~/sixxdisk 디렉토리를 컨테이너 내의 /workspace 디렉토리에 마운트합니다. 이는 호스트와 컨테이너 간에 파일을 공유할  있도록 합니다.
-it: -i와 -t 옵션을 결합한 것으로, 컨테이너의 표준 입력을 열어두고 TTY를 활성화합니다. 
      이는 터미널에서 상호작용할  있도록 합니다.
-d:   컨테이너를 백그라운드에서 실행합니다. 
      이는 컨테이너가 터미널을 점유하지 않고 백그라운드에서 실행되도록 합니다.
nvcr.io/nvidia/pytorch:24.08-py3:  사용할 Docker 이미지를 지정

Process

Linux의 기본기능을 활용하여 “Process”(Directory/ File)를 가상으로 분리 ,
자원을(CPU,MEMORY,I/O) 분배하여 서버관리

Container

What even is a container” by Julia Evans.
개발자가-처음-docker-접할때-오는-멘붕-몇가지

Container는 (Virtual machine과 같이 하나의 온전한 서버를 제공하는 것이 아니라)
명령을 실행하는 환경만 제공하고 그 명령을 실행하여 결과를 보여 줄 뿐이다.

또 하나의 독립된 Process

  • Namespaces
  • Chroot (Changing the room – root directory)
  • Cgroups (Control groups)
$ docker images 
ubuntu                          latest                           edbfe74c41f8   5 weeks ago    78.1MB

$ docker run --name u_test ubuntu
# 이미지만 다운받고, 잠시 process가 실행되었다가 죽는다. (아예 안보임)

$ docker ps 
# 안보임 . 죽어서..

$ docker ps -a | grep u_test
#CONTAINER ID  IMAGE   COMMAND  CREATED         STATUS                     PORTS  NAMES
#59efb951e058  ubuntu  "bash"   37 seconds ago  Exited (0) 36 seconds ago         u_test

$ docker rm ubuntu_test
$ docker run --name ubuntu_test ubuntu "ls"                                                                              
#bin
#boot
#dev
...
# 이미지만 다운받고, 잠시 process가 실행되어 ls만 날리고 죽는다.
$ docker rm u_test
### -it interactive tty
$ docker run --name u_test -it ubuntu
# 여기서 ubuntu 서버가 실행되었다는 착각할수 있지만, shell에서 exit로 나오는 순간 컨테이너는 중지된다.

### -d detached mode
$ docker run --name u_test -d  ubuntu
# background로 떠있을것 같지만, 바로 Exit 중지된다.
# "컨테이너 실행"은 HostOS에서 프로세스를 실행하는 것과 같은 개념이기 때문에 
# 컨테이너에서 실행되는 명령이 계속 실행될 상황이 아니면, 그 명령이 종료되고, 동시에 컨테이너도 종료된다.


$ docker run --name u_test -d -it ubuntu

# 실행 중인 Docker 컨테이너의 기본 프로세스에 터미널을 연결
$ docker attach u_test
# shell을 백그라운드로 실행하는데는 성공했지만, shell에서 exit로 나오는 순간 컨테이너는 중지된다.


$ docker run --name ubuntu_test -d -it --rm ubuntu /bin/bash -c \\
 'while true; do echo "still live"; sleep 6; done'
 
$ docker attach ubuntu_test                                                                                                  
#still live
#still live
# ...

$ docker run --name ubuntu_test -d -it --rm ubuntu

$ docker exec -it 8e0 /bin/bash
# 도커 컨테이너에서 실행되는 애플리케이션 서버은 (background모드가 아닌) foreground모드로 실행해야 한다.
# foreground로 실행되어 있기 때문에, 해당서버가 재시작되면 해당 컨테이너가 종료된다.
# docker Attach는 컨테이너의 기본 프로세스에 연결하는 반면 docker exec는 기본 프로세스에 영향을 주지 않고 컨테이너 내부에 새 프로세스(예: 새 셸)를 생성

컨테이너 상태

docker run 명령어는 실제로 다음의 세 명령어를 한 번에 실행하는 것과 같다.

  • docker pull : 이미지를 다운로드한다. docker run 명령어는 이미지가 로컬에 없으면 이미지를 다운로드한다.
  • docker create : 이미지로부터 컨테이너를 생성한다.
  • docker start : 컨테이너를 시작한다.

docker run 명령 (= “create” + “start” 명령을 한번에 실행)

https://javacan.tistory.com/entry/docker-start-2-running-container

컨테이너와 이미지의 차이

이미지는 추상적인 개념이고, 실행은 이미지를 기반으로 생성된 컨테이너에서 
도커 이미지를 pull로 받아오고 commit 으로 파생된 이미지를 만들고, 삭제는  rmi 명령어로

명령

명령은 (서버에서 실행하는 것이 아닌) Client에서 실행

docker run 명령의 옵션

-it interactive terminal

-d 백라운드로 프로세스를 운영할때 detached 모드라 한다.

-e 환경변수

-p Host와 Container의 포트 연결

-v Host와 Container의 폴더 연결

–rm

–name

이미지 존재여부확인 후, 프로세스 실행, 명령어전달

docker exec 명령

컨데이너에 ssh서버에 접속하는 것처럼 직접접속

docker Images

docker network

docker network create mynet

docker network connect mynet mysql

docker rm

$ docker volume ls | awk '{print $2}' |xargs docker volume rm

docker compose

명령 및 옵션을 docker-compose.yml에 dictionary형태로

ENTRYPOINT vs. CMD

컨테이너 시작시 실행 명령에 대한 Default 지정 여부

Image 만들기

  • docker commit
  • docker build -t onesixx/ubuntu:myfile .

만들어놓은 Dokerfile를 참조하여 –tag list 의 이름으로 이미지를 생성

Image

<Namespace>/<Image_name>:<Tag>
여러 Layer로 구성됨 (Union Mount 계층화된 파일시스템)

Tip

sudo 없이 사용하기

$ sudo usermod -aG docker onesixx    # onesixx (대신 $USER를 사용하면 접속한) 사용자에게 권한부여

서비스 확인

> sudo service --status-all
 [ - ]  cron
 [ - ]  dbus
 [ ? ]  hwclock.sh
 [ - ]  procps
 [ ? ]  rstudio-server
 [ ? ]  shiny-server
 [ + ]  ssh
 [ - ]  supervisor
 [ + ]  udev
 [ - ]  unattended-upgrades
 [ - ]  x11-common

> sudo service rstudio-server restart

기본예제 (using git)

Clone using git

원하는 image를 clone(download)한다. 또는 dockerfile 사용

~|➜$ git clone https://github.com/docker/doodle.git
Cloning into 'doodle'...
remote: Enumerating objects: 73, done.
remote: Total 73 (delta 0), reused 0 (delta 0), pack-reused 73
Receiving objects: 100% (73/73), 21.61 KiB | 1.54 MiB/s, done.
Resolving deltas: 100% (28/28), done.

Build an image

해당 image(private file system)를 기반으로 Container를 build한다.
(-t 는 –tag )

~|➜$ cd doodle/cheers2019 && docker build -t onesixx/cheers2019 .
Sending build context to Docker daemon   12.8kB
Step 1/9 : FROM golang:1.11-alpine AS builder
Step 2/9 : RUN apk add --no-cache git
Step 3/9 : RUN go get github.com/pdevine/go-asciisprite
Step 4/9 : WORKDIR /project
Step 5/9 : COPY cheers.go .
Step 6/9 : RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o cheers cheers.go
Step 7/9 : FROM scratch
Step 8/9 : COPY --from=builder /project/cheers /cheers
Step 9/9 : ENTRYPOINT ["/cheers"]
Successfully built 42ac2c9c8f7b
Successfully tagged onesixx/cheers2019:latest

Run

Container를 Run한다. 즉 application을 launch한다.
옵션: -i (interactive) -t (tty)
커맨드: –rm (remove containers)

~/doodle/cheers2019|➜$ docker run -it --rm onesixx/cheers2019

Share Repository

docker tag cheers2019 onesixx/cheers2019 (생략)로 기존 image를 참조한 새로운 image를 만든다.
Docker hub에 push하여 share한다.

~/doodle/cheers2019|➜$ docker login && docker push onesixx/cheers2019

Authenticating with existing credentials...
Login Succeeded
The push refers to repository [docker.io/onesixx/cheers2019]
c53df6ff62fc: Pushed
latest: digest: sha256:bb6f53d68650d1b443bf9364a07291ac5686ac72970af69f32ff8e226b760d1e size: 528

기본예제 (using dockerfile)

dockerfile

원하는 image를 clone(download)한다. 또는 dockerfile 사용

FROM trestletech/plumber
MAINTAINER Docker User [email protected]

RUN echo "alias ll='ls -alF'" >> ~/.bashrc
RUN /bin/bash -c 'source $HOME/.bashrc;'

RUN echo "https_proxy=http://10.250.59.224:3128" >> /usr/lib/R/etc/Renviron.site
RUN echo "http_proxy=http://10.250.59.224:3128"  >> /usr/lib/R/etc/Renviron.site

RUN R -e "install.packages('pacman', lib=.Library)"

CMD ["/home/oschung_skcc/RCODE/plumb/model-api/plumber.R"]
$ docker images

Build an image (from a Dockerfile)

해당 image(private file system)를 기반으로 Container를 build한다.
(-t 는 –tag )

~|➜$ docker build -t onesixx/plumb1 .
Sending build context to Docker daemon   12.8kB
Step 1/9 : FROM golang:1.11-alpine AS builder
Step 2/9 : RUN apk add --no-cache git
Step 3/9 : RUN go get github.com/pdevine/go-asciisprite
Step 4/9 : WORKDIR /project
Step 5/9 : COPY cheers.go .
Step 6/9 : RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o cheers cheers.go
Step 7/9 : FROM scratch
Step 8/9 : COPY --from=builder /project/cheers /cheers
Step 9/9 : ENTRYPOINT ["/cheers"]
Successfully built 42ac2c9c8f7b
Successfully tagged onesixx/cheers2019:latest

Run

Container를 Run한다. 즉 application을 launch한다.
옵션: -i (interactive) -t (tty)
커맨드: –rm (remove containers)

➜$ docker run -it -d -p 8000:8000 -v vol-rstudio-home:/home onesixx/plumb1 \\
    /home/oschung_skcc/RCODE/plumb/model-api/plumber.R

docker exec -it 3da /bin/bash

Categories: Tool-SW

onesixx

Blog Owner

Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x