728x90
반응형

안녕하세요.

오늘 알아볼 내용은 도커 허브(Docker Hub)에 이미지 푸시 방법입니다!

 

 

주로 도커 이미지를 빌드하면 로컬 환경에서만 사용했지만, 다른 곳에서 실행하기 위해 이미지 레지스트리에 보관해야 합니다. 주로 쓰이는 레지스트리는 DockerHub 및 Quay.io, Google Container Registry 등이 있습니다. 오늘 할 내용은 DockerHub에 푸쉬하는 방법을 알아보고자 합니다.


먼저 시작 전에 준비물이 필요합니다. 
도커 셋업 환경 : Ubuntu 16.04 버전
도커 버전 : 18.09.4
도커 이미지 : Docker image(저는 여기서 Tomcat:latest라는 이미지를 사용했습니다.)

 

원리는 이렇습니다!

도커 허브 ID 생성 -> 이미지 태그 지정 -> 도커 이미지 Push 순서입니다.

정해진 순서는 딱히 없지만 전 위의 순서대로 진행해보고자 합니다.

 

1. 먼저, Push하고자하는 도커 이미지를 확인합니다. 

 

 

2. 도커 허브에 이미지를 올리려면 계정 생성이 필수입니다. 아래 링크를 클릭한다음,

   Sign up for Docker Hub를 클릭합니다.

   https://hub.docker.com/

 

3. Docker ID와 비밀번호 그리고 이메일 계정을 입력하고 continue를 클릭합니다.

4. 위에서 입력한 이메일로 가입 메일이 아래와 같이 발송됩니다.

 

5. 그리고나서 로그인을 진행하면 아래와 같이 화면이 뜨고, [Create a Repository]를 클릭합니다.

 

6. 레퍼지토리 생성 화면이 뜨는데, 저는 Private으로 한 번 만들어보겠습니다.

 

7. 아래와 같이 레퍼지토리가 생성되었으며 빨간색 네모박스에 가장 최근에 푸쉬된 내역이 없는 것을 확인할 수 있습니다.

 

8. 자, 그럼 위에서 언급했떤 도커 이미지 태그 생성을 시작해보겠습니다.

  docker tag {image명} {docker hub 아이디}/{레퍼지토리명}

  아래에 보시면 tomcat이라는 이미지를 위에서 생성한 도커 허브의 레퍼지토리에 올리기 위해 태그로 만듭니다.

  레퍼지토리명 대신 image명을 사용하셔도 무방합니다. 그러면, image이름으로 레퍼지토리가 자동으로 생성됩니다.

 

 

9. 그 다음은, 도커 허브에 로그인을 해야 합니다.

   docker login -u {도커아이디} 를 입력한 뒤 Password를 입력하면 아래와 같이 Login Succeeded를 확인합니다.

 

10. 마지막으로 docker push를 합니다.

    위에서 만든 태그를 통해 docker push {도커아이디}/{레퍼지토리명}을 입력하면 아래와 같이 push가 됩니다.

 

11. 도커 허브에 성공적으로 Push가 됐음을 확인할 수 있습니다.

감사합니다.

 

-끝-

728x90
반응형

'Development > Docker' 카테고리의 다른 글

도커 네트워크(Docker network) 길라잡이  (0) 2019.03.13
Docker 명령어 정리(기초편)  (0) 2019.03.11
728x90
반응형

안녕하세요. R-son입니다.

오늘 알아볼 내용은 바로 도커 네트워크입니다.

도커(Docker)는 다들 한 번쯤 들어보셨죠?!

 

도커(Docker)의 정의에 대해서 잠깐 집고 갈까요?


도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

도커는 호스트 서버 위에 도커 엔진을 설치하고 그 엔진 위에 컨테이너(격리된 프로세스 공간)를 실행한다.

잠깐 VMWare와 비교 설명을 해드리겠습니다.

, VMwareVirtual Machine은 호스트 서버 위에 게스트 서버를 두는 구조이지만

도커는 호스트 서버 위에 도커 엔진이라는 친구를 둡니다. 그리고 도커 엔진 위에서는 이미지가 담긴 컨테이너(독립적인 프로세스 공간)들을 올리는 구조입니다.

[여기서 이미지란 프로그램이나 환경설정 등의 정보가 담긴 그릇이라고 생각하면 됩니다.]

 

그럼 도커에 대해서는 간략히 설명하고 본론인 도커 네트워크에 대해서 살펴볼까합니다.

오늘은 3가지(브릿지 네트워크, 오버레이 네트웤, macvlan) 중에서 하나인 브릿지 네트워크를 알아보려고 합니다.

 

도커 브릿지 네트워크는 하나의 서버 머신 환경에서 여러 개의 컨테이너를 연결할 때 사용하는 네트워크를 의미하는데 리눅스의 네트워크 브릿지의 개념을 적용한 네트워크 방식입니다.


리눅스 네트워크 브릿지를 잠깐 설명드리면, 브릿지 안에는 여러 개의 포트들이 있고 그 포트들에 NIC들이 아래와 같이 연결되어있습니다., 브릿지는 각 포트에 대한 NICMAC주소를 테이블에 저장하고 있습니다.(1 참고)

1

PORT-1

a0:8e:17:45:11:3e

PORT-2

a0:8e:17:50:2b:6c

PORT-3

 

PORT-4

a0:8e:17:45:45:6a

 

이와 더불어 필요한 것이 MAC주소와 IP를 매핑하는 arp 테이블이 필요합니다. 예를 들어서 NIC-2의 컴퓨터 OS는 아래와 같은 arp 테이블 정보를 가지고 있습니다.(2 참고). 

2

IP 주소

MAC Address

172.17.0.3

a0:8e:17:50:2b:6c

172.17.0.4

a0:8e:17:45:45:6a

 

, NIC-1에서 172.17.03으로 패킷을 보내면 ARP테이블에서 MAC주소를 찾고 이를 OS에서 패킷에 MAC주소를 설정해서 브릿지에 보냅니다. 그러면 브릿지의 테이블(1)에서 MAC주소를 찾아 해당 포트로 패킷을 보내는 구조입니다. 조금 복잡하지만 하나씩 천천히 읽어보면 리눅스 브릿지 네트워크를 이해할 수 있을 겁니다.



 

도커의 브릿지 네트워크는 위에서 배운 리눅스 브릿지 네트워크를 활용합니다.

NIC가 도커에서는 컨테이너가 되구요~


 

. 그럼 다시 도커로 돌아와서, 도커의 브릿지 네트워크를 보겠습니다.

도커를 실행해서 #ifconfig docker0을 입력하면 브릿지 인터페이스를 확인 할 수 있는데요Docker0이 위에서 봤던 브릿지입니다.

여기서 컨테이너를 만들면 가상 인터페이스가 docker0에 연결됩니다.




연결 정보는 아래의 명령어를 통해서 확인할 수 있습니다. 저는 3개를 만들었어요~ 

※ interfaces 아래에 보시면 3개의 veth들이 보이는데, veth는 하나를 브릿지에 연결하고 다른 하나를 컨테이너에 연결합니다.

Brctl-utils를 이용해서도 확인할 수 있습니다.

#Brctl show docker0



그럼 연결된 정보를 상세히 보려면 #ifconfig 명령어를 통해서 볼 수 있습니다.

veth1~~, veth5~~, veth9~~ 보이시죠?!




컨테이너와 브릿지가 서로 연결되었네요

그럼 컨테이너들은 어떻게 외부와 통신할 수 있을까요?

그건 바로 IP 마스커레이드(Masquerade)가 가능하기 때문입니다. 마스커레이드는 NAT(네트워크 주소 변환)이라고도 불립니다

, 패킷 출발지 IP(Private IP)iptables를 이용해서 호스트가 가진 Public IP로 변환한 다음에 외부로 보냅니다.

Ex) 컨테이너 내 IP가 172.17.0.2에서 외부로 패킷이 나갈 때, iptables에서 공인IP(XXX.XXX.XXX.XXX)로 나갑니다.


Iptables –t nat –L을 통해 마스커레이드 설정을 확인할 수 있습니다.

#iptables –t nat –L

아래 이미지에서 MASQUERADE(마스커레이드) 설정을 확인할 수 있습니다. 


반대로 외부에서 내부 컨테이너로 어떻게 통신이 될 수 있을까요?

포트 포워딩(Port forwarding)이 있어 가능합니다!. 포트 포워딩이란 외부에서 공인IP의 특정 포트로 들어오는 패킷을 내부 네트워크로 보내는 기능입니다.


예를 들어, 공인IP(XXX.XXX.XXX.XXX:8000)으로 들어올 경우, iptables에서 8000을 내부 컨테이너 IP 172.17.0.3:80로 포워딩시켜줄 수 있습니다.

아래 이미지에서 DNAT(Destination NAT) 설정을 확인할 수 있습니다. DNAT는 포트포워딩이라고 보셔도 무방합니다.



도커에서는 -p 옵션을 사용하여 포트포워딩을 설정해줄 수 있습니다.

예시) #docker run -p 8000:80 -it ubuntu /bin/bash


기타 궁금하신 점은 댓글 부탁드려요~





728x90
반응형

'Development > Docker' 카테고리의 다른 글

도커 허브에 이미지 푸시 방법  (0) 2019.04.03
Docker 명령어 정리(기초편)  (0) 2019.03.11
728x90
반응형

안녕하세요. r-son입니다.


오랜만에 인사드리네요.


오늘은 도커(docker) 명령어에 대해서 간략히 알아볼까해요


그럼 아래 표를 보시죠~!


기능

명령어

도커 정보 확인

Docker info

도커 버전 확인

docker version

컨테이너 목록 확인

Docker ps

Ex) docker ps -a (중지된 컨테이너)

Ex) docker ps (실행 중인 컨테이너)

컨테이너 실행하기

Docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG…]

Ex) docker run ubuntu:16.04

Ex) docker run --rm -it ubuntu:16.04 /bin/bash

  /bin/bash 명령어를 통해 ubuntu:16.04 컨테이너 실행

  컨테이너 내부로 들어가기 위해 bash 실행 키보드 입력을 위해 -it 옵션을 부여

  추가적으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm 옵션 부여

Ex) docker run -d -p 1234:6379 redis

  redis 메모리기반의 다양한 기능을 가진 스토리지. 6379포트로 통신하며 telnet 명령어로 테스트 가능(telnet localhost 1234)

  redis 컨테이너는 detached mode(백그라운드 모드) 실행하기 위해 -d 옵션을 추가하고 -p 옵션을 추가하여 컨테이너의 포트를

  호스트의 포트로 연결한다.

  -d 옵션이 없다면 프로세스가 폴그라운드로 실행되어 아무키도 입력할 없으며 컨테이너 종료는 ctrl+c 입력한다.

  -d 옵션을 줘서 컨테이너의 ID 보여주고 바로 쉘로 돌아왔다. 컨테이너는 종료된 것이 아니라 백그라운드 모드로 동작

  -p 옵션을 이용하여 호스트의 1234포트를 컨테이너의 6379 포트로 연결하였고 localhost 1234 포트로 접속하면 redis 사용할 있다.

Ex) docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql \ mysql:5.7

  mysql -h127.0.0.1 -uroot

  -e 옵션은 환경변수를 설정하고 --name 컨테이너에 읽기 어려운 ID대신 쉬운 이름을 부여한다.

  -e 옵션 패스워드 없이 root 계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD 환경변수를 설정한다.

Ex)

# before
docker run -d -p 3306:3306
\
  -e
MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql
\
  mysql:5.7

# after
docker run -d -p 3306:3306
\
  -e
MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql
\
  -v /my/own/datadir:/var/lib/mysql
\ # <- volume mount
  mysql:5.7

 

  -v 옵션은 호스트의 디렉토리를 마운트해서 사용하는 방법 : MysQL이라면 /var/lib/mysql 디렉토리에 모든 데이터베이스 정보가 담기므로

   호스트의 특정 디렉토리를 연결해주어야 한다. 위의 샘플은 호스트의 /my/own/datadir 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로

   마운트하였다. 이제 데이터베이스 파일ㅇ느 호스트의 /my/own/datadir 디렉토리에 저장되고 컨테이너를 삭제해도 사라지지 않는다.

 

컨테이너 중지하기

Docker stop [OPTIONS] CONTAINER [CONTAINER…]

Ex) docker stop ${CONTAINER_ID}

컨테이너 제거하기

Docker rm [OPTIONS] CONTAINER [CONTAINER…]

Ex) docker rm ${CONTAINER_ID}

Ex) docker rm -v $(docker ps -a -q -f status=exited)  -- 중지된 컨테이너 ID 가져와서 한꺼번에 삭제

컨테이너 로그 보기

Docker logs [OPTIONS] CONTAINER

Ex) docker logs --tail 10 ${CONTAINER_ID}

Ex) docker logs ${CONTAINER_ID}

 

컨테이너 명령어 실행하기

Docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

Ex) docker exec -it mysql /bin/bash

이미지 목록 확인

Docker images [OPTIONS] [REPOSITORY[:TAG]]

Ex) docker images

이미지 다운로드(pull)

Docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Ex) docker pull ubuntu:14.04

이미지 삭제하기(rmi)

Docker rmi [OPTIONS] IMAGE [IMAGE…]

Docker rmi ${IMAGE_ID}


728x90
반응형

'Development > Docker' 카테고리의 다른 글

도커 허브에 이미지 푸시 방법  (0) 2019.04.03
도커 네트워크(Docker network) 길라잡이  (0) 2019.03.13

+ Recent posts