Application Modernization/Container & PaaS

Docker 개념

Cloud Applicaiton Architect 2021. 9. 7. 08:58
반응형

이 포스팅은 필자 소유의 네이버 블로그에 작성된 2019년도의 글을 리포스팅한 글입니다.

 

Docker는 LXC(리눅스 컨테이너)라는 커널 컨테이너 기술을 이용해 만든 컨테이너 기술 중의 하나입니다. 물론 Docker를 LXC와 동일선상에서 비교하는 것은 무리가 있으며 최근에는 VM(Virtual Machine) 보다 경량화된 서버 구동 체제로 각광을 받고 있습니다. 특히 클라우드 환경의 확산과 더불어 그 활용도가 더 증가되고 있습니다.

 

Docker의 특징

  • 컨테이너는 이미 오래된 기술이다.(리눅스의 LXC, Solaris Zones, BSD Jails등)
  • 그럼 이 오래된 기술 대비 Docker 컨테이너의 장점은?
    1. 손쉬운 사용을 위한 툴
    2. 재사용 가능한 컴포넌트
    3. 현존하는 대부분의 Linux 서버에서 구동: 물리, 가상, 클라우드 등
Portable - 손쉬운 이식성
- 이미지 기반 배포, 버전 관리
- 어느 곳이나 동일한 운영환경 제공
- 동일한 개발,테스트,운영 환경 제공
Flexible - 유연성 제공
- 명확하고 재사용 가능한 모듈화 환경 제공
- 마이크로서비스 환경 제공을 통한 복잡성 제거와 신속한 개발성 제공
Fast - 가벼운 실행 환경
- 신속한 개발, 빌드 , 배포 환경 제공
Efficient - 필요한 리소스만 배포
- OS Kernel & Libs를 공유하여 사용하는 효율성 제공

 

Docker 아키텍처

  • Client : 도커 Container를 관리하고 실행하기 위해서 Deamon과 상호작용하는 Binary 파일입니다.
  • Registry : 도커 Image가 저장되어 있는 장소이다. 대표적으로 Docker Hub가 있습니다. Registry는 Public Registry와 Private Registry가 있습니다.
  • Daemon : Host에 설치되어 도커 Container를 관리하는 daemon 프로세스이다. Client와 상호 작용합니다.
  • Image : 도커 Daemon을 통해 Container로 실행 가능하도록 필요한 프로그램, 라이브러리, 소스 등이 설치된 파일입니다.
  • Container : Image를 실행한 상태입니다.

 

[Docker Architecture]

 

 

Docker vs VM

VM과 Container의 비교

  • VM 대신 컨테이너의 운용 비용이 더 효율적입니다. (License 비용 절약)
  • VM 대비 컨테이너는 Host컴퓨터 입장에서 Memory/Disk/CPU 등의 자원을 절약할 수 있습니다.
  • VM대비 더 빠르게 비즈니스에 적용할 수 있습니다.(Light Weight)

 

Docker의 종류

1. 오픈소스 무료 버전(CE: Community Edition)

2. 유료버전 (EE: Enterprise Edition) – 연간 1,000달러

 

Docker 설치

https://www.docker.com/products/docker-desktop 에서 Download for windows

윈도우 버전 설치는 별도의 선택 없이 기본으로 하시기 바랍니다.

※Docker for Windows를 설치 조건

  • Windows 10 Pro 혹은 Enterprise Edition(64bit)
  • Virtual Box, VMWare등 기능 Disable
  • Windows Hyper-V Enable(제어판→프로그램 및 기능→Windows 기능 켜기/끄기]→[Hyper-V]체크)

Docker for Windows Proxy 설정

Docker를 사용하시는 시스템의 환경이 Proxy 설정이 필요하다면 Proxy 설정을 별도로 하셔야 합니다.

Docker for Windows의 설치가 완료되었다면 윈도우 작업 줄(Task bar)에서 Docker 설정을 클릭합니다.

[Docker Desktop Icon]

 

[Settings 선택]

 

Proxies 설정 메뉴를 클릭해 사용하고 계신 Proxy 환경을 입력하고 'Apply'를 클릭해 설정 완료하도록 합니다.

 

Docker 설치 버전 확인

  1. 클라이언트는 윈도우로 설정된 걸 볼 수 있습니다.
  2. 서버는 linux로 설정되어 있음을 알 수 있습니다. 즉 윈도우 환경에서 서버(도커엔진)는 vm으로 기동 중입니다.

 

Docker 기본 명령어 (버전, 정보, 실행)

  • docker –-version (버전 보기)
C:\Users\FKL>docker --version
Docker version 18.09.1, build 4c52b90
  • docker info(현재의 도커 상태에 대해 정보 표시)
C:\Users\FKL>docker info
Containers: 52
Running: 36
Paused: 0
Stopped: 16
Images: 12
Server Version: 18.09.1
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
...

  • Docker run
    1. docker run [수행할 이미지] (이미지명에 해당하는 이미지를 컨테이너로 실행합니다.)
    2. docker-hub로부터 hello-world라는 이미지를 다운로드합니다.
    3. 이미지를 컨테이너에 적재해 실행합니다.

 

Docker 관리 명령어

docker search [image name]은 docker image를 검사함
docker pull [image name]은 docker image를 다운로드 함
docker run [image name]은 image를 실행하는 컨테이너를 만듦
docker stop [container id]는 생성된 container를 정지 시킴
docker start [container id]는 정지된 containe를 시작
docker rm [container id]는 containe를 삭제
docker images는 레파지토리에 있는 모든 image 표시
docker rmi [image id/혹은 name]는 도커 이미지를 삭제
docker commit [컨테이너 id/이름] [새로운 이미지 이름] 지금까지 변경한 컨테이너를 새로운 이름의 이지로 변경해서 로컬 레파지토리에 등록
docker save -o [저장할 이미지명 파일명] [이미지id/name] 레파지토리에 있는 이미지를 파일로 저장
docker load -i [저장된 이미지명 파일명] 디스크에파일로 저장된 이미지 파일을 도커에 업로드
docker tag [등록되어 있는 이미지 명] [변경을 원하는 이미지명] 이미지 이름 변경
docker ps 는 실행중인 container 정보 표시
docker ps -a는 탑재된 모든 container 정보 표시
  • docker search [이미지 이름] (찾고자 하는 Docker 이미지를 레파지토리에서 검색)
C:\Users\FKL>docker search tomcat8
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
rossbachp/apache-tomcat8 21 [OK]
ashince/tomcat8 Tomcat GUI Manager pre-configured docker ima… 5
bpatterson/centos7-tomcat8 CentOS7 w/ Tomcat8 4 [OK]
podbox/tomcat8 3 [OK]
zwindler/xwiki-tomcat8 Latest version of Xwiki on Tomcat 8 and Java… 1 [OK]
xiaofengdi/tomcat8 基于jre8的tomcat8. 1 [OK]
oobsri/tomcat8 Testing CI Jobs with different names. 0
jelastic/tomcat8 DEPRECATED. Please, refer to the jelastic/to… 0
tplatform/java7-tomcat80 java7-tomcat80 0 [OK]
cloudbourne/tomcat8-helloworld Sample image with HelloWorld running on Tomc… 0
bskim1029/tomcat8 0
micwy/docker-alpine-tomcat8-openjdk8-service Base image for tomcat8/openjdk8 services 0 [OK]
dockerbase/tomcat8 Docker Base: Tomcat8 - https://github.com/do… 0 [OK]
touche/tomcat8 0
eviles/alpine-tomcat8 Tomcat8 0 [OK]
slpcat/tomcat8 0
junbowang/tomcat8-sshd docker image for tomcat8 with sshd enabled. 0
anspfeifer/tomcat8 image para tomcat8 0
hidetarou2013/debian-tomcat8 debian-tomcat8 0 [OK]
l2as/tomcat8 Image Tomcat8 0 [OK]
socialpro/tomcat8 Docker tomcat8 image 0
qount/java8-tomcat8 0
hidetarou2013/ubuntu-tomcat8 ubuntu-tomcat8 0 [OK]
rabbitsoft/tomcat8-redis-session-valve
  • docker pull [이미지 이름] (다운 받고자 하는 도커 이미지 이름)
C:\Users\FKL>docker pull rossbachp/apache-tomcat8
Using default tag: latest
latest: Pulling from rossbachp/apache-tomcat8
a3ed95caeb02: Pull complete
23efb549476f: Pull complete
0d9f4e76aedc: Pull complete
4d32ca89bca8: Pull complete
8d3fc817f1fe: Pull complete
8877cf57f1c6: Pull complete
1c48ced7cea0: Pull complete
73f2e7095120: Pull complete
e4239c859f77: Pull complete
a215d50b4fa4: Pull complete
87427b9c8ecc: Pull complete
782514f86e80: Pull complete
Digest: sha256:03f71c863c01162bb8e965e136c733dcf7d503c258a7812b9405b9f94bf1540d
Status: Downloaded newer image for rossbachp/apache-tomcat8:latest
  • docker run [옵션] [이미지 이름]
    (컨테이너 생성// 이렇게 생성된 rm으로 삭제하기 전까지는 계속 존재, 정지시 stop 기동시 start)
C:\Users\FKL>docker run -d -i -p 8081:8080 rossbachp/apache-tomcat8
=> Creating and admin user with a random password in Tomcat
=> Done!
========================================================================
You can now configure to this Tomcat server using:
admin:viRAO169ARVY
========================================================================
Checking *.war in /webapps
Checking tomcat extended libs *.jar in /libs
12-Feb-2019 04:18:56.194 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
12-Feb-2019 04:18:56.343 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
12-Feb-2019 04:18:56.363 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]t/tomcat/webapps/manage
-d :컨테이너를 데몬 형태로 실행
-i:표준 입출력을 지원하여 컨테이너와 연결되어 있지 않더라도 표준 i/o 유지
-p 8081:8080 컨테이너 안에서 설정된 톰켓의 포트 8080을 컨테이너 외부에서 8081로 접근하다는 의미
-name “이름명” 컨테이너 생성시 이름을 줄 수 있습니다.


위 컨테이너가 정상적인 스타트가 되면 웹 브라우져를 이용해 http://localhost:8081/manager 로 접근해 보세요
  • docker stop [컨테이너 id] (컨테이너 정지)
C:\Users\FKL>docker stop 4cfce9045d44
4cfce9045d44
  • docker ps /docker ps -a (실행 중인 컨테이너 정보 표시/등록된 모든 컨테이너 정보 표시)

 

  • [docker ps -a를 통해 컨테이너 id 혹은 컨테이너 이름을 확인할 수 있다]
docker stop/start [컨테이너 id]] (컨테이너 정지/실행, 뒤에 id는 docker ps -a로 알수 있다.)
C:\Users\FKL>docker start 66f208b8fe33
66f208b8fe33
C:\Users\FKL>docker logs 66f208b8fe33
=> Creating and admin user with a random password in Tomcat
========================================================================
You can now configure to this Tomcat server using:
admin:viRAO169ARVY
========================================================================
Checking *.war in /webapps
Checking tomcat extended libs *.jar in /libs
12-Feb-2019 04:18:56.194 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
12-Feb-2019 04:18:56.343 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
12-Feb-2019 04:18:56.363 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
...

 

  • docker rm [컨테이너 id] (컨테이너 삭제)
C:\Users\FKL>docker rm 4cfce9045d44
4cfce9045d44
...
  • docker rmi [이미지 이름] (이미지 삭제 단, 삭제할려는 이미지가 사용되는 컨테이너가 먼저 삭제 되어 있어야 한다.)
C:\Users\FKL>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 6 weeks ago 1.84kB
C:\Users\FKL>docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
  • docker commit [컨테이너 id/이름] [새로운 이미지 이름] 지금까지 변경한 컨테이너를 새로운 이름의 이지로 변경해서 로컬 레파지토리에 등록
C:\Users\FKL>docker images |findstr tomcat
rossbachp/apache-tomcat8 latest 46366e17bce2 4 years ago 584MB
C:\Users\FKL>docker commit d140dc88b8c7 rossbachp/apache-tomcat8-20190212
sha256:cb90528161beef5eecf91efb3051621ee27e09fb39072bf95b64acc6688ef55f
C:\Users\FKL>docker images |findstr tomcat
rossbachp/apache-tomcat8-20190212 latest cb90528161be 16 seconds ago 585MB
rossbachp/apache-tomcat8 latest 46366e17bce2 4 years ago 584MB
C:\Users\FKL>
  • docker save -o [저장할 이미지명 파일명] [이미지id/name] (레파지토리에 있는 이미지를 파일로 저장)
C:\Users\FKL>docker save -o tomcat8.tar rossbachp/apache-tomcat8-20190212
C:\Users\FKL>dir tomcat8.tar
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 985C-8D25
C:\Users\FKL 디렉터리
2019-02-13 오전 10:41 598,327,808 tomcat8.tar
1개 파일 598,327,808 바이트
0개 디렉터리 106,046,525,440 바이트 남음

 

Docker 활용 명령어

docker inspect [컨테이너 id/이름] (ip, port, 이미지 정보 등 컨테이너 내부 정보를 표시해 줍니다.)
docker exec -ti [컨테이너 id/이름] (bin/bash 컨테이너 내부의 쉘로 접근합니다.)
docker cp [컨테이너 id/이름]:/[파일경로]/[파일명] [호스트 컴퓨터 경로]/[파일명] (컨테이너 내부의 파일을 호스트 컴퓨터로 복사해 옵니다. [호스트 컴퓨터 경로]/[파일명] [컨테이너id]:/[파일경로]/[파일명] 하면 호스트컴퓨터의 파일을 컨테이너 내부로 복사합니다.)
docker mount (docker의 mount는 컨테이너 외부의 host컴퓨터의 디스크를 컨테이너 내부에서 사용할 수 있도록 마운트하는 기술입니다. 로그파일, 첨부파일, 데이터파일 혹은 소스파일들을 외부로 뺴서 컨테이너를 최대한 경량화해 사용 할 수 있습니다.)
* docker mount는 실습을 통해 알아 보도록 하겠습니다.
  • docker inspect [컨테이너 id/name] (지정된 컨테이너의 내부 ip,port등을 정보를 표시합니다.)
C:\Users\FKL>docker inspect d140dc88b8c7
[
{
"Id": "d140dc88b8c7c5d9f54c0fee837ce8e60c5fe607156ca08f35a7141c9f91dd45",
...
},
"Image": "sha256:46366e17bce2471686f4e4b7737560d910b6bec2a3de99c52ae7958fa0df9c53",
...
"PortBindings": {
"8080/tcp": [
{
"HostIp": "",
"HostPort": "8080"
...

  • docker exec -ti [컨테이너 id/name] /bin/bash (지정된 컨테이너의 내부 쉘로 /bin/bash로 접근합니다.)
C:\Users\FKL>docker exec -ti d140dc88b8c7 /bin/bash
tomcat@d140dc88b8c7:/opt/tomcat$ ls
LICENSE NOTICE bin conf lib logs temp webapps work
tomcat@d140dc88b8c7:/opt/tomcat$ cd webapps
tomcat@d140dc88b8c7:/opt/tomcat/webapps$ ls
manager tutorial1 tutorial1.war
tomcat@d140dc88b8c7:/opt/tomcat/webapps$ exit
exit
C:\Users\FKL>
  • docker cp [컨테이너 id/이름]:/[파일경로]/[파일명] [호스트 경로]/[파일명] 컨테이너 내부의 파일을 호스트 컴퓨터로 복사해 옵니다.반대의 경우 host의 파일을 복사해 넣음
C:\Users\FKL>docker cp d140dc88b8c7:/opt/tomcat/webapps/tutorial1/a.jsp ./
C:\Users\FKL>dir a.jsp
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 985C-8D25
C:\Users\FKL 디렉터리
2008-07-20 오전 01:50 20 a.jsp
1개 파일 20 바이트
0개 디렉터리 107,177,545,728 바이트 남음
C:\Users\FKL>
  • docker -stats (도커의 CPU, Memory 등의 사용량을 보여줍니다.)

 

Docker의 개념 및 간단한 조작 명령어는 여기까지 하겠습니다.

다음 회차에서는 WAS와 DB 등을 이용한 실습을 통해 Docker의 활용법을 알아보도록 하겠습니다.

 

감사합니다.

- PS

Container 실행 명령어 요약
docker run -d --name=<container name> --net=host --restart=always -p host_port:container_port v /host_volume:/container_volume -e VERSION=latest <image name> <additional command>

반응형