도커 (Docker)는 가상머신처럼 컨테이너 기반의 독립된 실행환경을 만들어주는 플랫폼이다. host OS안에서 독립적인 Application(Container)들이 각각 관리되고 실행된다.
도커는 실행파일만 갖고 있기 때문에 VM보다 용량 부담이 적고 실행속도가 빠르다. 또한 컨테이너 생성 및 관리가 매우 용이하기 때문에 Application의 개발과 배포 편해지고, 여러 Application의 독립성과 확장성이 높아지는 등 많은 장점이 있다.
docker pull [이미지]
docker run [이미지]
참고 : https://docs.docker.com/engine/install/ubuntu/
# update apt
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# Docker의 official GPG key 추가
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 리포지토리를 설정
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
# 설치
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 도커설치 확인
$ sudo docker run hello-world
$ docker pull [OPTIONS] NAME [:TAG|@DIGEST]
$ docker images
도커 허브에서 이미지 가져오기 (ex. httpd 설치) - https://hub.docker.com/_/httpd
$ sudo docker pull httpd # 설치된 images 리스트 확인
$ sudo docker images
$ docker run [OPTIONS] IMAGE [COMMAND][ARG...]
$ sudo docker run --name ws1 httpd
$ sudo docker run --name ws2 httpd
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
: 컨테이너 종료$ docker start [OPTIONS] CONTAINER [CONTAINER...]
: 컨테이너 실행$ docker logs [OPTIONS] CONTAINER
: 컨테이너 로그출력
(docker logs -f ws1
:실시간 로그 출력)$ docker ps [OPTIONS]
: 현재 실행중인 컨테이너 출력
(docker ps -a
: 존재하는 모든 컨테이너 출력)$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
: 컨테이너 삭제$ docker rmi [OPTIONS] IMAGE [IMAGE...]
: 이미지 삭제
$ sudo docker ps
$ sudo docker stop ws2
$ sudo docker ps # 멈춘 것 확인
$ sudo docker rm ws2
$ sudo docker rmi httpd
1개의 도커 host에는 여러개의 container를 만들 수 있다.
host, container 모두 독립적이기 때문에, 독립적인 포트와 파일시스템을 갖고 있다.
호스트의 8080번 포트와 컨테이너 80번 포트를 연결하려면, 컨테이너 실행 시, docker run -p 8080:80 httpd
와 같이 연결한다. 이렇게 연결된 포트로 신호를 전송하는 것을 포트 포워딩(port forwarding)이라고 한다.
Ex. Web1(Web browser), Web2(Web server)에서 도커 네트워크
1. Web1(웹브라우저)에 주소창 index.html
을 입력
2. host:8080, container:80 포트로 Web2(웹서버)에 요청신호가 전달됨
3. Web2(웹서버)의 file system(/usr/loacl/apache2/htdocs/)
에서 index.html
파일을 읽어서 index.html코드를 Web1(웹브라우저)에게 전달함
$ sudo docker run --name ws3 -p 8081:80 httpd
localhost:8081/index.html
) docker logs -f ws3
)$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# ws3 컨테이너에서 pwd 실행
$ sudo docker exec ws3 pwd
/usr/local/apache2
# ws3 컨테이너에서 command line 지속적으로 연결(- it 옵션)
$ sudo docker exec -it ws3 /bin/sh
$ sudo docker exec -it ws3 /bin/bash
# pwd
usr/local/apache2
# exit (host 로 나가기 )
$ sudo docker exec -it ws3 /bin/bash
root@3215050bf255:/usr/local/apache2# cd /usr/local/apache2/htdocs/
root@3215050bf255:/usr/local/apache2/htdocs# ls
index.html
apt update
apt install vim
vi index.html -> 수정 후 localhost:8081/index.html 확인
$ sudo docker run --name cfront -p 8081:80 -v /home/sekim/front:/usr/local/apache2/htdocs/ httpd
-v host의 파일 위치:container의 파일위치
root@9109f76dfd59:/usr/local/apache2# cd htdocs/
root@9109f76dfd59:/usr/local/apache2/htdocs# ls
04.md index.html main.css main.js
=> host(내 로컬)환경에 있던 front폴더(/home/sekim/front)의 내용을 cfront컨테이너에서 확인할 수 있게 되었다. 또한 실시간으로 host파일을 변경할 때마다 바로 container의 파일도 변경된다.
생활코딩 도커 강의를 공부하며 작성한 글입니다.