[Docker] 도커 개념, 도커 설치, 기본 명령어 실습

isitcake_yes·2022년 10월 28일
0
post-thumbnail

1. 도커란 ?

도커 (Docker)는 가상머신처럼 컨테이너 기반의 독립된 실행환경을 만들어주는 플랫폼이다. host OS안에서 독립적인 Application(Container)들이 각각 관리되고 실행된다.

🐬 도커 사용 이유

도커는 실행파일만 갖고 있기 때문에 VM보다 용량 부담이 적고 실행속도가 빠르다. 또한 컨테이너 생성 및 관리가 매우 용이하기 때문에 Application의 개발과 배포 편해지고, 여러 Application의 독립성과 확장성이 높아지는 등 많은 장점이 있다.

🐬 Docker hub / Image / Container

  • Docker Hub : Docker의 이미지 저장소 서비스
  • Docker Image : 도커 컨테이너 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 하나로 합친 것.
    • (image 실행) docker run [이미지]
  • Docker Container : 도커 이미지를 실행한 상태. 파일 시스템과 어플리케이션이 구체화되어 실행되는 상태.




2. 리눅스(Ubuntu)에 설치

참고 : https://docs.docker.com/engine/install/ubuntu/

1) 저장소 설정(repository)

#  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

2) 도커 엔진 설치

$  sudo apt-get update
# 설치
$  sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 도커설치 확인
$  sudo docker run hello-world 




3. 도커 실행

1) 도커 허브에서 이미지 가져오기(pull)

$ docker pull [OPTIONS] NAME [:TAG|@DIGEST]
$ docker images

도커 허브에서 이미지 가져오기 (ex. httpd 설치) - https://hub.docker.com/_/httpd

$ sudo docker pull httpd # 설치된 images 리스트 확인
$ sudo docker images 

2) 이미지 실행시켜 컨테이너 생성 (run)

$ docker run [OPTIONS] IMAGE [COMMAND][ARG...]

$ sudo docker run --name ws1 httpd
$ sudo docker run --name ws2 httpd

3) 도커 컨테이너 확인

$ 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




4. 도커 네트워크 구조

  • 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)




5. 컨테이너 명령 실행

$ 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 로 나가기 )

🐬 index.html을 수정해보자

  • index.html파일 위치 : /usr/local/apache2/htdocs/ (hub에 사용법 정리되어 있음.)
$ 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
  • vi 에디터 설치
apt update
apt install vim
vi index.html  -> 수정 후 localhost:8081/index.html 확인




6. 호스트와 컨테이너의 파일 시스템

$ sudo docker run --name cfront -p 8081:80 -v /home/sekim/front:/usr/local/apache2/htdocs/ httpd

  • v옵션 추가 : -v host의 파일 위치:container의 파일위치
  • $ sudo docker exec -it cfront /bin/bash 로 파일 확인
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의 파일도 변경된다.


Ref

생활코딩 도커 강의를 공부하며 작성한 글입니다.

profile
주니어 개발자 주니어발록 주니어예티 주니어레이스

0개의 댓글