Information Security Study
240129 도커(Portainer), 도커 이미지 구조 이해 및 업로드(이미지 다운/업로드, 이미지 내부/정보/os 출력, 토큰 발급) 본문
240129 도커(Portainer), 도커 이미지 구조 이해 및 업로드(이미지 다운/업로드, 이미지 내부/정보/os 출력, 토큰 발급)
gayeon_ 2024. 1. 29. 15:56Portainer를 이용한 GUI로 컨테이너 관리
컨테이를 ps 명령어보다 좀 더 편하게 관리하고 싶다면 GUI로 관리할 수도 있다.
portainer라는 컨테이너를 띄워서 다른 컨테이너들을 쉽게 관리하는 법에 대해 알아볼 것이다.
$ docker pull portainer/portainer-ce
먼저 이미지를 받아온 다음
$ docker volume create portainer_data
로컬쪽과 정보를 공유시키기 위해서 볼륨이라는것을 생성한다.
그 후 해당 이미지를 실행시킨다.
$ docker run -d -p 9000:9000 \\
-v /var/run/docker.sock:/var/run/docker.sock \\
-v portainer_data:/data \\
--restart=always \\
portainer/portainer-ce
위와 같이 볼륨연결을 통한 볼륨마운트를 통해 호스트의 파일을 컨테이너로 전송할 수 있는
통로를 마련한다.
$ docker ps | grep portainer
그리고 ps로 조회를 해 보면 실행중인 프로세스가 나온다.
프로세스 확인이 되면 접속은 브라우저로 하면 된다.
해당 프로세스는 9000번 포트로 브라우저를 제공한다.
따라서 먼저 도커를 돌리고 있는 인스턴스의 내부 ip를 검색한 다음 해당 주소와 9000번 포트를 조합해 접속하면 된다.
계정을 생성한 후 create user를 누르면
위와 같이 화면이 나온다.
그리고 get starte를 선택하면 환경설정을 볼 수 있다.
클릭해 보면 현재 상태를 볼 수 있다.
docker ps로 치는 것과 같은 정보가 나온다.
이제 컨테이너를 하나 더 띄우고 반영되는지 다시 확인해볼 것이다.
바로바로 반영되는것을 볼 수 있다.
또한
$ docker exec -it 컨테이너명 전달할내역
역시 잘 사용되며 콘솔에 좀 더 편하게 접근할 수 있게 된다.
터미널에서 수행한 위 명령은
containers > tender_cori(컨테이너 이름) > console 에서 /bins/sh에 접근해 사용할 수 있다.
또한 보편적으로 많이 사용하는 공식 이미지의 경우는
앱 템플릿이라는 것을 이용해 배포할 수도 있다.
엔진엑스 등을 배포해보고 로그 등을 조회해보도록 할 것이다.
도커 이미지 구조 이해 및 업로드
도커 이미지는 컨테이너 실행에 필요한 실행파일, 라이브러리, 설정 값 등을 포함한다.
이미지는 새로 만들지 않는 한 원본은 변경되지 않는다.
다음 수순을 따라서 이미지가 생성되고 실행된다.
- 어플리케이션 개발
- Dockerfile에 이미지 생성 프로세스 기입
- 빌드해서 이미지로 생성
- 이미지를 활용해 컨테이너 생성
- 컨테이너 작동 여부 테스트
- 도커허브에 업로드
- 1로 돌아가기
이미지를 다운받는 방법
$ docker 이미지 pull 옵션 name:태그버전
: 기본적으로 이미지를 받는 방법
여기서 docker.io가 기본적으로 이미지를 끌어오는 저장소로 잡혀있다.
마치 루트폴더처럼 굳이 적지 않아도 생략해도 되는 주소로 간주가 된다는 의미이다.
다만 프라이빗 저장소를 지정할수도 있다.
$ docker pull 192.168.31.101:9999/도커이미지
주로 기업들이 이런식으로 저장소 정보를 바꿔서 사용한다.
도커허브가 아닌 사설 레지스트리를 한 번 사용해볼 것이다.
$ docker pull gcr.io/google-samples/hello-app:1.0
위와 같이 저장소 주소가 따로 들어가면
저장소 주소가 이제 docker.io가 아니게 된다.
다음은 이미지 내부 정보를 자세히 보기 위해 필요한 명령어이다.
$ docker image inspect 이미지명:버전
위 명령어를 사용하면 내부 구조를 JSON 형식으로 제공한다.
주요 정보는 다음과 같다.
- Id : 이미지의 아이디
- RepoTags : 레포지토리:태그명
- Created : 생성일자
- GraphDriver : 이미지 레이어 정보
- Architecture : 씨피유의 아키텍처 정보
$ docker pull httpd:2.4
를 이용해서 한 번 조사해볼 것이다.
전체적인 문서를 봐도 좋지만 특정 정보만 빠르게 빼내고 싶을 수 있기 때문에
grep을 사용했다.
$ docker image inspect —format=”{{.Os}}” httpd:2.4
먼저 이렇게 하면 os 정보가 나온다.
json 형식이기 때문에 두 개 이상을 타고 들어가야 하는 정보도 있을 수 있다.
Config 아래의 노출포트인 ExposedPorts를 얻어야 한다면
$ docker image inspect --format=”{{.Config.ExposedPorts}}” httpd:2.4
위와같이 .으로 계층을 2개 나열해야 한다.
또한 history를 이용해서도 이미지 정보를 얻을 수 있다.
$ docker image history httpd:2.4
이미지 자체의 정보는 도큐먼트에서 버전을 클릭하면
깃허브에 올라간 Dockerfile이 링크가 된다던지
$ docker image history 이미지명 --no-trunc > 파일명
형식으로 저장할 수도 있다.
이미지 구성을 위한 레이어의 계층별 파일은 distribution ID를 부여받고 특정 경로에 저장된다.
# cd /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256/
위 경로에 저장된다.
해당 경로에 있는 특정 레이어 파일을 조회하고 싶다면
# ls 번호일부*
을 입력해주면 된다.
하부에 깔리는 이미지는 불변(Read only)로 만들어지고
컨테이너에서는 이런 불변 이미지 위에 Container Layer가 입출력 가능한 계층으로 추가된다.
그래서 하부 레이어를 수정할수는 없지만, 추가적인 레이어를 구성할수는 있다.
이미지 업로드하기
Dockerfile을 빌드해서 나온 이미지 혹은 docker commit을 통해
생성한 이미지를 저장하는 사이트 자체를 레지스트리라고 부르고,
해당 사이트에 생성한 본인 명의의 저장소를 레포지토리라고 부른다.
이는 퍼블릭, 프라이빗 레지스트리로 나뉘게 된다.
기본적으로는 hub.docker.com 저장소를 이용해서 이미지를 업로드하고
docker push 명령어로 수행할 수 있다.
docker push작업은 다음과 같은 작업을 전제로 진행된다.
- docker login → 깃허브와 깃의 관계처럼 당연히 내 레포지토리에 올리기 위해서 인증 필요
- docker tag → 버전별로 태그라는것을 붙여서 식별
$ docker login
username : 계정명
password : 비번
위와같이 docker login을 수행하면 아이디 비번을 치라고 나오고
로그인을 성공시키면 이제 docker push명령을 원격 레포지토리에 내릴수 있게 된다.
단, 비번은 암호화가 되어서 저장되는것처럼 보이지만 base64로 저장되므로
복호화가 상당히 쉽기 때문에 주의해야 한다.
위와같이 unencryped된 파일이 저장되는 경로가 나오게 되고
해당 config.json파일을 cat으로 조회해보면 저장된 형태가 보인다.
위와 같이 평문 | base64
라고 하면 암호문이 나오긴 하는데 암복호화 키가 필요 없기 때문에
암호문을 -d(decode)옵션을 줘서 다시 복호화 시켜보면
평문으로 돌아온다.
config.json 내의 auth 항목에 대해서 복호화 해보면 위와 같이 id:password 형식으로
받아서 저장하고 있음을 확인할 수 있다.
또한 docker info | grep Username 으로
docker info의 Username 항목에서 로그인 아이디가 무엇인지도 확인가능하다.
이제 위 정보를 파기하고 싶다면
$ docker logout
을 수행하면 된다.
로그아웃 후 다시 docker info를 조회해보면 아이디가 더 이상 조회되지 않는다.
또한 config.json에도 해당 정보가 파기된다.
(cat /home/gayeon/.docker/config.json으로 확인)
그래서 편리하지만 암호로 로그인하는 방식은 별로 좋지 못하다.
이제 다른 방식으로 인증처리를 해볼 것이다.
dockerhub 홈페이지 로그인 후 Account Settings에 들어간다.
그리고 좌측 Security탭을 클릭하면 Access Tokens 가 보인다.
토큰은 언제든 파기가능하고 언제든 재발급 가능하니 부담없이 연습할 수 있다.
로그인 방법은 암호로그인, 억세스토큰, 2팩터 인증 총 3가지 방법이 있다.
2팩터 인증은 OTP같은것이기 때문에 따로 실습하지는 않을 것이다.
먼저 New Access Token을 클릭하면 아래와 같이 설명과 권한부여가 나온다.
권한부여는 Read, Write, Delete로 주었다.
마치 깃허브 토큰처럼 도커 토큰이 발급된다.
이 토큰은 수시로 발급하고 파기할 수 있다.
Description에는 아무 내용이나 적었다.
Generate를 누르면 토큰을 확인할 수 있다.
이 토근은 다시 확인하는 것이 불가능하디 어딘가에 잘 복사해 두어야 한다.
발급받은 토큰으로 계정인증하기
복사 완료했다면 리눅스에서
$ vi .access_token
형식으로 파일을 생성한다.
파일 안에 토큰을 그대로 작성 후 저장한다.
저장 완료 후 에 해당 파일이 위치한 경로에서
$ cat access_token | docker login --username 본인계정명 --password-stdin
위 명령어를 쓰면 로그인이 된다.
로그인 여부는 위 명령어로 다시 확인한다.
cat /home/gayeon/.docker/config.json로 조회해보면 auth 정보도 나온다.
이렇게 되면 어쨋든 토큰정보가 남는게 아닌가 할 수 있는데 토큰은 활성/비활성이 가능하다.
'네트워크 캠퍼스 > Docker' 카테고리의 다른 글
240202 도커(컨테이너 상태 감지, inspect로 내부 구조 확인, cp로 호스트파일 복사, events, kill) (0) | 2024.02.02 |
---|---|
240130 도커(이미지 삭제, 가상머신 분리, 원격 레포지토리에 이미지 업로드, 이미지 검증, 도커허브 없이 이미지 옮기기) (1) | 2024.01.30 |
240126 도커(idex.html, nginx 이미지 생성, MySQL 컨테이너 생성/파라미터 전달, DB엔진 워크벤치로 다루기) (1) | 2024.01.26 |
240123 도커(curl, stop, 이미지 생성 절차) (0) | 2024.01.23 |
240122 도커(개요, play with docker) (0) | 2024.01.22 |