Gom3rye

Docker 명령어 본문

현대 오토에버 클라우드 스쿨

Docker 명령어

Gom3rye 2025. 6. 16. 17:33
728x90
반응형

이미지 관련 명령어

docker [image] pull [OPTIONS] name[:TAG | @IMAGE_DIGEST]

  • 이미 존재하는 이미지를 다운로드하면 다운로드 되지 않는다.
docker image pull jenkins/jenkins:lts
docker pull debian

태그를 안 붙이면 :latest 붙인다.

  • 다운로드 한 결과

→ Using default tag: latest

  • 태그를 생략해서 태그를 latest로 설정했다는 의미

→ latest: Pulling from library/debian

  • library는 Image를 저장하고 있는 네임스페이스로 네임스페이스는 저장소 별로 설정을 하는데 별도로 레지스트리를 설정하지 않으면 도커 허브의 library가 된다.
  • 이미지의 정식 이름은 <네임스페이스>/<이미지이름>:<태그> 이고 library로 시작하면 Docker Hub에 저장된 이미지라는 뜻이다.

→ Digest: sha256:0d8498a0e9e6a60011df39aab78534cfe940785e7c59d19dfae1eb53ea59babe

  • 이미지의 분산 해시 값을 표시하는데 다운로드 한 이미지 여러 개의 Layer로 구성되는데 이 때 가장 핵심 정보를 바이너리 형태로 제공한다.

(가상 머신은 운영체제가 격리되게끔 깔리고 컨테이너는 Runtime 위에 최소한의 OS가 깔리고 그 위에 앱이 깔린다.)

Maria DB → Ubuntu깔리고 Maria DB 깔림

MySQL → Ubuntu 깔리고 MySQL 깔림

→ 쪼개서 만들자.

ex.

  • MySQL layer - 분산 해시값
  • Ubuntu layer - 분산 해시값
  • Maria DB layer - 분산 해시값
  • Ubuntu layer - 분산 해시값

→ Status: Image is up to date for debian:latest

  • 로컬에 이미지가 저장되었다.

→ docker.io/library/debian:latest

  • 이미지의 실제 URL
  • 옵션
    • -a, --all-tags: 저장소에 태그로 지정된 여러 Image를 모두 다운로드
    • --disable-content-trust: 검증 작업을 건너 뛰는 것으로 기본값은 true
      • 검증을 하고 싶으면 false를 주면 됨
    • --platform: 플랫폼을 지정하는 것으로 --platform=linux 형태로 설정한다.
      • --platform linux/amd64 이런 식으로 지정하기도 한다.
    • -q, --quiet: Image 다운로드를 할 때 상세 정보 숨김
  • 버전 정보(TAG)를 설정해서 다운로드
docker pull debian:latest
  • 저장소를 설정해서 다운로드(저장소를 설정하지 않으면 기본적으로 Docker Hub이다.)
docker pull docker.io/library/debian:latest

→ 위의 명령어와 같은 결과) 이미지 해시를 비교해보면 결과가 똑같다는 것을 알 수 있다.

  • 구글 레지스트리에서 다운로드 받기 (구글의 레지스트리는 gcr.io이고(도커 허브가 아니면 써줘야 한다.) 이미지는 네임스페이스는 google-samples 이고 이미지 이름은 hello-app 이고 태그는 1.0)
docker pull gcr.io/google-samples/hello-app:1.0

docker images 또는 docker image ls

  • 전체 이미지 정보 확인

  • REPOSITORY: 이미지 이름
  • TAG: 버전 정보로 Image를 다운로드 할 때 지정하지 않으면 latest
    • latest 버전이 아닌 경우는 직접 버전 정보를 작성해 줘야 한다.
  • IMAGE ID: 이미지의 식별값으로 원래는 64자이지만 12글자만 출력, 이미지 식별값 작성할 때 12글자만 작성해도 된다.
  • CREATED: 이미지 생성 후 지난 시간
  • SIZE: 이미지의 크기
  • 이미지 세부 정보 확인

docker image inspect [OPTIONS] 이미지이름

  • 이미지 세부 정보 확인
  • 옵션은 --format 이나 -f 옵션으로 JSON 형식의 정보 중 원하는 형식의 정보만 출력이 가능하다.
  • 세부 정보
    • image ID: “Id”
    • 생성일: “Created”
    • 도커 버전: “DockerVersion”
    • CPU 아키텍쳐: “Architecture”
    • 이미지 다이제스트 정보: “RootFS”
    • 이미지 레이어 저장 정보: “GraphDriver”

  • 이미지 세부 정보 전체 출력
docker image inspect debian
  • 이미지 다이제스트 정보 출력
docker image inspect --format '{{.RootFS}}' debian

docker image history 이미지이름

  • 레이어와 실행 정보 확인
  • 어떻게 만들어졌는지 확인하고 싶으면 history 명령어 사용

-> 밑에서부터 읽기

실습

  • httpd라는 이미지가 있는지 확인
docker search httpd
  • 공식 이미지가 있다면 다운로드
docker pull httpd

→ 일부러 다른 이미지도 다운로드: docker image pull manageiq/httpd

⇒ 일반적으로 공식 이미지가 다른 이미지보다 사이즈가 작다. (공식 이미지에서 따로 처리를 해서 다른 이미지를 만드는 것이기 때문에)

  • 상세 정보 출력
docker image inspect httpd
  • 생성한 날짜(Created) 출력
docker image inspect --format {{.Created}} httpd
  • 이미지와 태그(RepoTags)만 출력
docker image inspect --format {{.RepoTags}} httpd
  • 이미지의 운영체제의 확인(Os)만 출력
docker image inspect --format {{.OS}} httpd
  • 레이어와 실행 정보 확인
docker image history httpd

docker stop $(docker ps -a -q)

  • 모든 컨테이너 중지

docker rm $(docker ps -a -q)

  • 모든 컨테이너 삭제

docker rmi $(docker images -q)

  • 모든 이미지 삭제

실습

  • 데비안 다운로드 받기
docker image pull debian
  • httpd를 다운로드 받기
docker image pull httpd

→ 레이어의 개수가 더 많다.

  • Docker Union File System
    • 도커의 이미지들은 OS → Middleware → Application을 쌓아 나가는 구조이다.
    • 도커 이미지 구조의 기본 운영체제 레이어를 쌓는다.
    • 운영체제 베이스 이미지 위에 아파치 웹 서버를 설치한 레이어를 올린다.
    • 아파치 웹 서비스에 필요한 리소스 정보 및 환경 정보가 포함된 레이어를 올린다.
    • 이미지는 불변의 읽기 전용 레이어들의 집합 구조이다. → 유니언 파일 시스템이라고 한다.
    • 도커 이미지를 이용해서 컨테이너를 구동할 때 컨테이너에서 발생한 모든 변경 정보를 저장하기 위해 읽고-쓰기 레이어를 만들고 거기에 저장한다.
  • 도커의 모든 데이터 및 로그 정보 저장소 확인
sudo su -
cd /var/lib/docker
ls
## 또는
sudo ls /var/lib/docker

→ overlay2 : 읽기 쓰기 레이어

  • 실제 데이터가 저장되는 위치 확인
    • 이미지 레이어 데이터 확인
    sudo ls /var/lib/docker/image/overlay2/layerdb/sha256
    
    • 이미지 실행을 통해 만들어지는 컨테이너의 최상위 경로 및 영역
    sudo ls /var/lib/docker/overlay2
    
    • 컨테이너 생성
    docker run -it -p 81:80 --name=webserver1 httpd /bin/bash
    ls
    touch Hello-Docker # touch: 빈 파일 만들기
    
    • 생성한 컨테이너 확인해보기
    sudo find / -name 'Hello-Docker'
    

도커 허브에 이미지 업로드

docker login / logout

  • 도커 허브에 로그인하기
docker login -u [userid]
password 입력
  • 이미지와 태그
    • 이미지는 업로드할 때의 이름이고 태그는 버전이다.
    • 전체 이름은 레지스트리주소/레포지토리이름:버전
    • 태그 부여
      • docker tag 원본이미지이름[:버전] 참조할 이미지이름[:버전]

docker push 이미지이름

  • 이미지 업로드
  • 도커 허브에 이미지 업로드
    • 도커 로그인 명령(업로드 하기 전에 로그인을 해야 한다.)
    • CLI 환경이라면 docker login -u 계정을 이용해서 로그인 수행
    • GUI 환경이라면 docker login 명령어를 작성했을 때 부라우저가 화면에 출력됨
  • 실습
    • 자신의 이미지를 확인
    docker images
    
    • myhttpd:1.0 만들기
    docker image tag [이미지ID] myhttpd:1.0
    docker image tag bf07fec943ec myhttpd:1.0
    

  • myhttpd:2.0도 만들기
docker image tag [원래 이미지이름] [바꿀 이미지이름]
docker image tag myhttpd:1.0 myhttpd:2.0
  • 이미지 업로드
docker image tag 이미지:태그 아이디/실제이름
docker image tag myhttpd:2.0 kyla333/myhttpd:3.0
  • 이미지 푸시
docker push 아이디/실제이름
docker push kyla333/myhttpd:3.0

  • 4.0 버전도 만들어서 업로드
docker image tag httpd:latest kyla333/myhttpd:4.0
docker push kyla333/myhttpd:4.0

도커 이미지를 하나의 파일로 관리

docker image save [옵션] 이미지이름 > 파일경로

  • 저장

docker image load < 파일경로

  • 로드
  • 실습
    • eclipse/mysql 이라는 이미지를 다운로드
    docker image pull eclipse/mysql
    
    • test-mysql57.tar 파일로 저장
    docker image save eclipse/mysql > test-mysql57.tar
    
    • 원본 이미지 삭제
    docker image rm eclipse/mysql
    
    • 이미지를 다시 읽어오기 (docker image pull 없이 복원시키기)
    docker image load < test-mysql57.tar
    

  • 이미지의 용량을 줄이고자 하는 경우에는 확장자를 tar 대신에 gz로

이미지 삭제

docker image rm

(docker rmi 도 가능)

  • 실습
    • ubuntu:14.04를 다운로드하고 삭제
    docker pull ubuntu:14.04
    docker image rm ubuntu:14.04
    ## 또는 docker rmi ubuntu:14.04
    
  • 이미지와 관련된 컨테이너를 모두 삭제할 때는 -f 옵션을 추가
  • 셸 스크립트 변수 사용
    • 모든 이미지 삭제
    docker rmi -f $(docker images -q)
    
    → 데몬때문에 삭제 안 되면 -f 옵션 주기
    • 특정 이미지 이름(debian)만 포함된 경우 삭제
    docker rmi $(docker images | grep debian)
    
    • 특정 이미지 이름에 속한 것만 제외하고 삭제
    docker rmi $(docker images | grep -v debian)
    
  • 사용하지 않는 이미지 파기
    • 컨테이너로 만들어지지 않은 이미지 파기
    docker image prune -a
    
  • 필터링해서 제거
    • 48시간동안 사용되지 않은 이미지 제거
    docker image prune -a -f --filter "until=48th"
    

Container 관련 명령

Container로 애플리케이션 실행

  • 이미지는 읽기 전용의 불변 값으로 만들어지는데 이러한 이미지를 바탕으로 도커 엔진은 컨테이너를 생성할 수 있는데 이 때 이미지와 함께 읽고 쓰기가 가능한 레이어를 추가해서 만들어지는 것이 컨테이너이다.
  • 이미지와 마찬가지로 컨테이너 관련된 명령도 docker daemon이 제공하는 docker CLI API를 통해 제공한다.
  • gihyodocker/echo:latest 이미지를 다운로드 받아서 컨테이너로 실행
docker image pull gihyodocker/echo:latest
docker container run -t -p 9000:8080 gihyodocker/echo:latest

→ 원격 창 하나 더 띄워 놓고 확인해보기

  • virtual box에 설치된 도커를 이용해서 외부에서 접속할 수 있도록 설정
    • 이미지 다운로드
    docker image pull gihyodocker/echo:latest
    
    docker container run -dit -p 9000:8080 gihyodocker/echo:latest
    
    → -d 명령으로 원격창 하나 더 안 띄어도 확인할 수 있다.
    → Docker의 -p 9000:8080VM 내부에서의 포트 매핑일 뿐, 호스트와는 무관
    (localhost:9000 은 내 컴퓨터니까 안되는 게 당연)

포트 포워딩 해주면 인터넷으로도 192.168.56.1:9000 접속할 수 있다.

  • 실행 과정
    • 컨테이너의 실행을 위해서 docker container run 명령을 사용하면 해당하는 도커 이미지를 찾아서 복사본인 스냅숏 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어를 추가한 뒤 docker start 명령으로 컨테이너를 시작한다.
    • 실행 중인 컨테이너를 확인하는 명령은 docker ps이다.

컨테이너를 수동으로 단계별로 제어

1. 이미지 다운로드

docker image pull ubuntu:14.04

2. 컨테이너 생성

docker create [옵션 나열] [--name 컨테이너이름] 이미지이름
docker create -it --name container-test1 ubuntu:14.04

3. 컨테이너 생성 확인 (-a: 모든 컨테이너)

docker ps -a

4. 컨테이너 실행

docker start 컨테이너이름
docker start container-test1

실행 중인 컨테이너 확인

docker ps

컨테이너 내부로 접속 (우분투 안으로 들어가서 프롬프트 형태로 바뀌게 된다.)

docker attach container-test1

5. 컨테이너 삭제

docker rm container-test1

⇒ 위와 동일한 작업 수행

  • “이미지 다운로드 및 컨테이너 생성과 실행 그리고 내부로 접속” 을 한 번에 할 수 있는 명령어
docker run -it --name container-test1 ubuntu:14.04 bash

지우는 것은 rm으로 똑같음

  • 컨테이너의 생명 주기
    • 실행 상태
      • docker container run 명령의 인자로 지정된 Docker Image를 기반으로 Container가 생성되면 Image에 포함된 CMD 및 ENTRYPOINT 명령문에 정의된 애플리케이션을 실행하고 이 애플리케이션이 실행 중인 상태
      • HTTP 요청을 받는 서버 애플리케이션이면 오류로 인해 종료되지 않는 한 실행 중 상태가 지속되므로 실행 기간이 길며 이에 비해 명령이 바로 실행되고 끝나는 명령행 도구 Container는 명령을 실행하고 바로 종료가 된다.(정지 상태)
    • 정지 상태
      • 실행 중인 Container를 명시적으로 정지하거나 Container에서 실행된 애플리케이션이 정상/오류 여부를 떠나서 종료된 경우는 정지 상태가 된다.
      • 정지된 Container는 현재 상태를 저장하고 있기 때문에 다시 실행시킬 수 있다.
    • 파기 상태
      • 정지 상태의 Container는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아있다.
      • 동일한 Container는 2개 이상 생성할 수 없다. (동일한 Container는 존재하지 않는다.)

docker run [옵션] 이미지이름 [인자]

  • docker image pull, docker container create, docker container start + 명령어의 기능을 하나로 합친 명령
  • 이미지가 없으면 image pull 을 먼저 수행한다.
  • 사용할 수 있는 인자는 이미지 종류에 따라 달라지게 되는데 MySQL Image처럼 로그인에 사용할 아이디나 패스워드, 인코딩이나 정렬 순서를 인자로 받는 경우도 있고 아무 인자도 지정하지 않는 경우도 있다.
  • 옵션
    • --name: 컨테이너 이름으로 설정하지 않으면 임의로 설정된다.
      • 식별자의 역할을 하기 때문에 중복되면 안된다.
    • -p: 외부 포트와 내부 포트를 매핑하는 옵션, port forwarding
      • 먼저 쓰는 게 외부 포트, 나중에 쓰는 게 내부 포트 ex. 2000:3306 → 2000포트로 3306에 들어가기
    • -P: 컨테이너 내부의 노출된 포트를 호스트 임의의 포트에 개시한다.
      • 잘 사용하지 않음
    • -v 볼륨 마운트
      • 마운트: 디스크 연결 (쓸 수 있도록)
      • 데이터를 반영구적으로 저장: volume
    • --net: 네트워크 연결
      • public cloud에서는 인터넷을 통하면 비용을 내야 한다.
      • 인터넷을 통하면 보안에 취약하다.
    • -i: 대화식 모드 연결 (내가 명령어를 주면 얘가 대답을 하는 것)
    • -t: 단말 디바이스 연결(터미널)
    • -d: 백그라운드에서 컨테이너 실행
    • -e: 환경 변수 설정
    • --rm: 컨테이너 종료될 때 자동으로 컨테이너 파기 → 중요!!!
      • 업데이트가 잘 되면 그 전 컨테이너는 죽여줘야 한다.
      • 테스트는 프라이빗 클라우드에서 하되 실제 서비스는 퍼블릭 클라우드에서
    • --restart: 컨테이너 종료 시 적용할 재시작 정책으로 no, on-failure 횟수(횟수만큼은 다시 해보겠다.), always
      • 보통은 기본적으로 always
    • -h 컨테이너의 호스트이름: 이름을 지정하지 않으면 container id로 설정
    • --link=[container:container_id]: 통신을 할 때 IP가 아닌 컨테이너 이름으로 통신
  • 한 번만 실행되는 컨테이너와 데몬 형태로 동작하는 컨테이너
    • -d는 컨테이너를 백그라운드로 실행하는 옵션이고 -i와 -t는 컨테이너 내부에 터미널로 접속하기 위한 옵션이다.
    • -d를 붙이지 않고 컨테이너를 실행하면 실행된 컨테이너가 프로그램의 실행을 마칠 때까지 터미널의 제어를 차지하므로 그 다음 명령을 입력할 수 없는 상태가 되고 -i와 -t를 사용하지 않으면 컨테이너 안의 파일 시스템에 접근할 수 없다.
    • 한번만 실행되는 컨테이너는 실행하자마자 종료되므로 컨테이너가 터미널의 제어를 차지하더라도 일시적인 것이다.
    • 데몬처럼 계속적으로 동작하는 프로그램은 저절로 종료되지 않으므로 한 번 터미널의 제어를 넘기면 이를 되찾아 오기가 불편하다.

docker ps

현재 실행 중인 컨테이너 목록을 확인하는 명령인데 -a를 이용하면 모든 컨테이너를 전부 출력한다.

  • 출력 내용
    • CONTAINER ID: 컨테이너 식별자로 무작위 문자열이 할당되는데 64글자이지만 12글자만 출력한다.
    • IMAGE: 컨테이너를 만들 때 사용하는 이미지
    • COMMAND: 컨테이너를 실행할 때 수행하도록 만든 명령어
    • CREATED: 생성 후 경과된 시간
    • STATUS: 컨테이너의 현재 상태로 실행 중이면 Up, 종료된 상태면 Exited
    • PORTS: 포트포워딩 된 내용
    • NAMES: 컨테이너 이름

docker stop 컨테이너ID 또는 이름

실행 중인 컨테이너 중지

  • 모든 컨테이너 중지
    • docker stop $(docker ps -a -q)

docker rm 컨테이너ID 또는 이름

특정 컨테이너 삭제

  • 모든 컨테이너 삭제
    • docker rm $(docker ps -a -q)
    • 삭제는 중지된 컨테이너만 가능하다.

실습

  • Image 이름은 httpd이고 컨테이너 이름은 apa001ex1으로 실행
docker run --name apa001ex1 -d httpd

  • apa001ex1 컨테이너 중지
docker stop apa001ex1 # 결과: apa001ex1
  • 중지 확인 (status 보면 된다.)
docker ps -a
  • apa001ex1 컨테이너 삭제
docker rm apa001ex1 # 결과: apa001ex1
  • 삭제 확인
docker ps -a

실습 2

  • nginx:1.8 이라는 이미지를 가지고 컨테이너를 생성
docker run --name webserver1 -d nginx:1.8

→ 이미지가 지금은 지원하지 않는 버전으로 만들어져서 다운로드 불가

 

 

 

----- 참고

설정 파일 yml에 디비 정보 적는 이유: 빌드를 다시 하지 않아도 된다.

ORM → Object Relational Mapping으로 객체(Class)와 테이블을 매핑해주는 것

  • SQL을 직접 작성하지 않고도 데이터를 쉽게 조작 가능
  • ORM 사용 시 예:
  •  
  • @Entity public class User { @Id private Long id; private String name; } 이 클래스는 ORM 프레임워크(JPA, Hibernate 등)에 의해
  • CREATE TABLE user (id BIGINT PRIMARY KEY, name VARCHAR);
    와 유사한 테이블로 매핑된다.
728x90
반응형

'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글

Docker 명령어  (0) 2025.06.17
현대 오토에버 클라우드 교육 참여 소감  (0) 2025.06.17
클라우드 보안  (5) 2025.06.13
클라우드 보안  (4) 2025.06.12
클라우드 보안  (3) 2025.06.11