도커 등장 배경
1. 일반 서버

- OS를 공유하고 있기 때문에, 하나의 App에서 문제가 발생하면 다른 App에도 영향
2. 가상화
- 위 문제를 해결하기 위해, OS를 독립화
- Hypervisor라는 SW 기술을 가지고 가상화된 컴퓨터 위에 독립적으로 App을 운영
- 하지만
- 각 서비스별 독립성은 유지되지만, OS 위에 또 다른 OS가 설치되는 구조
- 불필요하게 많은 용량 사용
- 속도 저하

3. 컨테이너
- 최소한의 필요한 환경 요소만 묶어서 서비스 제공
- 독립성 유지
- 적은 용량으로 운영 가능
- 컨테이너 플랫폼 중 하나가 Docker

Docker 사용 루트
- 어플리케이션을 한번만 도커 이미지로 빌드해놓으면

- 다음과 같은 클라우드 환경에서 일관되게 실행 가능

- 다음과 같은 도커 이미지 저장소에서 이미지 다운받아서 사용 가능
ex) docker pull nginx
ex) docker run -d -p 80:80 nginx

Docker란?
- 다양한 종류의 애플리케이션을 신속하게 구축, 테스트 및 배포 가능한 SW 플랫폼
- 하드웨어의 자원을 모두 가상화 하지 않고, 프로세스들만을 격리시킴 -> 빠르게 환경 구축 가능
- 서비스 환경을 Docker Image로 만든 뒤, 배포하고 컨테이너로 간단히 실행 가능
- 하드웨어의 모든 자원을 복제하는 VM(Virtual Machine)과는 용량과 속도 부분에서 차이가 존재
Image란?
- 개발 환경을 구축하기 위해 필요한 라이브러리 및 패키지를 모아 하나의 파일로 만든 것
- Base Image: Docker Hub를 통해 배포된 각 Application의 공식 이미지 (https://hub.docker.com/)
- Docker Image: 사용자가 Base Image를 사용하여, 그 위에 프로그램, 라이브러리, 소스를 설치 -> 하나의 파일로 만든 산출물
Docker Image 관련 명령어
Base Image 가져오기
- docker pull [Image Name]:[tag]
- docker pull ubuntu:18.04
현재 Host에 존재하는 Image 확인
- docker images
Image 삭제
- docker rmi [option] ImageName [ImageName,,,,,]
- 삭제하기 원하는 이미지를 사용하는 컨테이너 미리 삭제하기
미사용 Image 전부 삭제
- 어떤 컨테이너에도 연결되지 않은 이미지가 많다면, 아래 명령어로 한번에 삭제
- docker image prune -af
- -f 옵션은 삭제 수락을 물어보지 않음
Container란?
- 이미지가 실행된 형태
- 호스트와 이미지엔 아무런 영향을 주지 않고 Docker engin에서 독립적으로 실행

Docker Container 관련 명령어
Container 생성
- docker create [option] [ImageName]:[tag]
- docker create -it ubuntu:18.04
- -it(-i + -t): 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정
- -i, -iteractive: 표준입력(stdin) 활성화, 연결되어 있지 않더라도 표준입력 유지, 이 옵션을 사용하여 Bash에 명령 입력
- -t, --tty: Bash를 사용하려면 해당 옵션 설정해야 함, 옵션 설정하지 않으면, 입력은 가능하지만, 셸에 표시 X
- -d: detached 모드로 컨테이너를 실행, 컨테이너를 백그라운드에서 동작하는 애플리케이션으로 실행 설정
- option 내용은 워낙 많아서 밑에 링크 참조
Container 생성 후, 바로 실행
- docker run [option] [ImageName]:[tag] [Command(선택)]
- docker run -it ubuntu:18.04 /bin/bash
Container와 Host간 파일 복사
Host -> Container
- docker cp [host_filepath] [container_name]:[container_filepath]
Container -> Host
- docker cp [container_name]:[container_filepath] [host_filepath]
Container 목록 확인
- docker ps [option] -> 현재 진행중인 컨테이너 목록 확인
- -a option -> 정지된 컨테이너 목록까지 확인
Container log 확인
- docker logs [image name/image id]
- -f option으로 실시간으로 생성되는 로그 확인
- --tail option으로 로그의 마지막 10줄만 확인 가능
Container 쉘 얻기 -> 동작, 추가 명령어 실행
특정 컨테이너의 쉘을 얻고 동작
- docker exec -it [container name / container ID] /bin/bash
실행된 특정 컨테이너에 추가적 명령어 동작
- docker exec [container name / container ID] [command]
ex) docker 에서 구동중인 jenkins에 접속하여, bash를 통해 필요한 라이브러리 설치
Container 중지
- 실행 중인 컨테이너 중지
- docker stop [container name / container ID]
Container 삭제
- docker rm [container name / container ID]
- -f option: 삭제 삭제
- docker container prune : 모든 container 삭제
- 중지된 컨테이너 삭제
이슈 공유
사용중인 컨테이너를 이미지로 커밋하는 법
- Openvidu를 사용하려면 다수의 Port가 요구됨
- 8888 포트도 요구되는데, jenkins를 8888포트에서 사용중인 상태
- jenkins에 구성되어 있는 것들이 많기 때문에, 새롭게 컨테이너를 만들기에는 부담
- "commit" 명령어로 현재 사용중인 컨테이너를 이미지로 만들고, 포트 변경에서 run
- docker commit [container_name] [new_image_name]
https://tttsss77.tistory.com/230
Docker Option
- https://docs.docker.com/engine/reference/commandline/{명령어}
- ex) docker run에 대한 option 검색 링크
https://docs.docker.com/engine/reference/commandline/run/
docker run
docker run: The `docker run` command first `creates` a writeable container layer over the specified image, and then `starts` it using the specified command. That is, `docker run` is equivalent...
docs.docker.com
질문
docker란?
- 현재 가장 널리 사용되는 가상화 또는 컨테이너화 기술 중 하나입니다
- 컨테이너를 사용하여 애플리케이션을 구축, 배포 및 실행하면 전체 프로세스가 더 쉽고 비용도 효율적입니다.
docker를 사용해야하는 이유(장점)
- 독립된 개발 환경을 보장합니다. Container는 격리된 공간이므로, 그자 체에 특별한 권한을 주지 않은 한 내부에서 무엇을 하든 Host OS에 영향을 끼치지 않습니다.
- 개발및 운영 환경을 통합할 수 있습니다. Container 내부 작업을 배포하기 위해서는 해당 Container를 docker image라는 하나의 패키지로 만들어 운영 서버에 전달하기만 하면 됩니다. 서비스를 개발했을 때의 환경을 다른 서버에서도 똑같이 복제할 수 있기 때문에 각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요 없습니다.
- 배포 신속성 및 HW 효율에서 장점이 있습니다. Kernel을 포함하고 있지 않기 때문에 image크기가 작습니다. 따라서 Application의 배포 속도가 매우 빠르고 HW 용량도 적게 차지합니다.
docker 단점
- 개발 초기의 오버헤드
- Linux 친화적
docker container란?
- 이미지는 컨테이너 실행에 필요한 파일과 설정 값등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않습니다.
- 컨테이너는 애플리케이션을 환경에 구애받지 실행되는 기술입니다. 이미지를 실행하면 만들어지는 파일입니다.
마치며
- 도커에 대해 다룰 내용이 많다보니, 추후 위 내용보다 심화된 도커 내용을 다룰지 고민중 ex) dockerfile 구성요소, docker-compose
- 본인도 심화된 도커 내용을 공부하면서, 도커에 대한 어떤 질문도 답할 수 있도록 정리하는 것의 필요성 느낌