Gom3rye
Docker 명령어 본문
이미지 관련 명령어
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 옵션을 추가
- 셸 스크립트 변수 사용
- 모든 이미지 삭제
→ 데몬때문에 삭제 안 되면 -f 옵션 주기docker rmi -f $(docker images -q)
- 특정 이미지 이름(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
→ -d 명령으로 원격창 하나 더 안 띄어도 확인할 수 있다.docker container run -dit -p 9000:8080 gihyodocker/echo:latest
→ Docker의 -p 9000:8080은 VM 내부에서의 포트 매핑일 뿐, 호스트와는 무관
(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가 아닌 컨테이너 이름으로 통신
- --name: 컨테이너 이름으로 설정하지 않으면 임의로 설정된다.
- 한 번만 실행되는 컨테이너와 데몬 형태로 동작하는 컨테이너
- -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); 와 유사한 테이블로 매핑된다.
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
Docker 명령어 (0) | 2025.06.17 |
---|---|
현대 오토에버 클라우드 교육 참여 소감 (0) | 2025.06.17 |
클라우드 보안 (5) | 2025.06.13 |
클라우드 보안 (4) | 2025.06.12 |
클라우드 보안 (3) | 2025.06.11 |