1. 도커 이미지

- 도커 이미지는 컨테이너 실행에 필요한 실행 파일, 라이브러리, 설정 값 등을 포함

- 이미지는 새로 만들지 않는 한 원본은 변경되지 않음

- 이미지 생성 및 실행 순서

① 애플리케이션 개발

② Dockerfile에 이미지 생성 프로세스 기입

③ 빌드하여 이미지로 생성

④ 이미지를 활용해 컨테이너 생성

⑤ 컨테이너 작동 여부 테스트

⑥ 도커허브에 업로드

⑦ ①로 돌아가기

 

1) 이미지 다운 방법

$ docker 이미지 pull 옵션 name:태그버전

docker.io : docker hub에서 기본적으로 이미지를 끌어오는 저장소 → 루트폴더처럼 굳이 적지 않아도 되는 주소로 간주

$ docker pull 192.168.31.101:9999/도커이미지

위와 같이 프라이빗 저장소를 지정하는 것도 가능하고, 주로 기업들이 이런 식으로 저장소 정보를 바꿔 사용한다.

이처럼 위와 같이 저장소 주소가 따로 들어가면 docker.io가 아닌 것을 볼 수 있다.

 

2) 이미지 내부 정보

$ docker image inspect 이미지명:버전

위 명령어를 통해 이미지 내부 정보를 JSON 형식으로 확인할 수 있다.

- 주요 정보

① Id : 이미지의 아이디

② RepoTags : 레포지토리:태그명

③ Created : 생성일자

④ GraphDriver : 이미지 레이어 정보

⑤ Architecture : CPU의 아키텍처 정보

 

- httpd:2.4 이미지 내부 정보 확인

.Os : 첫번째 계층에 있는 Os 정보만을 빠르게 찾아준다.

JSON 형식이기 때문에 위와 같이 두 개 이상 타고 들어가야 하는 정보도 있다. 

위 명령어를 통해 Config 아래 노출포트인 ExposedPorts 정보를 얻을 수 있다.

$ docker image history 이미지명:버전

마찬가지로 history를 이용해서도 이미지 정보를 얻을 수 있다.

위와 같이 history 명령어로 주요 정보에 대해 체크할 수 있다.

위와 같은 명령어를 통해 파일 형식으로 저장하는 것도 유용하다.

# cd /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256/

이미지 구성을 위한 레이어의 계층별 파일은 distribution ID를 부여받고 위 경로에 저장된다.

# ls 번호일부* 명령을 통해 위 경로에 있는 특정 레이어 파일을 조회할 수 있다.

 

※ 하부에 깔리는 이미지는 불변(Read only)으로 만들어지고, 컨테이너는 이미지 위에 Container Layer가 입출력 가능한 계층으로 추가된다. 

→ 하부 레이어를 수정할 수는 없지만, 추가적인 레이어를 구성할 수는 있다.

 

 

2. 이미지 업로드하기

1) 도커 로그인

- 레지스트리 : Dockerfile을 빌드해서 나온 이미지 혹은 docker commit을 통해 생성한 이미지를 저장하는 사이트 자체

- 레포지토리 : 해당 사이트에 생성한 본인 명의의 저장소

- 기본적으로는 hub.docker.com 저장소를 이용하여 이미지 업로드 → docker push 명령어로 수행

- docker push 

  ① docker login : 깃허브와 깃의 관계처럼 내 레포지토리에 올리기 위한 인증

  ② docker tag : 버전별로 태그라는 것을 붙여서 식별

$ docker login
username : 계정명
password : 비밀번호
$ docker logout // 위 정보 파기

위와 같은 방식의 로그인의 경우 base64로 저장되므로 복호화가 상당히 쉽기 때문에 주의해야 한다.

안전한 인증 처리를 위해 도커허브 사이트 로그인 후 [Account Settings] - [Security] - [Access Tokens]에서 토큰 발급 

$ vi .access_token
$ cat .access_token | docker login --username 본인계정명 --password-stdin

발급받은 토큰으로 .access_token 파일을 생성하여 작성하고, 위 명령어를 사용하여 로그인한다.

위와 같이 로그인이 잘 된 것을 확인할 수 있다.

 

2) 이미지 생성 가상머신과 테스트 가상머신 분리

이미지를 생성하는 가상머신과 테스트 가상머신을 분리하기 위해 완전한 복사로 복제를 진행해준다.

$ sudo hostnamectl set-hostname hostos2

위 명령어를 통해 hostname을 변경해준 후 host가 배정받은 내부망 ip 주소 변경(여기서는 192.168.56.102로 설정) 후 재시작한다.

 

3) 본인 원격 레포지토리에 이미지 업로드

본인 소유의 레포지토리에 본인이 생성한 이미지를 업로드하기 위해서는 다음 조건을 만족해야 한다.

① 이미지가 로컬에 생성되어 있어야 한다.

② 원격 레포지토리가 존재해야 하고, 해당 레포지토리에 접근할 수 있는 아이디로 로그인이 되어있어야 한다.

먼저, 도커허브에서 위와 같이 원격 레포지토리를 생성해준다.

위와 같이 도커허브 레지스트리가 잘 생성된 것을 볼 수 있고, 해당 레지스트리에 어떻게 이미지를 업로드 하는 도커 명령어도 볼 수 있다.

실습용 이미지는 위와 같이 NGINX를 기반으로 index.html을 수정한 myweb 이미지를 1.0과 1.1 버전 2개로 준비한다.

이미지를 확인해보면 레포지토리가 붙은 이미지와 원본이미지의 IMAGE_ID 값은 동일하다는 것을 볼 수 있고, 레포지토리로 분류되는 항목에 저장소 주소(내 계정 이름)도 잘 추가된 것을 확인할 수 있다.

docker push 명령어를 통해 해당 레포지토리에 이미지를 업로드한다.

도커 허브에서 확인해보면 잘 업로드된 것을 볼 수 있다.

 

※ 요구하는 양식을 정확히 맞춘다면 push 명령어로 레포지토리가 자동 생성 되기는 하지만, 일반적으로는 도커허브에 먼저 생성해둔 후 거기에 맞춰 업로드하는 방식을 사용한다. 자동 생성되는 레지스트리는 무조건 public으로 설정된다.

 

1.1 버전도 마찬가지로 push 명령어를 사용하여 업로드해주었고, 이미 존재하는 Layer는 제외하고 변경된 부분만 push되는 것을 확인할 수 있다. 즉, 버전이 바뀌어도 기존에 사용하던 레이어는 불변이므로 특정 지점까지는 같은 레이어를 유지한다.

 

4) 올라간 이미지 다른 호스트에서 검증하기

올라간 이미지가 다른 환경에서도 돌아가는지 검증하기 위해 hostos2에서 확인해봐야 한다.

위와 같이 pull 명령어로 아까 올린 이미지를 받으면 이미지가 잘 조회되는 것을 확인할 수 있다.

또한, run 명령어로 해당 이미지를 이용하여 컨테이너를 띄워보면 잘 돌아가고 있는 것을 확인할 수 있다.

 

5) 도커허브 거치지 않고 이미지 옮겨보기

일반적으로는 도커허브를 매개로 주고받지만, 도커허브를 거치지 않고 전달해야 할 때는 도커의 save 명령어를 통해 로컬파일로 저장한 후 물리 파일을 옮겨놓고 load 명령어로 불러와서 다른 호스트에 장착시킬 수 있다.

 

 

 

6) 이미지 삭제에 유용한 명령어

이미지 전체 삭제
$ docker rmi $(docker images -q) 

특정 이미지명을 포함한 것만 삭제
$ docker rmi $(docker images | grep 이미지명)

특정 이미지명이 포함되지 않은 것만 삭제
$ docker rmi $(docker images | grep -v 이미지명)

상태가 exited인 container 전체 삭제
$ docker rm $(docker ps --filter 'status=existed' -a -q)

 

'네트워크캠퍼스 > DOCKER' 카테고리의 다른 글

CLI에서 컨테이너 관리  (0) 2024.01.31
도커 레지스트리 구축  (0) 2024.01.31
Portainer를 이용해 GUI로 컨테이너 관리  (0) 2024.01.26
로컬 환경에서 도커 다뤄보기  (0) 2024.01.25
Play with Docker  (0) 2024.01.23

+ Recent posts