같이보기
규칙
commit
이나 기타 이미지 선택할 때 이미지의 tag를 지정할 수 있다
<이미지명>:<테그>
- 동명의 이미지를 생성 하고 태그를 다르게 해서 버전을 관리한다
원격저장소 이미지 이름 규칙
:- <hub아이디>/이미지명
태그 규칙
:- 아무것도 지정안하면
latest
- 태그는 hub에서는 커밋로그 임. 버전관리를 확실히 할려면 태그를 붙이는게 좋다
- 아무것도 지정안하면
명령 구문 여러게 주기
- bash -c “명령어1 && 명령어2”
기본 사용법
컨테이너 생성 & 실행
# 이미지를 Docker Hub 에서 내려 받기
docker pull <이미지>
# 이미지 목록 확인
docker images
# 해당 이미지 id 로 컨테이너를 실행하고 bash 를 활성화하여 접속
docker run -it <이미지id>
컨테이너 종료
-
컨테이너의 접속 중인 상태라면
exit
쳐서 나오기ctrl+d
로 나오기
-
컨테이너가 백그라운드 상태라면
# 컨테이너 목록 확인 docker ps -a docker stop <컨테이너id> # 강제종료 === docker kill <컨테이너id> ===
컨테이너 다시 실행
# 컨테이너 목록 확인
docker ps -a
# 컨테이너 재시작
docker restart <컨테이너 ID>
# 컨테이너 진입 (attach 사용)
docker attach <컨테이너 ID>
# 컨테이너 진입 (exec 사용)
docker exec -it <컨테이너 ID> /bin/bash
attach
: 이전과 동일한 쉘 세션에 진입- 만일 이전에 /home/test 에 접속되있던 상태였다면 똑같이 거기로 진입됨
exec
: 새로운 쉘 세션을 생성하여 진입- 그냥 putty를 하나 더 켜서 같은 사용자에 접근 했다 보면 됨
컨테이너 & 이미지 삭제
- 컨테이너가 종료되있다 가정
- 참고로 실행중인 컨테이너의 이미지를 삭제 하고 싶다고
-f
옵션을 붙어 강제 삭제 한다고 해도 걍 테크만 없어지는 거지 디스크에서 삭제되는건 아니기에 삭제할 이유가 없다
# 컨테이너 id 확인
docker ps -a
# 컨테이너 삭제
docker rm <컨테이너 id>
# 이미지 id 확인
docker images
# 이미지 삭제
docker rm <컨테이너 id>
컨테이너를 종료하지 않고 쉘 빠져 나오기
(Ctrl + P) + Q
단축키 입력
Docker Hub 에 로그인
- private 저장소 pull 받거나 push 할때 필요
docker login
Docker Hub에 이미지 push 하기
- 위에 로그인이 되어있어야
- 태그는 안 붙이면
latest
- 이미 원격저장소에 있는 상태이고 새로운 커밋을 작성할 시
- 저장소 이미지 이름이랑
commit
된 이미지 이름이 같아야함 - 단 태그는 달라도 무관
- 같은 태그면 해당 태그의 커밋이 바뀐다
- 저장소 이미지 이름이랑
# 원하는 컨테이너 커밋
docker commit <컨테이너id> <hub 아이디>/<저장할이미지 명>:<태그 | null>
# 만일 이미지 이름이 원격이랑 안맞는 경우
# 이미지 이름 바꾸기
===
docker tag <이미지id> <hub아이디>/<저장할이미지 명>:<태그 | null>
===
# Docker Hub에 push
docker push <컨테이너명>
이미지, 컨테이너 저장 & 불러오기
사실 이 방법 보다 Dockerfile 쓰는게 더 좋긴 하다
-
이미지 저장 & 불러오기
# 이미지 tar로 저장 docker save -o <파일명>.tar <이미지id> # 이미지 불러오기 docker load -i <파일명>.tar
-
컨테이너 저장 & 불러오기
(여기서 함정은 불러오기 하면 이미지로 불러와지는)# 컨테이너 tar로 저장 docker export -o <파일명>.tar <컨테이너id> # 저장한 컨테이너를 이미지로 불러오기 # cat 으로 tar 모두 읽어서 파이프 라인으로 하는 방법 cat <파일명>.tar | docker import - <이미지명>
백그라운드 실행
-
attach 를 쓰는 방법
# 표준 입/출력 콘솔 활성화 하고 백그라운드로 실행한다 docker run -it -d <이미지id> <명령> # 진행중인 쉘에 진입 docker attach <컨테이너id>
- 컨테이너가 실행중 일때만 사용가능하다
- 다만 이 방법은 기존에 진행중이던 로그는 체크하지 못한다
- 표준 입력이 필요한 상황에서는 해당 방법을 써야 함
-
logs를 쓰는 방법
# 표준 입/출력 콘솔 활성화 하고 백그라운드로 실행한다 docker run -it -d <이미지id> <명령> # 컨테이너 진행 로그를 실시간으로 출력 docker logs -f <컨테이너id>
- 컨테이너가 종료되었을 경우에도 사용가능하다
- 다만 표준 입력은 처리하지 못한다
- 대신 모든 진행 로그를 볼 수있다
-
포그라운드 실행 후 백그라운드로
# 포그라운드로 실행 docker run -it <이미지id> <명령> # 이후 종료하지 않고 쉘에 빠져 나오기 (Ctrl + P) + Q 단축키 입력
- 이렇게 실행해놓고 위 2가지 방법 중 하나로 로그를 보면 된다
백그라운드 종료 방지
- 명령이 종료되면 자동으로 컨테이너가 중지한다
- 명령에
sleep infinity
를 추가해 컨테이너를 유지 시킨다
# sleep infinity 만 사용
docker run -i -d 35a88802559d sleep infinity
# 다른 커멘드와 사용
docker run -i -d 35a88802559d bash -c "apt update && sleep infinity"
Dockerfile로 이미지 빌드하기
크로스 플렛폼
arm
,x86
등 여러 플렛폼 지원 가능하기 빌드하기# 베이스 이미지의 지원 플렛폼 보기 # 당연한말 이지만 베이스 이미지가 지원하는 플렛폼만 가능하니까 docker buildx imagetools inspect <베이스이미지> # platform 값을 원하는 플렛폼 만큼 추가 하여 빌드 # --load 를 --push로 바꾸면 바로 원격에 push 하는것도 가능 docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x --load -t <이미지:테그> .
처음 빌드 할때 작업
-
containerd 활성화 하기
# /etc/docker/daemon.json 파일 만들기 sudo [편집기] /etc/docker/daemon.json #해당 파일에 이렇게 입력하고 저장 { "features": { "containerd-snapshotter": true } } #docker 재시작 systemctl restart docker
-
builder 생성하기
- 기본 builder 는 크로스 플렛폼 미지원이라
docker-container
드라이버로 builder 생성
# platform 값을 원하는 플렛폼 만큼 추가 하여 빌드 docker buildx create --name multi-arch-builder --platform linux/amd64,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x --driver docker-container --bootstrap --use
- 기본 builder 는 크로스 플렛폼 미지원이라
(참고) builder 기본값으로 되돌리기
# 빌더 목록 보기
docker buildx ls
# default 빌더로 되돌리기
docker buildx use default
# 만든 빌더 삭제
docker buildx rm <생성한 빌더이름>
단일 플렛폼
일관성을 위해 docker buildx build 사용
-
arm
,x86
등 그 중 하나만 빌드가능 (PC 따라감)# --load 를 --push로 바꾸면 바로 원격에 push 하는것도 가능 docker buildx build --load -t <이미지이름:테그> .
빌드이후 정리
docker buildx prune -f --all && docker rm -f buildx_buildkit_multi-arch-builder0 && docker rmi moby/buildkit:buildx-stable-1
- 이게 방식이 임시 컨테이너인
moby/buildkit
을 pull 을 받아 거기서 작업하는거라 빌드 완료 후 에도 컨테이너가 남아있음
케시제거
# 대부분의 케시 제거
docker system prune -a
# 빌드 케시 제거
docker buildx prune -f --all
==혹시나 정리했는데도 과하게 용량이 적은경우==
==이거 하면은 기존 컨테이너 사용불가==
sudo rm -rf /var/lib/docker/overlay2
# 서비스 재시작
sudo systemctl stop docker
sudo systemctl start docker
Docker Compose
Compose 기본 옵션
# 파일 경로 또는 파일명이 docker-compose.yml 이 아닌경우
docker compose -f <yml파일>
# 프로젝트 이름 지정
docker compose -p <프로젝트 이름>
Compose 컨테이너 생성 & 삭제
# 컨테이너 빌드 & 생성(재생성) 하고 실행
docker compose up -d
#특정 작업만(yml 에 services에 정의된) 실행
docker compose run --rm <작업명> <명령|null>
# 프로젝트, yml 파일 지정 예
===
docker -f test.yml -p my-project compose up
===
# 컨테이너 삭제 볼륨, 네트워크, 이미지 삭제
docker compose down --rmi all
Compose 컨테이너 실행 & 중지
# compose 컨테이너 실행
docker compose start
# 프로젝트 지정 예
===
docker -p my-project compose start
===
# compose 컨테이너 중지
docker compose stop
Compose 상태 관리
# Compose 프로젝트 목록 보기
docker compose ls --all
# Compose 프로젝트 실행 상태 보기
docker compose ps --all
# Compose 로그 출력
docker compose logs -f
Docker Network 제어
# 네트워크 목록 보기
docker network ls
# 네트워크 세부 정보
docker network inspect <네트워크ID>
# 네트워크 생성
docker network create --driver=<드라이버> <네트워크 이름>
# 컨테이너의 네트워크 연결
docker network connect <네트워크 이름> <컨테이너id>
# 컨테이너와 네트워크 연결 끊기
docker network disconnect <네트워크 이름> <컨테이너id>
# 네트워크 제거
docker network rm <네트워크ID>
호스트 ←> 컨테이너 간 파일 전송
호스트 → 컨테이너
docker cp <호스트파일경로> <컨테이너이름>:<컨테이너 내부 경로>
컨테이너 → 호스트
docker cp <컨테이너이름>:<컨테이너 내부 경로> <호스트파일경로>
명령어 정리
docker pull <이미지>
허브 에서 이미지 pull 하기
docker run <옵션> <이미지id> <명령 | null>
컨테이너 생성 & 실행
- 명령어를 지정하지 않으면 대부분
bash
- 컨테이너 생성시 지정한 옵션값은 변경 불가
docker run -it <이미지id>
컨테이너를 터미널을 사용하여 진입한다
- bash 사용시 -it 옵션 안하면 컨테이너가 자동으로 종료된다
옵션
--name [컨테이너 이름]
- 컨테이너 이름지정 (이름을 컨테이너 식별값으로 사용가능)
-p [호스트포트]:[컨테이너포트]/[tcp/udp | null]
- 컨테이너 포트 포워딩 & 포트 개방
- 여러개 개방 하고 싶으면
-p
를 여러번 쓰면 됨
-d
- 컨테이너를 백그라운드 모드로
-i
- 표준입력을 열어둔다
-t
- 터미널을 할당한다
--rm
:- 컨테이너가 종료된 이후에 자동삭제
- 명령을 지정한경우 해당 명령어 실행하면 자동 삭제
--gpus [gpu]
:all
: 모든 gpu 사용- 호스트 pc에 엔비디아 그래픽 드라이버 설치 작업 필요
--network [네트워크 이름]
:- 연결할 네트워크 지정
-v [볼륨|폴더경로:마운트될 위치]
:- 볼륨 마운트 또는, 폴더 마운트
- 이때 폴더를 마운트 하면 컨테이너에서 파일을 건들면 호스트 PC에 파일도 수정된다
--hostname [호스트 이름]
:- 쉘 호스트 이름 변경
docker create <옵션> <이미지id> <명령 | null>
컨테이너를 실행하지 않고 생성
- 명령어를 지정하지 않으면 대부분
bash
- 컨테이너 생성시 지정한 옵션값은 변경 불가
옵션
run 과 동일
docker container restart <컨테이너id | 컨테이너 이름>
컨테이너 재시작 및 시작
- 컨테이너 생성 시 입력한 명령이 있으면 그거 또 다시 실행 하는거
docker attach <컨테이너id | 컨테이너 이름>
실행중인 컨테이너의 쉘에 접속
- 정확히 말하면 표준 입/출력 신호를 전달
attach
의 경우 이전과 동일한 쉘 세션에 진입- 만일 docker run -d로 백그라운드 실행 시 포그라운드 전환 하는게 가능하다
- 이전 진행 로그를 볼수는 없기 때문에 조금 불편하긴하다
다만 표준 입력이 있는 프로그램 이렇게 진행 할 수밖에 없다
docker exec <옵션> <컨테이너id | 컨테이너 이름> <명령>
실행중인 컨테이너의 명령전달
docker exec -it <컨테이너id | 컨테이너 이름> /bin/bash
실행중인 컨테이너의 쉘에 접속
exec
의 경우 새로운 쉘을 생성하여 접속됨- 별일 없으면
attach
로 접속함 - 그러나 기본 쉘이 서버를 굴리고 있어서 무한대기 상태인 경우에는 해당 명령으로
- 별일 없으면
옵션
-d
:- 백그라운드로 명령 전달
docker ps -a
컨테이너 목록 확인
docker images
이미지 목록 확인
docker stop <컨테이너id | 컨테이너 이름>
컨테이너 종료
sudo docker kill <컨테이너id | 컨테이너 이름>
컨테이너 강제 종료
docker rm <컨테이너id | 컨테이너 이름>
컨테이너 삭제
docker rmi ubuntu <이미지>
이미지 삭제
docker logs -f <컨테이너id | 컨테이너 이름>
실시간으로 컨테이너 로그 출력
- 만약 한번만 출력하려면
-f
빼면됨
docker commit <옵션> <컨테이너id | 컨테이너 이름> <저장 이미지 명>
컨테이너의 작업한 모든 사항을 이미지로 만들기
- 만들어진 이미지는
docker images
를 통해 볼 수 있음 저장 이미지 명
=이미지:태그 (태그 다는법)
옵션
-m
: 커밋 메시지
docker tag <이미지id> <바꿀 이미지 명>
이미지에 태그, 이미지 이름 변경
- 사실 바꾸는게 아니라 이미지가 복제 되는것
- 태그 따로 설정안하면
latest
저장 이미지 명
=이미지:태그 (태그 다는법)
docker buildx build <옵션> <경로>
Dockerfile 빌드하여 이미지로 만들기
- 최신 버전인
buildx
로 사용함 - 경로에 경우 현제 경로면
.
--load
,--push
옵션 중 하나는 무조건 필수
옵션
--load
:- 빌드 이후 이미지 목록에 불러오기
--push
:- 빌드 이후 원격에 push 하기
--platform [플렛폼1],[플렛폼2]...
:- 크로스 플렛폼 지원
-f [파일명]
:- 파일명이
Dockerfile
아닌경우
- 파일명이
t [tag]
:- 생성되는 이미지에 태그 달기
--build-arg ["키=값"]
:- Dockerfile
ARG
변수의 값 전달
- Dockerfile
docker image history <이미지id>
이미지 history 보기
docker image inspect <이미지id>
이미지 정보 보기
docker container inspect <컨테이너id | 컨테이너이름>
컨테이너 정보 보기