1. 환경 확인
- rapa 계정의 group 을 확인하면, docker 그룹에 포함되있는 것을 확인할 수 있다. 이를 하지 않으면, docker 명령을 내릴때 sudo 를 사용 해야한다
sudo usermod -aG docker rapa
- /etc/sudoers 파일을 편집기로 열어주자. 비밀번호는 rapa 이다
- rapa 계정이 sudo 명령어 입력시 비밀번호를 입력 받지 않게 설정해놨다. 따라서, rapa 계정은 sudo 명령을 내릴때 비밀번호를 입력하지 않아도 된다
- 도커의 실행 상태를 확인하자
- 도커 버전을 확인하자. 도커 클라이언트는 API 를 통해 도커 서버에 접속하여 명령이 전달된다
- containerd : 컨테이너를 관리하는 도구
- 도커 정보를 확인하자. 서버 부분을 보면, 현재 서버의 컨테이너 정보에 대해 확인할 수 있다
2. 컨테이너와 이미지
-
컨테이너 생성을 위해서는 이를 위한 이미지가 필요하다. 이미지는 정적인 파일이며, 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다
-
컨테이너는 이미지로부터 받은 내용을 토대로 생성되고, 컨테이너에 추가된 내용은 영구적으로 보관되지 않는다. 영구적인 보관이 필요하다면 별도의 volume 을 이용하여 데이터를 보관할 수 있다
-
이미지가 보관되는 장소 ( registry )
- local registry : 도커가 설치된 사용자의 컴퓨터
- 위와 같이 local registry 에 저장된 image 리스트를 확인 가능하다
- private registry
2.1. 지정된 사용자 / 그룹의 접근만을 허용하는 저장소로 aws, azure, gcp 와 같은 퍼블릭 클라우드 환경에서 특정 사용자 / 계정 / 프로젝트 만을 위한 저장소
2.2. dockerhub 에서 저장소를 생성할 때, Private 으로 생성하게 되면 지정된 사용자들만 접속할 수 있다
2.3. registry 컨테이너를 이용하여 회사내에 자체적으로 사설 저장소를 구현할 수 있다
- public registry : 모든 사용자들이 접근하고, 이미지를 다운받을 수 있는 곳 ( ex. dockerhub )
-
이미지로부터 컨테이너를 생성하는 과정
- docker container run --name httpd01 .... httpd 명령어 입력
- 로컬에 httpd 이미지가 있는지 여부 확인하고, 없다면 public registry 로 접속하여 httpd 최신 버전을 로컬 registry 로 다운로드
- 로컬 registry 에 저장된 이미지를 이용하여 컨테이너 생성
- 생성된 컨테이너를 실행
- 컨테이너의 종류
- OS 컨테이너
- 애플리케이션 컨테이너
이미지의 구성 요소
-
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. 컨테니어에서 나가기
- exit : 동작중인 컨테이너를 중지시키고 빠져나온다
- ctrl + p , ctrl + q : 컨테이너를 종료하지 않고 빠져나온다
4. Dockerhub Repositories 생성
- dockerhub 에 접속하여 로그인하자. 레포지토리에 들어가자
- 레포지토리를 만들어주자
- 우리 계정은 현재 무료 버전이므로, private 의 경우 한 개의 레포지토리 밖에 못 만든다. 위와 같이 public 으로 만들자
- 만들면, 오른쪽에 생성한 public 레포지터리에 이미지를 push 할 명령어를 알려준다
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 웹 서버에 잘 접속된다. 이 명령어는 어떻게 동작할까?
- 로컬 저장소에 이미지가 있는지 여부 확인
- 도커 허브에 접속하여 httpd:lastest 를 찾고, 이를 pull 한다
- 로컬에 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
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 을 수정하자
- 웹 페이지가 갱신된 것을 확인할 수 있다