Process의 scope: 현대적인 OS는 프로세스가 독립적인 공간을 가지게 해준다.
Isolation의 활용
unshare
, lsns
, nsenter
① WSL autoMemoryReclaim 활성화(Optional)
# Makes the WSL VM shrink in memory as you use it by reclaiming cached memory
[experimental]
autoMemoryReclaim=gradual
$ ls /sys/fs/cgroup/
② Docker Desktop for Windows 설치
④ 사용하려는 WSL 배포판(Ubuntu 등)에서 정상적으로 설치되었는지 확인
$ docker --version
⑤ 간단한 Docker 이미지를 실행
$ docker run hello-world
$ docker run -it ubuntu bash
-i
: interactive mode (open stdin)-t
: terminal (Allocate a pseudo-TTY, stdio)ps
$ sudo usermod -aG docker $(whoami)
$ id
$ id $(whoami)
docker
를 사용하기 위해서 docker group을 supplementary group에 포함시켜야 한다.$ docker ps
$ docker ps -a
ps
는 기본적으로 작동 중인 docker process를 출력한다.run
$ docker run --name hello-world_01 hello-world
$ for ii in {1..10}; do docker run --name hello-world_${ii} hello-world; done
--name
으로 이름을 지정하며 실행한다.filter
$ docker ps -a -f 'name=hello'
$ docker ps -af 'name=hello-world_{1-3}'
format
$ docker ps -af 'name=hel' --format "{{.ID}} {{.Image}} {{.Status}} {{.Names}}"
docker ps
명령을 alias(~/.bash_aliases)에 등록하고 사용하면 편하다.rm
$ docker rm [CONTAINER ID | NAMES]
$ docker ps -af 'name=hello' --format "{{.Names}}" | xargs docker rm
$ docker ps -a --format "{{.ID}}" | xargs docker rm # 존재하는 모든 container를 삭제
rm
은 container를 삭제하지만 image를 삭제하지는 않는다.image
rmi
$ docker ps -af 'ancestor=hello-world' --format {{.Names}} | xargs docker rm
$ docker rmi hello-world
image
$ docker image
ls
: iamge list$ docker image ls
inspect
: return low-level information on Docker objects$ docker image inspect nginx
$ docker inspect nginx
pull
: run은 하지 않고, image를 pull(가져오기)만 함$ docker image pull nginx
$ docker pull nginx
rm
save
: save one or more images to a tar archive$ docker image save nginx > docker_nginx_1.19.10.tar
$ docker save nginx > docker_nginx_1.19.10.tar
$ file docker_nginx_1.19.10.tar
inspect
로 미리 확인 가능load
: load an image form a tar archive or STDIN$ docker image load < docker_nginx_1.19.10.tar
$ docker load < docker_nginx_1.19.10.tar
run
$ docker run -it --name ubuntu_top ubuntu "top" "-d 1"
run
은 container를 새롭게 실행하는 명령exec
$ docker exec -it ubuntu_top top "-d 0.2"
binding
# 호스트의 /host/path 디렉터리를 컨테이너의 /container/path 디렉터리에 바인딩
$ docker run -v /host/path:/container/path -d image_name
attach
, detach
$ docker run --rm -itd --name ubuntu_bash ubuntu bash # 바로 detach가 됨
$ docker attach ubuntu_bash # 쉘에 들어가기 위해 attach
--rm
: 컨테이너 종료 시 컨테이너를 삭제stop
, start
$ docker run -d -p 8080:80/tcp \
--mount type=bind, src=/home/jiwon/nginx_doc_root, dst=/usr/share/nginx/html \
--name nginx_8080 nginx
$ docker ps
$ docker stop nginx_8080 && docker ps -a
$ docker start nginx_8080 && docker ps
$ docker rm nginx_8080
stop
-it
를 사용하지 않는 시스템은 signal
혹은 이 명령어로 정지할 수 밖에 없다.start
docker run --rm
을 쓰지 않는 경우 exited할 시 container는 남는다.stop
후 재시작할 때는 start
로 가능docker run
의 선택적 옵션
기능 | 명령어 |
---|---|
detach mode | -d |
stdio의 사용 | -it |
종료 시 제거 | --rm |
binding (port) | -p host_port:container_port |
binding (file) | --mount ... or -v ... |
binding (env.) | -e KEY=value or --env-file ... |
$ docker-compose [-f<arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]
-f <config file>
docker-compose.yml
$ mkdir ~/docker-compose
$ cd ~/docker-compose
$ vi docker-compose.yml # 아래 내용 입력 후 저장
version: '3'
services:
nginx_8080:
image: nginx
restart: always
hostname: nginx1
container_name: cmp_nignx1_1
networks:
mynet:
ipv4_address: 172.20.0.10
ports:
- 8080:80
volumes:
- /home/jiwon/nginx_doc_root:/usr/share/nginx/html
networks:
mynet:
ipam:
driver: default
config:
- subnet: 172.20.0.0/24
docker-compose up
$ docker-compose up -d
docker-compose
: 여러 컨테이너를 정의하고 구성하는 도구인 Docker Compose를 실행up
: 정의된 서비스 및 컨테이너를 시작하고 구축-d
: 컨테이너를 백그라운드(daemon 모드)에서 실행한다. 터미널이 해당 프로세스를 차지하지 않고 사용 가능한 상태로 남아 있다.$ docker-compose ps
$ curl http://127.0.0.1:8080 # curl http://127.0.0.1:8080/hello.txt
$ docker-compose stop
$ docker-compose rm