Docker
- 컨테이너 기술을 지원하는 프로젝트 중 하나, 사실상 컨테이너 기술의 표준
- 리눅스의 name space, cgroups와 같은 커널 기능을 사용하여 가상화
- Cloud Service Model과 같이 사용 가능
- Image: Program, Library, Source를 설취한 뒤 만든 하나의 File
- Container: Image를 격리하여 독립된 공간에서 실행한 가상 환경
Container
- VM을 사용해 각 Service를 isolate 하는 기술
- VM처럼 HW를 전부 구현하지 않기 때문에 속도 빠름(오버헤드 제거)
Container Isolate
Linux namespace
각 process가 file system, network, uid, uts 등에 대해 시스템에 isolate view를 제공
Linux Control Group
Resource Mount를 관리(CPU, Memory, I/O, Network, Device node...)
Docker의 한계
- Service가 커질 수록 관리해야 할 Container가 급격히 증가
- 쿠버네틱스로 시스템을 관리
Docker Registry
- 원하는 Image 다운로드 가능
- https://hub.docker.com
Image Download
docker pull [service]
Image List
docker images
Docker life cycle
Image Download/Remove
docker pull [image]
docker rmi [image]
Container Create
docker create -p [port] --name [container name] [image]
Container Run
docker start [Container name/id]
Running Container
docker ps
All Container
docker ps -a
Container Stop
docker stop [Container name/id]
Container Delete (after stop)
docker rm [Container name/id]
Image Layer
- 이미지 정보 확인
docker inspect [image]
- 실질적 Image들은 _/var/lib/docker/overlay2_에 저장되어 있음
포트포워딩으로 톰캣 실행하기
sudo docker run -d --name tc -p 80:8080 tomcat
127.0.0.1:80로 접속
컨테이너 내부 셸 실행
sudo docker exec -it tc /bin/bash
컨테이너 로그 확인
sudo docker logs tc # stdout, stderr
호스트 및 컨테이너 간 파일 복사
sudo docker cp <path> <to container>:<path>
sudo docker cp <from container>:<path> <path>
sudo docker cp <from container>:<path> <to container>:<path>
도커 컨테이너 모두 삭제
sudo docker stop `sudo docker ps -a -q`
sudo docker rm `sudo docker ps -a -q`
임시 컨테이너 생성
sudo docker run -d -p 80:8080 --rm --name tc tomcat
환경변수 전달하기
$ docker run -d --name nx -e env_name=test1234 nginx
/# printenv env_name
볼륨마운트
sudo docker run -d -p 80:80 --rm -v /var/www:/usr/share/nginx/html:ro nginx # ro:읽기전용 rw:읽기쓰기
도커 이미지 직접 빌드
도커 빌드할 프로그램 준비
python를 사용해 단순한 서비스를 시작 작성한다. 다음 파일을 작성하여 test_server.py로 저장한다.
# test_server.py
import socket
with socket.socket() as s:
s.bind(("0.0.0.0", 12345))
s.listen()
print("server is started")
conn, addr = s.accept()
# conn 클라이언트와 통신할 소켓
# addr 클라이언트의 정보가 들어있음
with conn:
print("Connected by", addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
python3 test_server.py
---
nc 127.0.0.1 12345
도커 파일 생성
별도의 디렉토리를 생성하고 dockfile과 위에서 생성한 python파일을 새 디렉토리에 배치한다.
mkdir my_first_project
mv test_server.py ./my_first_project/
cd my_first_project/
gedit dockerfile
dockerfile
FROM python:3.7
RUN mkdir /echo
COPY test_server.py /echo
CMD ["python", "/echo/test_server.py"]
빌드 후 테스트
ls
dockerfile test_server.py
sudo docker build -t ehco_test .
sudo docker images
sudo docker run -t -p 12345:12345 --name et --rm echo_test
nc 127.0.0.1 12345
이미지 푸시
sudo docker login
sudo docker tag echo_test [id]/echo_test
sudo docker images
sudo docker push [id]/echo_test
'Study > Infra, DevOps' 카테고리의 다른 글
[Jenkins Pipeline] Github repository 변경 시 자동 배포 (0) | 2021.11.04 |
---|---|
[AWS EC2] Docker 설치, root로 접속, 포트포워딩 (0) | 2021.11.03 |
OpenStack (0) | 2021.07.10 |
가상화 (0) | 2021.07.05 |
클라우드 컴퓨팅 (0) | 2021.07.04 |
Comment