문자열 - 아호 코라식(Aho-Corasick)
아호 코라식(Aho-Corasick)에 대해 알아보자.
docker를 이해해보자
프로젝트를 제대로 배포해보지 않은 입장에서 docker는 뭔가 개념자체가 잘 와닿지 않았다. 그래서 직접 정리를 하며 docker, k8s, jenkins에 대해 각각 한페이지짜리 정리를 해보려한다.
일단 내가 어떤 Web Service를 개발했는데, 이것이 누군가의 환경에서는 동작하지 않을 수가 있다. 이는 여러 이유가 있겠지만, 한마디로 dependencies가 달라서라고 할 수 있다.
매우 쉬운 예시로, 파이썬으로 Hello world를 출력하는 프로그램을 만들었는데 다른 컴퓨터에서 실행하려니 파이썬이 안깔려있는 상황인 것이다.
그래서 등장한 것이 Containerization이다.
Docker는 Docker사의 Container engine을 뜻한다. Container engine이라는 것은 OS level에서 virtualization을 해서 software package를 deliver하는 것을 뜻한다.
각 환경에 따른 가상머신에 앱을 설치하고 실행하는 것이 아닌 OS와 interface한 container라는 곳에서 앱을 실행시킨다.
VM은 메모리 점유가 심하고, 부팅 시간이 느리며 성능저하도 있다. 또한 VM사이에서 데이터 공유도 힘들다. 반면 container를 사용하면 이 모든 단점이 해결된다.
container engine에는 OS kernel같은게 있는 것이 아니다. 저런 image를 가지고 어디든 가서 앱을 실행시킬 수 있게 된다.
그럼 여기까지 보면 image와 container의 차이가 헷갈리게 된다.
이 그림을 보면 image와 container의 차이를 잘 느낄 수 있다. image는 정적인 파일이다. 그러니깐 정적인 코드를 지니고 있다. image를 가지고 containerization platform에 가면 run시킬 수 있는 것이다. 즉, template의 역할을 한다. (app code, sw system, os)
container = running instance of an image
image는 레시피, container는 만들어진 요리가 된다.
container는 stop, delete할 수 있는데 stop하면 먹다가 냉장고에 넣는 것이고 delete면 다 먹었거나 버린 것이 되겠다.
Docker hub에는 매우 많은 image들이 떠돌아 댕기고 있다. 가져와서 나의 컴퓨터에 컨테이너를 내리고 앱을 실행시킬 수 있다.
docker pull ubuntu
docker images # 내게 있는 이미지들을 볼 수 있다.
docker run -it -d ubuntu
#1. `-i` (interactive): 컨테이너가 실행되는 동안 입력을 받을 수 있게 합니다.
# 2. `-t` (tty): 이 옵션은 가상 터미널을 할당합니다. 이것은 `-i` 옵션과 함께 사용되어야 하며, 인터랙티브 쉘 세션을 가지기 위해 필요합니다.
# 3. `-d` (detached): 이 옵션은 컨테이너를 백그라운드에서 실행하도록 합니다.
docker ps # 실행되고 있는 컨테이너들을 확인할 수 있다.
# exec
docker exec -it <container id> <prompt in the container>
# container에 있는 bash shell을 실행할 때 쓴다.
# stop
docker stop <container id>
docker kill <container id>
docker ps -a
# remove (container와 image 지우기)
docker rm -f <container id>
docker rmi -f <image id>
위의 그림에서 docker file만 다루지 않았다. docker hub에서 가져올 수만 있다면 내가 원하는 기능을 찾지 못할 수도 있다. docker file은 docker image를 만들기 위해 실행하는 command 들을 모아 둔 text 파일이다.
예시에 주석을 달아서 설명하겠다.
# base이미지로 ubuntu를 사용
FROM ubuntu
# Update package lists
RUN apt-get update
#이는 docker run과는 전혀다른 RUN이다. 명령어를 보면 알 수 있다.
# intall Apache2
RUN apt-get install -y apache2
# Add files 현재 디렉토리에서 <dest in container>로 파일 복사 (Copy)
ADD . /var/www/html
# Expose port 80 for HTTP traffic
EXPOSE 80
# Start Apache2 in the foreground
ENTRYPOINT ["apache2ctl", "-D", "FOREGROUND"]
마지막 ENTRYPOINT를 조금 설명해보겠다. CMD라는 명령으로 container 안에서 실행하려는 command를 써둘 수 있는데 ENTRYPOINT를 쓰면 이와 유사하지만 다른 command를 입력해서 docker file의 CMD에 지정된 명령을 생략할 수 없게 할 때 사용한다.
위 dockerfile을 image로 만드는 것은 어떻게 하는가?
vi dockerfile #이름은 반드시 dockerfile이여야한다.
docker rm -f <existing container>
docker build -t <image name> # 이 과정이 image를 dockerfile로부터 만드는것이다.
docker run -it -p <hostport:containerport> -d <image>
docker rm -f <exeisting container>
# port 80에 충돌이 생기지 않게 하기 위해서
p는 published로 호스트 port와 container port를 mapping할 때 쓴다. 외부에서 컨테이너에 접근할 수 있게 된다.
여기까지 어찌저찌 이해했다. 근데 만약에 앱을 실행할 때 변경사항을 저장할 필요가 있다면 어떨까? 특히 DB를 사용하는 컨테이너라면 저장이 필수일것이다.
컨테이너는 read-only app으로 사용하는게 기본이다. 왜냐면 컨테이너 각자가 자신만의 OS자원, DRAM영역, cpu시간을 가지고 있고 디스크 같은 persistent storage를 사용하지 않기 때문이다.
여기서 persistent storage를 사용하기 위해 이를 host machine에서 mount해온다. 이것이 docker volume이다.
하지만 이 행위는 보안의 입장에서는 안 좋을 수 있다.
docker container는 하나의 image만을 실행하는 것이 원칙? 권장된다. 따라서 container들을 여러개가 같이 실행되는 때가 더 많을 것이다. 여기서 docker compose가 등장한다. 이 것은 docker-compose.yml 파일을 실행, 중지, 제거 하는 도구다. docker-compose.yml에는 한 개 이상의 container를 규정하고 run하는 내용이 담겨있다.
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example
위와 같은 파일을 만들고
yml파일에 volume 적용되어 있으면 알아서 잘 저장 될 것이다.
compose를 하려면 docker container들 사이에 연결이 있어야한다. 즉, 서로 네트워크로 연결되어 통신해야한다는 것이다.
도커가 해준다.
1) bridge– default– virtual L2 switch - each container has its own private IP address
2) host– host의 네트워크와 동일한 네트워크 사용
3) overlay– docker swarm service 네트워크 – conventional overlay network (i.e., conventional virtual network)
4) macvlan– MAC 주소에 대한 완전한 제어 제공 – each container has its own MAC address+IP address
5) ipvlan– IP 주소 사용에 대한 완전한 제어를 제공 – each container has its own IP address sharing MAC with others
6) none– no network interface provided for full customization
컨테이너의 목적을 생각해보자. “단일 호스트 (VM 포함) 에서 서로 독립적으로 분리 운영되는 프로세스 그룹을 만드는 것 (VM을 만드는 것이 아님)” 이를 위해서 namespace와 cgroup 위에 docker container가 만들어진다.
process trees, network interfaces, user IDs, filesystem mounts 등 시스템 요소들의 경계를 긋고 제한하는 mechanism이다.
Cgroups는 각 프로세스 그룹에 OS 자원을 배정하고 측정하는 커널 장치 Cgroups를 사용하여 CPU time, network, memory, block io 같은 자원을배정 namespaces에 cgroups를 적용하여 일단의 프로세스들을 container로 구성하여 해당 프로세스들만의 virtual 시스템 구현
아호 코라식(Aho-Corasick)에 대해 알아보자.
docker를 이해해보자
2060 염소줄서기 풀이 및 코드
분할정복을 이용한 다이나믹 프로그래밍 최적화
코드포스 다시 열심히! 블로그도 열심히!
rust 공부시작!
코드포스 블루 달성 후기
여름캠프 및 SUAPC 후기
2023-05-25-Edu Codeforce round 149 (Div.2)
2023-05-13-Edu Codeforce round 148 (Div.2)
HLD(Heavy Light Decomposition)
행렬 거듭 제곱
2023-05-02-It takes two
Codeforce round 868 (Div.2)
2월 11일 문제풀이
Codeforces#846, TypeDB Foreces 2023, Codeforces#848 업솔빙
ps5 게임 : 용과같이 제로 리뷰
백준 23877번 Convoluted Intervals 문제풀이
codeforce round #828(div 3), EDU #137(div 2) 업솔빙
codeforce round #823(div 2), #824(div 2) 업솔빙
AtCoder Beginner Contest 270 업솔빙
ps5 게임 : 용과같이 극 1 리뷰
백준 18719번 Binomal 문제풀이
백준 14288번 회사문화4 문제풀이
백준 3308번 Matching 문제풀이
백준 18186번 라면사기(large) 문제풀이
백준 4196번 도미노 문제풀이
백준 3176번 도로 네트워크 문제풀이
백준 16367번 TV Show Game 문제풀이
ps5 게임 : 페르소나 5 더 로열 리뷰
codeforce round #811(div 3), #812(div 2), CodeTon round 2 업솔빙
백준 21162번 뒤집기 K 문제풀이
codeforce round #808(div 2), #803(div 2, virtual) 업솔빙
codeforce round #807(div 2) 업솔빙
백준 10167번 금광 문제풀이
codeforce round #805(div 3), #806(div 4) 업솔빙
백준 18253번 최단경로와 쿼리 문제풀이
에듀 라운드 131 업솔빙
백준 1949번 우수 마을 문제풀이
백준 3665번 최종 순위 문제풀이
Trie 자료구조 이해하기
merge sort를 이용하여 inversion 개수세기
3솔의 벽이 너무 높다..
lazy propagation없이 구간 갱신하기
코드포스 폭망기념 upsolving
백준 11505 구간 곱 구하기 문제풀이
백준 1305 광고 문제풀이
백준 4386 별자리 만들기 문제풀이
백준 4803 트리
백준 2206 벽 부수고 이동하기 문제풀이
백준 2166 다각형의 면적 문제풀이
백준 12015 가장 긴 증가하는 부분 수열2 문제풀이
백준 10986 나머지합 문제풀이
스택 구현하기 ========== 자료구조의 기본이라고 하면 스택 과 큐가 있다 백준 10828번에서 마주친 스택
매우매우 많은 정렬이 있지만 그중 가장 안 어려운 3가지를 공부해보았다.
Leave a comment