1. Docker란
Docker는 가상 머신처럼 독립된 실행환경을 만들어주는 것으로, 운영체제를 설치하 것과 유사한 효과를 낼 수 있지만, 실제 운영체제를 설치하지 않기 때문에 설치 용량이 적고 실행 속도 또한 빠릅니다. 예전에는 윈도에 VM Ware와 같은 가상 머신을 설치하였으나 최근에는 리눅스 계열에서 Docker가 그 역할을 대신하고 있습니다.
출처: 위키 백과
도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.
2. Docker 를 사용하는 이유
Docker는 다양하게 사용할 수 있습니다. (출처: 나무위키) 실무에서는 우분투 환경에 CentOS container를 설치하여 사용하거나, 이미 검증된 Web server의 설정 및 Binary가 설치된 container를 설치하여 복잡한 configuration 과정을 줄일 수 있습니다.
- 구성 단순화 Docker는 하나의 Configuration으로 모든 플랫폼에서 실행할 수 있습니다. Configuration 파일을 코드에 넣고 환경 변수를 전달하여 다른 환경에 맞출 수 있습니다. 따라서 하나의 Docker 이미지를 다른 환경에서 사용할 수 있습니다.
- 코드 관리 Docker는 일관된 환경을 제공하여 개발 및 코딩을 훨씬 편안하게 만들어줍니다. Docker 이미지는 변경이 불가하기에 개발환경에서 운영 환경까지 애플리케이션 환경이 변경되지 않는 이점이 존재합니다.
- 개발 생산성 향상 개발 환경을 운영 환경에 최대한 가깝게 복제할 수 있습니다. Docker를 사용하면 코드가 운영 환경의 컨테이너에서 실행될 수 있으며 VM과 달리 Docker는 오버 헤드 메모리 용량이 적기에 여러 서비스를 실행하는데 도움이 됩니다. 또한 Docker의 Shared Volume을 사용하여 호스트에서 컨테이너의 어플리케이션 코드를 사용할 수 있도록 할 수 있습니다. 이를 통해 개발자는 자신의 플랫폼 및 편집기에서 소스 코드를 편집할 수 있으며 이는 Docker내에서 실행 중인 환경에 반영됩니다.
- 애플리케이션 격리 Web Server(e.g. Apache, Nginx)와 연결된 API 서버를 격리할 필요가 있는 경우가 있습니다. 이 경우 다른 컨테이너에서 API를 서버를 실행할 수 있습니다.
- 빠른 배포 컨테이너가 OS를 부팅하지 않고 어플리케이션을 실행하기 때문에 Docker 컨테이너를 매우 빠르게 만들 수 있습니다.
3. Images와 Container 개념 이해
Docker 공식 홈페이지는 https://docker.com/이며, 개념을 설명한 문서는 링크에 설명되어 있습니다. Docker는 Client (docker)와 서버 (dockerd)로 구성되어 있습니다. Docker Images는 read only의 docker container를 생성하기 위한 template이고, Container는 images가 실제 메모리에 로딩된 instance입니다. 하나의 images로 유사한 container를 만들 수 있습니다. Registry는 Docker hub이며 images의 저장소입니다.
- Images: libs와 package의 template, read only
- Container: Images가 설치되어 메모리에 로딩된 instance
4. Container와 Virtual Machine 비교
Container는 리눅스/Windows와 Host OS 기반에 docker가 운영되고, Container 별로 각각 process 단위로 bin/libs가 구동됩니다. 반면 Virtual machine은 Hypervisor 위에 full host OS (리눅스/윈도우)가 올라가고 이를 기반으로 각각의 bin/libs가 구동됩니다. VM은 full OS를 구동하기 때문에 overahead가 높습니다. 즉, Container와 Virtual machine의 차이점은 Host OS를 설치 여부에 있습니다.
5. Docker 설치 및 사용 방법
Docker에 대한 설명은 아래 동영상을 참조해주세요. 쉽게 설명되어 있으며, 꼭 필요한 명령어를 설명하고 있습니다.
5.1 Docker 설치
우분투 기준으로 Docker 설치 방법을 링크에 설명되어 있습니다. 자동 설치 script 활용합니다. get-docker.sh 에서는 OS 맞는 설치 방법을 자동으로 선택하고 우분투의 경우에는 apt update 후 repository를 추가해서 docker를 패키지를 설치합니다. 설치 script 진행 후에는 Docker client와 server의 설치 버전을 표시합니다.
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
# docker는 sudo 계정을 필요로 합니다. 일반 user 계정에서 사용하는 아래 명령어를 사용해주세요.
$ sudo usermod -aG docker [your-user]
5.2. Docker 삭제
Docker 를 삭제하기 위해서는 아래 명령어를 사용합니다. Docker client와 서버를 삭제하고 docker에서 설치한 images와 container를 수동으로 삭제합니다.
#Uninstall the Docker Engine, CLI, and Containerd packages:
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io
# Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:
$ sudo rm -rf /var/lib/docker
5.3. Docker Image 검색 (docker search) 및 다운로드 (docker pull)
# docker image 검색 (Docker Hub에서 검색)
$ sudo docker search [검색 단어]
$ sudo docker search centos
#docker image 받아오기
docker pull <이미지 이름>:<태그>
#최신 버전의 centos
$ sudo docker pull centos
#특정 버전 (특정 tag)의 centos : registry.hub.docker.com/_/centos?tab=tags
$ sudo docker pull centos:centos7
5.3. Docker image에서 container 실행 (docker run)
#docker image에서 container 실행
docker run <옵션> <이미지 이름:Tag이름> <실행할 파일> 형식입니다
$ sudo docker run -i -t centos:centos7 /bin/bash
-i(interactive), -t(Pseudo-tty) 옵션을 사용하면 실행된 Bash Shell에 입력 및 출력을 할 수 있습니다.
Docker run 실행하면 root 계정으로 bash를 실행합니다. 우분투에서 CentOS7 cotainer를 설치 후에 OS를 확인하면 아래와 같습니다.
# Container 시작
$ sudo docker start [컨테이너 이름 or ID]
# Container 접속
$ sudo docker attach [컨테이너 이름 or ID]
Bash Shell에서 exit 또는 Ctrl+D를 입력하면 컨테이너가 정지됩니다. 여기서는 단축키 Ctrl+P와 Ctrl+Q를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져나옵니다
5.4. Docker image 리스트 확인 (docker images) 및 삭제
# 설치된 이미지 리스트 확인
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 9140108b62dc 3 weeks ago 72.9MB
hello-world latest bf756fb1ae65 9 months ago 13.3kB
# doker image 삭제
$ sudo docker rmi [image id]
$ sudo docker rmi bf756fb1ae65
5.4. 동작 중인 container 확인 (docker ps) 및 삭제 (docker rm)
# 동작 중인 container 확인
$ sudo docker ps
#정지된 container 확인
$ sudo docker ps -a
#container 삭제
$ sudo docker rm [container id]
$ sudo docker rm afc479607c11 fdfe0a5387ef
5.6. 파일 공유를 위한 Volume mount 및 파일 복사
Host의 storage를 container로 전달하는 명령어입니다. -v (volume)을 사용할 수입니다. Host와 container 사이에 storage를 공유할 수 있습니다
# 로컬 volume을 container의 /conainer_volume 로 마운트
$ docker run -i -t -v /home/host_volume:/conainer_volume centos:centos7 /bin/bash
# 로컬 파일을 cotainer로 복사: 로컬의 “~/data/test.md” 라는 파일을 컨테이너의 “/root/data/”로 복사
$ docker cp ~/data/test.md tmp_container:/root/data/
5.7. Docker 명령어 리스트
Management Commands:
builder Manage builds
config Manage Docker configs
container Manage containers
context Manage contexts
engine Manage the docker engine
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
유용한 명령어 모음입니다.
# 컨테이너의 로컬 셸 가져오기
docker run -i -t --entrypoint /bin/bash imageID
# 이 디렉터리의 Dockerfile을 사용하여 이미지 생성
docker build -t friendlyname .
# 포트 4000에서 80으로 "friendlyname" 매핑 실행
docker run -p 4000:80 friendlyname
# 동일하지만 분리된 모드에서
docker run -d -p 4000:80 friendlyname
# 실행 중인 모든 컨테이너 목록 보기
docker ps
# 지정된 컨테이너를 정상적으로 중지
docker stop <hash>
# 실행 중이 아닌 컨테이너를 포함해 모든 컨테이너 목록 보기
docker ps -a
# 지정된 컨테이너 강제 종료
docker kill <hash>
# 이 시스템에서 지정된 컨테이너 제거
docker rm <hash>
# 이 시스템에서 모든 컨테이너 제거
docker rm $(docker ps -a -q)
# 이 시스템의 모든 이미지 표시
docker images -a
# 이 시스템에서 지정된 이미지 제거
docker rmi <imagename>
# 이 시스템에서 모든 이미지 제거
docker rmi $(docker images -q)
# Docker 자격 증명을 사용하여 이 CLI 세션에 로그인
docker login
# 레지스트리에 업로드할 <image> 태그 지정
docker tag <image> username/repository:tag
# 태그 지정된 이미지를 레지스트리에 업로드
docker push username/repository:tag
# 레지스트리에서 이미지 실행
docker run username/repository:tag
관련 글
[개발환경/Google Cloud Platform] - IP Address CIDR 표현법과 사용 예
[개발환경/Google Cloud Platform] - GCP에서 Squid를 이용한 Proxy 서버 설정 방법
[개발환경/우분투] - 우분투 20.04에서 Grub 편집: grub-customizer 와 Grub theme 설정
[개발환경/Oracle Cloud] - 오라클 클라우드 '평생' 무료 VM 만들기 (Google Cloud 무료 조건 비교)
[개발환경/Oracle Cloud] - Oracle Cloud 블록 스토리지 추가 방법 (HDD 추가 가이드)
[개발환경/Web Server] - 우분투 20.04에서 lighttpd의 fastcgi 개념 및 사용법
[개발환경/Web Server] - 우분투 20.04에서 lighttpd CGI 설정 방법 및 C와 Python 예제 코드
[개발환경/Google Cloud Platform] - GCP(Google Cloud) 원격 데스크 톱(RDP) 연결: Linux 용 Chrome RDP
[개발환경/Google Cloud Platform] - GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기
[개발환경/Web Server] - 우분투 20.04에서 Web 서버 설치 방법 (apache2, tomcat9)
댓글