[KEDUIT] 클라우드 컴퓨팅과 보안솔루션을 활용한 DC 엔지니어 양성교육 - Day72
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
- ARP
- CDP / VLAN
- Frame Relay
- Static Routing
- VLAN
- VTP
- Routed Port
- AD
- Route Selection
- FHRP
- HSRP
- DHCP
- DNS
- STP
- NAT
- EtherChannel
- DTP
- RIP
- NTP
- Offset List
- Password Encryption
- ACL
- CAR Attack
- Broadcast
- Port Assignments
- IPv6 Static Routing
- HSRP for IPv6
- Clock Rate
- DHCPv6 Guard
- EIGRP
- Express Forwarding
- Routing and Switching
- Load Balancing
- Ping, Traceroute
- Load Balancing
- Fast Switching
- CEF
- DNS
- SSH
- Regular Expression
- OSPF
- EIGRP’s SIA
- NSSA
- AAA
- Understand the Zone-Based Policy Firewall Design
- The Cisco SD-WAN Solution
- Understand the Zone-Based Policy Firewall Design
2. Linux
- rhel9’s docs
- Linux Directory Structure
- File Types in Linux
- fstab
- Vim Cheat Sheet
- Protecting GRUB with a password
- SELinux
- DNS
- Samba as a server
- DHCP
- NFS
- SSH
- VNC
- heredoc
- docker vs podman + buildqh + skopeo
- Docker란?
- Linux 컨테이너란?
- Container vs VM
- 컨테이너화란?
- container
- 컨테이너 오케스트레이션이란?
- 쿠버네티스란?
- 쿠버네티스 아키텍처 소개
- 쿠버네티스 기본 사항 학습
- 쿠버네티스 클러스터란?
- Ansible과 Puppet: 알아야 할 사항
3. Docker
4. Web
- HTML’s Elements
- Emmet
- JavaScript
- Anchor Tag
- Post, Get
- Block, Inline Elements
- Semantic Web
- Semantic Elements
- CSS
- Viewport_meta_tag
- Media_queries
- JavaScript
5. DB
클라우드 엔지니어를 꿈꾸며 공부를 시작한 초보 엔지니어입니다. 틀린점 또는 조언해주실 부분이 있으시면 친절하게 댓글 부탁드립니다. 방문해 주셔서 감사합니다 :)
댓글남기기