0부터 시작하는 Docker 공부 - 컨테이너와 이미지 & 컨테이너 배포해보기

Jaehong Lee·2022년 8월 17일
0
post-thumbnail

1. 환경 확인

  • rapa 계정의 group 을 확인하면, docker 그룹에 포함되있는 것을 확인할 수 있다. 이를 하지 않으면, docker 명령을 내릴때 sudo 를 사용 해야한다

    sudo usermod -aG docker rapa

  • /etc/sudoers 파일을 편집기로 열어주자. 비밀번호는 rapa 이다
  • rapa 계정이 sudo 명령어 입력시 비밀번호를 입력 받지 않게 설정해놨다. 따라서, rapa 계정은 sudo 명령을 내릴때 비밀번호를 입력하지 않아도 된다
  • 도커의 실행 상태를 확인하자
  • 도커 버전을 확인하자. 도커 클라이언트는 API 를 통해 도커 서버에 접속하여 명령이 전달된다
    • containerd : 컨테이너를 관리하는 도구

  • 도커 정보를 확인하자. 서버 부분을 보면, 현재 서버의 컨테이너 정보에 대해 확인할 수 있다

2. 컨테이너와 이미지

  • 컨테이너 생성을 위해서는 이를 위한 이미지가 필요하다. 이미지는 정적인 파일이며, 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다

  • 컨테이너는 이미지로부터 받은 내용을 토대로 생성되고, 컨테이너에 추가된 내용은 영구적으로 보관되지 않는다. 영구적인 보관이 필요하다면 별도의 volume 을 이용하여 데이터를 보관할 수 있다

  • 이미지가 보관되는 장소 ( registry )

    1. local registry : 도커가 설치된 사용자의 컴퓨터
    • 위와 같이 local registry 에 저장된 image 리스트를 확인 가능하다
    1. private registry

      2.1. 지정된 사용자 / 그룹의 접근만을 허용하는 저장소로 aws, azure, gcp 와 같은 퍼블릭 클라우드 환경에서 특정 사용자 / 계정 / 프로젝트 만을 위한 저장소
      2.2. dockerhub 에서 저장소를 생성할 때, Private 으로 생성하게 되면 지정된 사용자들만 접속할 수 있다
      2.3. registry 컨테이너를 이용하여 회사내에 자체적으로 사설 저장소를 구현할 수 있다

    2. public registry : 모든 사용자들이 접근하고, 이미지를 다운받을 수 있는 곳 ( ex. dockerhub )
  • 이미지로부터 컨테이너를 생성하는 과정

  1. docker container run --name httpd01 .... httpd 명령어 입력
  2. 로컬에 httpd 이미지가 있는지 여부 확인하고, 없다면 public registry 로 접속하여 httpd 최신 버전을 로컬 registry 로 다운로드
  3. 로컬 registry 에 저장된 이미지를 이용하여 컨테이너 생성
  4. 생성된 컨테이너를 실행
  • 컨테이너의 종류
    1. OS 컨테이너
    2. 애플리케이션 컨테이너

이미지의 구성 요소

  • os 컨테이너 이미지의 경우 kernel 을 제외한 bin / lib 로 구성되어있으며, 이 상태 그대로 배포시 동작한다. 이러한 부분이 정적 이미지 부분이며, 배포 후 추가되는 부분은 layer 형태로 추가되며, 동적이다

  • 추가된 동적 layer 는 영구적으로 보관되지 않으므로 Host 의 디렉터리에 mount 하거나, Volume 에 mount 해야지 영구적으로 저장이 가능하다. 이를 통해 컨테이너를 재설치 및 이동시켜도, 디렉터리 or Volume mount 를 통해 기존에 저장된 추가된 Data 를 다시 컨테이너에 적용할 수 있다

3. 컨테이너를 배포해보자

Step 0. 이미지는 동일 Ip 주소에서는 하루에 100개 정도 받을 수 있다. 계정별로 100개 받고 싶다면, 인증 정보를 통해 접근해야 한다. 또한, 로컬에서 우리가 만들어 둔 이미지를 public registry 에 push 하기 위해서도 인증 정보가 필요하다

Step 1. 퍼블릭에 있는 이미지를 로컬 registry로 pull 해야 한다

docker pull centos:7
docker pull nginx

Step 2. 컨테이너 배포하기

docker container run -it --name centos01 --hostname centos1 centos:7 /bin/bash

Step 3. 컨테니어에서 나가기

    1. exit : 동작중인 컨테이너를 중지시키고 빠져나온다
    1. ctrl + p , ctrl + q : 컨테이너를 종료하지 않고 빠져나온다

4. Dockerhub Repositories 생성

  • dockerhub 에 접속하여 로그인하자. 레포지토리에 들어가자
  • 레포지토리를 만들어주자
  • 우리 계정은 현재 무료 버전이므로, private 의 경우 한 개의 레포지토리 밖에 못 만든다. 위와 같이 public 으로 만들자
  • 만들면, 오른쪽에 생성한 public 레포지터리에 이미지를 push 할 명령어를 알려준다
    • id/이름:버전 순으로 써야 한다

registry & repositories

  • 컨테이너 리포지토리 : 이미지를 관리, 가져오기 및 푸시하는데 사용되는 관련 컨테이너 이미지 모음

  • 컨테이너 레지스트리 : 컨테이너 이미지를 저장하기 위해 만들어진 리포지토리들의 모음으로 리포지토리들을 등록 및 관리한다

5. 로그인 방법

p.76

1. username / password

  • username / password 를 통해 로그인하자. 인증 정보는 config.json 파일에 저장되있다고 나온다
  • auth 부분을 복사하자
  • 다음과 같이 인증 정보를 사용하면, 계정 정보가 나오므로 위험하다
  • 그러므로 위 파일은 삭제하자

2. username / token

  • token 을 생성해주자
  • 위와 같이 token 을 통해 로그인이 가능하다. password 옵션을 stdin 으로 하여 echo 의 결과가 password 에 들어가게 한 것이다

6. 이미지 pull 하기

  • 위와 같이 centos 7 버전 이미지를 pull 하면, 먼저 로컬 레지스트리를 확인하고, 없으므로 다운로드 받는다
  • nginx 도 다운로드 받자

7. OS 컨테이너 배포하기

  • 위 명령어로 컨테이너를 배포하자. 배포하면 배포한 컨테이너에 접속한다
  • 커널을 확인하면, centos 커널이 아닌 Host 의 ubuntu 커널을 사용하는 것을 확인할 수 있다

  • 현재 이러한 구조이다. 이는 가상화와 달리, Host 의 Kernel 을 사용한다. Host 의 Kernel 을 직접 사용하므로 성능 저하가 적다

    baremetal 과 container 의 성능 차이는 1: 0.97 이며, Ram 의 경우 1 : 1.01 이다

8. 컨테이너에서 나가기

1. exit : 동작중인 컨테이너를 중지시키고 나온다

  • exit 를 통해 접속한 컨테이너에서 나올 수 있다
  • docker container ls 를 통해 현재 동작 중인 컨테이너를 확인할 수 있다
  • --all 옵션을 통해 중지된 컨테이너까지 출력할 수 있다
  • 중지중인 컨테이너를 동작시키자. 허나, 아직 접속은 하지 않았다
  • docker attach 를 통해 컨테이너 내부로 진입할 수 있다

2. ctrl + p , ctrl + q : 컨테이너를 종료하지 않고 빠져나온다

  • 위 두 가지를 눌러 빠져나오자

9. 애플리케이션 컨테이너를 배포해보자 - nginx

docker pull nginx
  • docker hub 에 있는 nginx 최신 이미지를 로컬 저장소에 pull 하자
  • 버전 지정을 하지 않으면, 자동으로 docker hub에 있는 이미지 중 최신 버전이 다운 된다
  • run 은 생성과 동시 실행, d 는 백그라운드 실행 , -p 는 port 옵션으로 Host ( ubuntu ) 의 8001 port 와 컨테이너의 80 port 를 매핑한 것 이다. 이는 Tcp 가 default 이다
docker container run -d --name nginx01 -p 8001:80 nginx

  • 실행하면 생성된 컨테이너의 ID 가 출력되며, ID 의 실제 길이가 길기 때문에 주로 ID 의 12자리까지 사용된다
  • 생성한 컨테이너의 정보를 확인하자
  • 외부에서 Host 의 8001 port 에 접속하면, 다음과 같이 nginx 웹 서버에 잘 접속된다

10. 애플리케이션 컨테이너를 배포해보자 - httpd

docker container run -d --name httpd01 -p 8002:80 httpd

  • 위와 같이 이미지 pull 과 배포를 한 번에 할 수 있다
  • httpd 웹 서버에 잘 접속된다. 이 명령어는 어떻게 동작할까?
    1. 로컬 저장소에 이미지가 있는지 여부 확인
    2. 도커 허브에 접속하여 httpd:lastest 를 찾고, 이를 pull 한다
    3. 로컬에 pull 된 이미지를 이용하여 이름 httpd01 인 컨테이너를 생성하고, ubuntu 호스트의 8002 번 포트와 80 번 포트를 자동으로 매핑해 준다

  • 이 컨테이너는 -d 를 통해 백그라운드에서 실행한다고 설정했기에 접속이 안된다
  • 외부 연결용 인터페이스가 없는 경우에는, 위와 같이 exec 를 통해 외부 클라이언트에서 컨테이너에게 명령을 전달하고, 결과를 외부에서 받을 수 있다
    • exec 를 사용하면, 컨테이너 내부로 직접 들어가지 않아도, 컨테이너의 명령을 외부에서 전달하여 결과를 확인할 수 있다

  • 현재 이런 형태이다

11. Docker 명령어 간단 정리

docker container run # 컨테이너 생성 및 시행
docker container ls --all # 동작 / 중지중인 모든 컨테이너의 리스트 확인 가능
docker image ls # 로컬 저장소에 보관된 이미지의 리스트를 확인할 수 있다
docker container exec # 컨테이너에게 명령을 전달하고, 결과를 호스트에서 확인 가능
docker container attach # 외부 연결용 ( console ) 인터페이스가 있는 경우에는 컨테이너로 직접 들어갈 수 있다

12. Quiz - 추가 httpd 웹 서버 배포 및 확인

docker run -d --name httpd02 -p 8003:80 httpd

  • 잘 배포 및 실행된다

13. 웹 서버의 페이지를 지정해보자

  • 현재 위치에 index.html 파일을 만들자
  • curl 을 통해 naver 페이지를 index.html 에 복사하자
docker container run -d --name httpd80 -p 8080:80 -v /home/rapa:/usr/local/apache2/htdocs httpd

  • 위 명령어를 쳐주자. -v 옵션을 통해 Host 의 디렉터리와 컨테이너의 디렉터리를 mount 해준 것 이다
  • 페이지가 잘 출력된다
  • index.html 을 수정하자
  • 웹 페이지가 갱신된 것을 확인할 수 있다
profile
멋진 엔지니어가 될 때까지

0개의 댓글