[클라우드/Docker 기본(1) - public registry와 컨테이너 배포]

SooYeon Yeon·2022년 8월 30일
0

클라우드 Docker

목록 보기
2/24

도커 확인

groups rapa

sudo vim /etc/sudoers

21번째줄로 이동하면 rapa 계정에 대한 내용이 있다. 첫번째만 비밀번호 치고, 그다음은 X

  • 도커 상태 확인
systemctl status docker
  • 도커 버전확인
docker -v
  • 도커 구성 정보 확인
docker info

컨테이너 생성 위해서는 이미지가 필요

이미지는 정적인 파일이며 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다,

컨테이너는 이미지로부터 받은 내용을 토대로 생성되고 추가된 내용은 영구적으로 보관되지 않는다.

영구적인 보관이 필요하다면 volume을 이용해 데이터를 보관할 수 있다.

이미가 보관되는 registry, repository

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

  1. local registry : 도커가 설치되어 있는 내 컴퓨터

    docker image ls

    내 컴퓨터 자체에 이미지를 보관할 수 있는 공간이 있는데, 여기를 로컬 저장소라고 하며 컨테이너 생성 시 1차적으로 이 로컬 저장소에서 이미지를 검색하게 된다. (만약 없다면 도커 허브로 연결)

    • myweb:1.0와 같이 [repository name]:[tag]
  2. private registry :

    1. 지정된 사용자/그룹의 접근만을 허용하는 저장소. aws, azure, gcp와 같은 퍼블릭 클라우드 환경에서 특정 사용자/계정/프로젝트 만을 위한 저장소

    2. dockerhub에서 저장소를 생성할 때 private으로 생성하게 되면 지정된 사용자들만 접속할 수 있다.

    3. registry 컨테이너를 이용하여 회사 내에 자체적으로 사설 저장소를 구현할 수 있다.’

    4. 별도의 프로젝트를 진행하는 경우 사용

    5. 도커 허브에 repository를 만들 때 private으로 만들고, 접속 허용하고자하는 id를 지정한다.

    6. aws,azure,gcp와 같이 vpc 환경에서 작업하는 경우에도 사설 저장소를 운영할 수 있다.

    7. 우리 회사 내에 별도의 서버를 준비하고, 해당 서버에 registry라는 이미지를 이용하여 사설 저장소를 운영할 수 있는 컨테이너를 생성한다.

    • 10.10.10.10:5000/myweb:1.0 → push(인증 정보 확인)
    • 로그인 하고싶다면 docker login https://10.10.10.10
  3. public registry : 모든 사용자들이 접근하고 이미지를 다운받을 수 있는 곳. dockerhub

  • docker search python 이라고 하면 도커 허브에 연결해 퍼블릭 저장소에 보관된 공개된 모든 이미지를 검색/pull 할 수 있다. 첫번째 검색 결과는 항상 공식이미지이다.(base img) 공식이미지는 별도의 계정정보가 보이지 않음. 다른사람이 올린 공개된 이미지는 id/python과 같이 출력된다. 기존 base 파이썬 이미지에서 내가 기능을 더 추가해 올릴 수 있음
  • gildong/myweb:1.0 → push (인증 정보 확인)
  • 로그인 하고싶다면 docker login

이미지로부터 컨테이너를 생성하는 과정

  1. docker container run —name httpd01 …. httpd (명령어 입력)
  2. 로컬에 httpd 이미지가 있는 지 여부를 확인하고 없다면 public registery로 접속하여 받아옴

컨테이너의 종류

  1. OS 컨테이너
    • CentOS, fedora, Ubuntu 등
  2. 애플리케이션 컨테이너
    • httpd, node, python 등

실습

step0

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

hub.docker.com에 들어가 로그인

Repository → Create Repository → 제목 입력 후 create

docker push [userid]/testweb:tagname

id/이름:버전

repository를 지우고싶다면, settings에 가서 delete repository

로그인 방법

  1. username/password

    rapa@rapa:~$ docker login
    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: [userid]
    Password: 
    
    cat /home/rapa/.docker/config.json
    # auth를 복사해서
    
    echo "auth복사한값" | base64 -d
    # 하면 user pw,name보이게 됨
    
    # 위험하니 해당폴더 삭제
    rm -rf /home/rapa/.docker/config.json
  2. username/token

도커허브에서 내 계정 Account Settings → Security → New Access Token → Generate → 토큰 값 복사

echo "복사한토큰값" | docker login --username dustndus8 --password-stdin

step1

public에 있는 이미지를 로컬 레지스트리로 pull

docker pull centos:7

step2

centos7 컨테이너 배포하기

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

하면

[root@centos1 /]#

로 들어간 상태로 된다.

bare metal : container

1 : 0.97

RAM 1 : 1.01

step3

접속된 컨테이너에서 나가기

  1. exit → 동작중인 컨테이너를 종료하고 빠져나옴
  • 동작중인 컨테이너 확인
docker container ls
  • 모든 컨테이너 확인
docker container ls --all
  • 중지중인 컨테이너 시작시키기 (아직 들어간건 X)
docker start centos01
  • 컨테이너 내부로 진입하기
rapa@rapa:~$ docker attach centos01
[root@centos1 /]#
  1. Ctrl + p, Ctrl + q → 컨테이너를 종료하지 않고 빠져나옴

step4

nginx 이미지 다운로드 하기

  • docker hub에 있는 nginx 최신 이미지를 로컬 저장소에 pull
docker pull nginx
  • 도커 이미지 확인
rapa@rapa:~$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    b692a91e4e15   2 weeks ago     142MB
centos       7         eeb6ee3f44bd   11 months ago   204MB

step5

nginx 배포하기

rapa@rapa:~$ docker container run -d --name nginx01 -p 8001:80 nginx
83709ca57e6d5f54caab325f3752b1c6b73dad53e9bc01a30ac76f2ebe53c0a3 # 생성된 ID

run : create + start

-d : 생성된 컨테이너가 백그라운드에서 동작

-p 8001:80 : 8001은 호스트의 Port(Ubuntu), 80은 컨테이너의 포트를 매핑. 즉, 외부 사용자가 8001:80으로 입력하면 컨테이너의 80번 포트로 연결해주겠다는 뜻. 정적 PAT

  • 동작중인 container 확인
apa@rapa:~$ docker container ls
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                   NAMES
83709ca57e6d   nginx      "/docker-entrypoint.…"   54 seconds ago   Up 53 seconds   0.0.0.0:8001->80/tcp, :::8001->80/tcp   nginx01
044b03fee160   centos:7   "/bin/bash"              2 hours ago      Up 2 hours                                              centos01
  • nginx를 이용 (ip add로 ip 확인 후)

step6

httpd 실행하기

rapa@rapa:~$ docker container run -d --name httpd01 -p 8002:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
1efc276f4ff9: Already exists 
aed046121ed8: Pull complete 
4340e7be3d7f: Pull complete 
80e368ef21fc: Pull complete 
80cb79a80bbe: Pull complete 
Digest: sha256:343452ec820a5d59eb3ab9aaa6201d193f91c3354f8c4f29705796d9353d4cc6
Status: Downloaded newer image for httpd:latest
e0d93fd1645e17358e4ef925225ecd9f2f48f48baca0a3c10d256a995b58a08e
  1. 로컬 저장소에 이미지가 있는지 여부를 확인했더니 없다
  2. 도커 허브에 접속하여 httpd:latest를 찾고 이를 pull 한다.
  3. 로컬에 pull된 이미지를 이용하여 이름 httpd01인 컨테이너를 생성한다. 이때 Ubuntu 호스트의 8002포트와 컨테이너의 80번 포트를 자동으로 매핑해준다.

우분투의 8002포트로 접속하면 httpd로 웹접속

지금은 attach로 직접 httpd로 들어갈 수 없는 상태

  • httpd 시작
rapa@rapa:~$ docker container start httpd01
httpd01
  • 외부 연결용 인터페이스가 없는 경우에는 외부 클라이언트에서 컨테이너에게 명령을 전달하고 결과를 외부에서 받을 수 있다.
  • exec는 httpd01에게 env라는 명령을 실행하도록 하고, 밖에서 결과를 본 것(env결과)
rapa@rapa:~$ docker container exec httpd01 env
PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e0d93fd1645e
HTTPD_PREFIX=/usr/local/apache2
HTTPD_VERSION=2.4.54
HTTPD_SHA256=eb397feeefccaf254f8d45de3768d9d68e8e73851c49afd5b7176d1ecf80c340
HTTPD_PATCHES=
HOME=/root

결국, exec를 사용하면 컨테이너 내부로 직접 들어가지 않아도 컨테이너의 명령을 외부에서 전달하여 결과를 확인할 수 있다.

docker container run : 컨테이너 생성 + 컨테이너 실행

docker container ls —all : 동작/중지중인 모든 컨테이너의 리스트 확인가능

docker image ls : 로컬 저장소에 보관된 이미지의 리스트를 확인할 수 있다.

docker container exec : 컨테이너에게 명령을 전달하고, 결과를 호스트에서 확인할 수 있다.

docker container attach : 외부 연결용(console) 인터페이스가 있는 경우에는 컨테이너로 직접 들어갈 수 있다. (it 옵션을 주고 생성된 컨테이너야 함)

Quiz

httpd를 이용하여 추가 웹서버를 실행 해보기

rapa@rapa:~$ docker container run -d --name httpd02 -p 8003:80 httpd
8e4e25796774601e9ab8beaf3bff0ea49112bdaceeba9fdc0b489cb1c183e134

웹서버마다 다른 html을 보여주고싶다면,

rapa@rapa:~$ touch index.html
rapa@rapa:~$ curl https://www.naver.com > index.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  241k    0  241k    0     0  1447k      0 --:--:-- --:--:-- --:--:-- 1447k
rapa@rapa:~$ docker container run -d --name httpd80 -p 8080:80 -v /home/rapa:/usr/local/apache2/htdocs httpd
3c783a3606b9287404af66cc1142a40ab9fd2c2b3c628a9f8e7dc520149d2e9f

/home/rapa 는 host, /usr/local/apache2/htdocs 는 컨테이너로 볼륨 마운트

또 다른 네이버페이지 웹서버를 띄우고싶다면

rapa@rapa:~$ docker container run -d --name httpd88 -p 8888:80 -v /home/rapa:/usr/local/apache2/htdocs httpd

웹서버 html을 다른 걸로 바꾸려면

rapa@rapa:~$ echo "hello" > index.html

이후 다시 8080포트와 8888포트로 접속하면, hello가 뜬 html 페이지가 보이게 된다.

0개의 댓글