2 분 소요

1. 서론

    오늘은 Docker의 다양한 활용법에 대해 배워보았다.

2. 본론

1. Docker

1. Docker Image(이미지)

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라 한다. 다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 실치 할 필요 없는 상태의 파일을 의미한다. 예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모-든 파일을 가지고 있으며, Oracle이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port정보 등을 모-두 가지고 있다.

- 따라서 도커 이미지의 용량은 보통 수백MB ~ 수GB가 넘는다. 하지만 가상머신의 이미지에 비하면 굉장히 적은 용량이다.
- 이미지는 상태 값을 가지지 않고 변하지 않는다(Immutable).
- 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음.
- 도커 이미지들은 github와 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포(push&pull)가 가능하다.
- 다양한 API가 제공되어 원하는 만큼 자동화가 가능하다.
- 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어진다.(그래서 누구나 이미지 생성과정을 확인할 수 있으며 수정도 할 수 있다)

2. 이미지와 레이어(Layer)

레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념이다. 이미지는 여러 개의 읽기 전용(read only) layer로 구성되고, 파일이 추가되면 새로운 Layer가 생성됨. 그리고 도커는 여러 개의 Layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다. 그래서 이미지와 레이어는 같은 의미로도 사용된다. 추가적으로 DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.

3. 도커 컨테이너(Docker Container)

이미지(Image)를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다.

- 컨테이너는 이미지 Layer에 읽기/쓰기(read-write) Layer를 추가하는 것으로 생성/실행된다. 따라서 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용되며, 바뀐 부분을 읽기/쓰기 Layer에 적음
- 컨테이너는 종료되었다고 메모리에서 삭제되지않고 남아있다. 삭제하려면 명시적으로 삭제해야 함. 즉, 종료가 되어도 컨테이너 & 읽기/쓰기 Layer 또한 그대로 존재하기 때문에 다시 시작할 수 있음.
- 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것. 예) DB라면 그동안 쌓였던 데이터가 모두 사라진다는 뜻과 동일.
- 한 서버는 여러 개의 컨테이너를 가져도 당연히 상관없으며, 컨테이너는 각각 독립적으로 실행된다.
- 컨테이너는 커널 공간과 호스트OS 자원(시스템 콜)을 공유한다.

출처

1. Docker Image
# docker run -it --name commit_test ubuntu:14.04
# exit
# docker ps -a
# docker commit commit_test commit_test:first //REPOSITORY:TAG
# docker save -o test.tar commit_test:first //파일로 만들기. /var/lib/docker/ 경로에 여러개로 쪼개져있는 파일을 취합해줌
# ls | grep test
# docker load -i test.tar
# docker image inspect commit_test:first //이미지 정보 자세히 확인
# docker history commit_test:first //레이어별 생성시간, 용량 등 확인
# docker run -it --name commit_test commit_test:first
2. Docker Hub
https://hub.docker.com/ 가입 후 repository 생성
# docker run -it --name commit_container1 ubuntu:14.04
# docker commit commit_container1 my-image-name:0.0
# docker images //verify
# docker tag my-image-name:0.0 keduittestuser/0518:0.0 //Docker hub 아이디/저장소 이름(미리 생성해도 되고 없으면 push할때 생성됨)으로 태그 생성
# docker images //verify
# docker login
# docker push keduittestuser/0518:0.0
//docker hub에서 확인
3. Dockerfile
# mkdir /temp/dockerfile
# cd /temp/dockerfile
# echo test >> test.html
# ls
# cd ..
# vim Dockerfile
FROM ubuntu:14.04
MAINTAINER keduit
LABEL "purpose"="practice"
RUN atp-get update
RUN apt-get install -y apache2
ADD dockefile/test.html /var/www/html
RUN ["/bin/bash", "-c", "echo hello >> /var/www/html/test2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
# docker build -t mybuild:0.0 ./
# docker images //verify
# docker run -d -P --name myserver mybuild:0.0
# docker port myserver //verify
//host pc web에서 아래 링크로 확인
http://10.10.51.57:32768/
http://10.10.51.57:32768/test2.html
3-1. Dockerfile with VOLUME
# vim Dockerfile
FROM ubuntu:14.04
MAINTAINER keduit
RUN mkdir /home/volume
RUN echo test >> /home/volume/testfile
VOLUME /home/volume
# docker build -t myvolume:0.0 ./
# docker run -itd --name volume_test myvolume:0.0
# docker volume ls
# docker volume inspect VOLUMENAME //mount point 확인
# cd /var/lib/docker/volumes/9fc8fc801f2a89b170a1b94cbff9ae436d90c006a25f35e908715549ee782233/_data
# ls
# cat testfile
3-2. Dockerfile with USER
//루트권한이 없는 특정 유저를 생성
# vim /temp/Dockerfile
FROM ubuntu:14.04
RUN groupadd -r author && useradd -r -g author keduit
USER keduit
# docker build -t myuser:0.0 ./
# docker run -it --name my_user myuser:0.0
# id

3. 결론

    Docker Hub는 Github처럼 편리하고 유용한 툴인것 같다.

4. 참고자료

1. Cisco Docs

  1. ARP
  2. CDP / VLAN
  3. Frame Relay
  4. Static Routing
  5. VLAN
  6. VTP
  7. Routed Port
  8. AD
  9. Route Selection
  10. FHRP
  11. HSRP
  12. DHCP
  13. DNS
  14. STP
  15. NAT
  16. EtherChannel
  17. DTP
  18. RIP
  19. NTP
  20. Offset List
  21. Password Encryption
  22. ACL
  23. CAR Attack
  24. Broadcast
  25. Port Assignments
  26. IPv6 Static Routing
  27. HSRP for IPv6
  28. Clock Rate
  29. DHCPv6 Guard
  30. EIGRP
  31. Express Forwarding
  32. Routing and Switching
  33. Load Balancing
  34. Ping, Traceroute
  35. Load Balancing
  36. Fast Switching
  37. CEF
  38. DNS
  39. SSH
  40. Regular Expression
  41. OSPF
  42. EIGRP’s SIA
  43. NSSA
  44. AAA
  45. Understand the Zone-Based Policy Firewall Design
  46. The Cisco SD-WAN Solution
  47. Understand the Zone-Based Policy Firewall Design

2. Linux

  1. rhel9’s docs
  2. Linux Directory Structure
  3. File Types in Linux
  4. fstab
  5. Vim Cheat Sheet
  6. Protecting GRUB with a password
  7. SELinux
  8. DNS
  9. Samba as a server
  10. DHCP
  11. NFS
  12. SSH
  13. VNC
  14. heredoc
  15. docker vs podman + buildqh + skopeo
  16. Docker란?
  17. Linux 컨테이너란?
  18. Container vs VM
  19. 컨테이너화란?
  20. container
  21. 컨테이너 오케스트레이션이란?
  22. 쿠버네티스란?
  23. 쿠버네티스 아키텍처 소개
  24. 쿠버네티스 기본 사항 학습
  25. 쿠버네티스 클러스터란?
  26. Ansible과 Puppet: 알아야 할 사항

3. Docker

  1. nextcloud
  2. cadvisor
  3. Dangling Image

4. Web

  1. HTML’s Elements
  2. Emmet
  3. JavaScript
  4. Anchor Tag
  5. Post, Get
  6. Block, Inline Elements
  7. Semantic Web
  8. Semantic Elements
  9. CSS
  10. Viewport_meta_tag
  11. Media_queries
  12. JavaScript

5. DB

  1. MySQL

클라우드 엔지니어를 꿈꾸며 공부를 시작한 초보 엔지니어입니다. 틀린점 또는 조언해주실 부분이 있으시면 친절하게 댓글 부탁드립니다. 방문해 주셔서 감사합니다 :)

댓글남기기