[Docker] manual - MACH-CAU/UAM GitHub Wiki
Docker
Docker란 가상환경 container를 만들고 실행할 수 있는 툴이다.
Introduction
This guide will help you create and manage Docker containers. Docker is a platform that allows you to automate the deployment of applications inside lightweight, portable containers.
Download Docker
Docker Download Docs
위의 main docs의 instruction을 따라가며 설치한다.
이때 Docker apt repository도 설치해줘야 한다.
- trouble shooting
ls /lib/systemd/system/docker.service
만약 위의 docker.service가 없다면 제대로 설치되지않은 것이다.
이런 경우 재설치를 해야한다.
sudo apt remove docker docker-engine docker.io containerd runc
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
이후 docker를 실행하기 위해선 docker daemon이 background로 실행되고있어야한다.
sudo systemctl start docker
sudo systemctl enable docker # 부팅 시 자동으로 켜지게 하는 옵션
sudo systemctl status docker # 현재 docker 상태 확인
Docker는 기본적으로 모든 명령어는 sudo
를 붙여줘야한다. 이를 생략하기 위해서
sudo usermod -a -G docker $USER
newgrp docker # update changes
위의 명령어를 입력하면 된다.
docker login
을 입력하면 docker ID를 통해 로그인할 수 있다. 그러나 login이 failed가 뜨며 실패하는 경우가 있다.
docker logout
rm ~/.docker/config.json
docker login
해당 절차로 config 파일없이 로그인하면 로그인이 잘된다.
Guide
Docker는 쉽게 냉동 밀키트에 비유할 수 있다. 해당 코딩 애플 유튜브참조
따라서 아래와 같이 설명할 수 있다.
비유 | 메뉴 만들기 | -> | 밀키트로 포장 | -> | 해동시켜서 활용 | -> | 다먹고 남은 부스러기 |
---|---|---|---|---|---|---|---|
실제 | Dockerfile | -> | image file | -> | container | -> | exit후에 남은 log |
위의 비유처럼 우리가 만들고 싶은 OS와 SDK등등을 모두 setup하는 메뉴(Dockerfile)로 만들고,
이를 docker에서 바로 build할 수 있는 밀키트(image file)로 만들어준다.
그 후 쓰고자하는 컴퓨터에서 image file을 run시켜 하나의 음식(container)로 실행시켜 활용한다.
Container에서 작업하고 난후 exit하여도 docker ps -a
를 통해 이전의 부스러기container log를 볼 수 있다.
이 부스러기를 다시 살려 실행할 수 도 있고 새로운 image file로 만들 수 있다.
Command
Docker 명령어는 command 시작에 docker
를 써주고 뒤에 추가 argument를 넣어서 실행한다.
- build
Image file을 만드는 명령어이다. Image file을 만드는 방법은 총 두가지로
- Docker hub에서 image file을 받는 명령어를 복붙하여 실행
- Dockerfile을 만들어 해당 Dockerfile을 image로 만들기
보통 Dockerfile로 우리가 원하는 setup을 만든 후 배포하여 client가 build 딸깍만으로 Image file을 만들도록 한다.
docker build --tag $REPOSITORY_NAME:$TAG_NAME -f $DOCKERFILE_PATH .
# $는 환경변수가 아닌 입력해야되는 거
image 파일은 ubuntu:22.04
와 같이 앞에 REPOSITORY_NAME:
뒤에 tag 이름이 붙는다.
$REPOSITORY_NAME:$TAG_NAME # ex) Ubuntu:22.04
따라서 위 전체가 Image name이다.
repository ID가 메인 이름이고 tag는 version 이름이라고 생각하면 된다.
따라서 같은 image file에서 각각 다른 추가적인 작업을 해서 다시 image file로 만들 떄 tag를 다르게 설정해주면 된다.
뒤에 붙는 Dockerfile 경로 설정은 만약 현재 directory에 Dockerfile이 존재한다면 -f $DOCKERFILE_PATH
를 생략하고 .
(현재 경로)만 쓰면 된다.
- pull, push, commit
Github처럼 pull, push과 commit을 통해 imaage file을 수정하거나 가져오거나 만드는 것이 가능하다.
docker pull $IMAGE_NAME
docker push $IMAGE_NAME
docker commit $OPTION $CONTAINER_NAME $NEW_IMAGE_NAME
- ps
docker ps # 현재 실행중인 container
docker ps -a # 부스러기까지 표시
docker ps -aq # container ID만 표시
기존 bash command인 ps
와 유사하다.
- images
docker images
입력 시 현재 저장된 image files를 볼 수 있다.
- run
Docker image 파일을 사용해 container를 만들어 사용하는 명령어이다.
docker run -it --name $CUSTOM_NAME $IMAGE_NAME
docker run --name $IMAGE_NAME -it $CUSTOM_NAME
IMAGE_NAME의 image 파일을 container이름으로써 CUSTOM_NAME을 붙여서 container로 만든다.
-i
: interactive (입력 받기 가능)
-t
: pseudo-TTY (터미널 제공)
docker run -it --name $CUSTOM_NAME $IMAGE_NAME echo "hello world"
위와 같이 맨뒤에 arg를 추가하면 해당 명령어가 container 생성과 동시에 실행된다.
docker run -d --name $CUSTOM_NAME $IMAGE_NAME
run 바로 뒤에 -d
를 넣어주면 container를 detached mode(백그라운드)로 실행시켜 놓는다.
container생성 시 bash만 돌리는 경우엔 백그라운드로 돌릴 수 없어 그냥 죽는다.
run
을 실행하면 기본적으로 bash 창이 뜰 텐데 이건 container에서/bin/bash
를 실행한 process이다.
동일 container에서 다른 bash(process)를 또 실행할 수도 있다.
docker에선 attached와 detached 개념이 있다.
-it
: attached mode
-d
: detached mode
- attached는 bash를 실행하여 container에 접속했을 때 STDIN, STDOUT, STDERR에 연결하는것 이다. 터미널 종료 시 container도 죽는다.
- detached는 container를 백그라운드로 process를 실행하고 터미널이 종료되어도 죽지 않게한다.
따라서stop
명령어로 죽여야 한다. 보통 서버용에서 많이 사용한다.
- volume
Container 부스러기까지 없애면 내부의 데이터도 없어진다. 만약 data를 따로 저장하고 싶다면 Volume을 사용하면 된다.
Volume은 host의 저장공간을 container도 사용할 수 있는 기능이다. 다른 container와 공유도 가능하다.
- Volume : Docker에서 관리하는 저장소, host에 저장된다, 속도가 제일 빠르다
- Bind Mount : host의 특정 dir를 연결
- tmpfs Mount : container 죽을 때 사라지는 저장공간
docker volume create $VOLUME_NAME
docker volume ls # volume list
docker volume inspect $VOLUME_NAME # volume 정보 확인
docker volume rm $VOLUME_NAME # volume 삭제
docker volume prune # 모든 미사용 volume 삭제
위처럼 docker에서 제공하는 volume를 관리할 수 있다.
docker run -it --name $CUSTOM_NAME -v $VOLUME_PATH:$DIR_OF_CONTAINER $IMAGE_NAME
위처럼 volume과 container의 directory 하나와 연결할 수 있다.
다른 container도 만들 때 위와 같이 하면 서로 volume을 공유한다.
$VOLUME_PATH
에 host의 dir을 넣으면 해당 dir을 공유한다.
- start, exec, attach
start
는 죽은 container(부스러기)를 다시 살리는 명령어이다.exec
는 detached container에 돌고 있는 process를 건들지 않고 다른 process를 실행시켜 실행하는 명령어이다.attach
는 exec와 달리 직접적으로 container의 main process에 접속하는 것이다.
docker start $CONTAINER_NAME
docker exec $CONTAINER_NAME $COMMAND
docker attach $CONTAINER_NAME
container name 말고 ID로 써도 된다. exec -it
하면 터미널이 새로 열린다.
exec, attach
둘다 살아있는 container에만 사용이 가능하다.
- stop, rm
Image, container 들을 정지, 지우는 명령어들이다.
명령어 | 설명 |
---|---|
docker stop $CONTAINER_NAME |
실행 중인 컨테이너 중지 |
docker rm $CONTAINER_NAME |
컨테이너 삭제 |
docker rmi $IMAGE_NAME |
이미지 삭제 |
docker rmi -f $IMAGE_NAME |
강제 이미지 삭제 |
docker system prune -a |
사용하지 않는 모든 리소스 삭제 |
docker system prune -a --volumes |
사용하지 않는 모든 리소스 + 볼륨 삭제 |
모든 container나 image를 지우고 싶다면
$(docker ps -aq) # 모든 container ID
$(docker images -q) # 모든 image ID
이걸 집어넣으면 된다.
Dockerfile
작업중
Makefile
작업중