일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 1987파이썬
- express
- MongoDB
- 백준알파벳파이썬
- CRUD
- 도커 컨테이너
- MySQL완전삭제
- 백준
- 파이썬데이터분석라이브러리
- 금고털이 파이썬
- 소프티어 장애물인식프로그램
- 지도자동구축 파이썬
- 백준 등수매기기
- 백준 전쟁 파이썬
- 백준 A->B
- 파이썬 평범한배낭
- 백준 피아노체조
- 백준 평범한배낭
- jenkins
- 소프티어 지도자동구축
- 백준 예산
- 피아노체조 파이썬
- 프로그래머스
- 백준 바이러스
- 백준 점프 파이썬
- 백준 전쟁-전투
- 백준 점프
- express mongodb
- 장애물인식프로그램 파이썬
- 등수매기기 파이썬
- Today
- Total
바위 뚫는중
[Docker] 도커 소개, 설치, 명령어 실행 본문
예전에 생활코딩을 보고 정리한 내용들
최근 맡게된 업무 내용에 필요한 것들이 많아 생각난 김에 업로드
생활코딩 Docker 입문수업
목차
- Docker 소개
- Docker 설치
- 이미지 Pull
- 컨테이너 run
- 네트워크
- 명령어 실행
- 호스트와 컨테이너의 파일시스템 연결
1. Docker 소개
애플리케이션을 만들기 위해서는 OS운영체제에 Webserver와 Database 등을 깔아야 함
근데 여간 까다로운게 아닌데, 원래 이렇게 깔려져 있는 것이 있다면 얼마나 좋을까?
→ 하나의 컴퓨터에 가상의 컴퓨터를 만들고, 그위에 운영체제를 설치하고, 거기에 웹서버를 설치하면 어떨까? 별도의 컴퓨터를 장만하지 않아도 되잖아? → Vmware, Virtualbox가 바로 이런것
→ 그치만 웹서버를 위해 운영체제를 깔아야하는게 돈과 용량이 넘 아깝고, 운영체제 위에 운영체제가 있으면 실행속도가 느려져
→ 그렇다면 한대의 컴퓨터 안에서 각각의 앱을 실행(앱, 웹서버, 데이터베이스), 이를 격리된 환경에서 실행하면 어쩔까?
- 이떄 운영체제가 설치된 컴퓨터를 host
- host에서 실행된 각각의 격리된 환경을 container
- 각각의 컴퓨터에는 운영체제가 설치된 것이 아니고, 앱을 실행하는데 필요한 lib(라이브러리)와 bin(실행파일)만 포함되어있음.
→ 이미 존재하는 운영체제를 공유하니 각각 설치할 필요도 없고, 운영체제가 하나라서 속도도 느려지지 않음
운영체제를 다시 설치할 필요가 없으니 시간도 절약, 용량도 아낄수있음
→ Linux 운영체제에는 이렇게 환상적인 앱 실행방법이 내장되어있음 → 바로 Container
Container 실행을 해주는 것 중 가장 잘나가는 것이 바로 Docker!
2. Docker install
Dokcer는 Linux운영체제의 기술
- Docker 위에서 돌아가는 Container, Container 안에서 동작하는 각각의 App들은 Linux 운영체제에서 동작하는 App들임
- 만약 자신의 컴퓨터가 Linux 운영체제가 아니라면, 도커를 쓸 수 없나? 그렇지 않다.→ 복잡 까다로워보이지만, docker가 알아서 가상머신을 만들어주고 그 위에 Linux를 설치해줘서 복잡할게 하나도 없음
- → 윈도우나 맥OS라고 하면, 가상머신을 깔고, 그 가상머신에 Linux 운영체제를 깔면 Linux 운영체제 위에서 docker와 같은 Container기술을 사용할 수 있음
https://www.docker.com/ 에서 docker 설치!
3. 이미지 Pull
앱스토어를 통한 도커설명!
Appstore에서 Program을 찾음 → Dockerhub에서 필요한 Registry를 찾음
앱스토어에서 다운받은 Program → Dockerhub에서 찾아낸 것을 컴에 다운해서 가지고 있는 것 = Image
Program을 실행하면 Process 동작 → Image를 실행하는 것 = Container
프로그램은 여러 프로세스가 있고, 이미지에는 여러 컨테이너가 있음
- 도커허브에서 이미지를 다운받는 것 = Pull
- 이미지를 실행하는 것 = Run
- (이미지가 컨테이너가 되고 컨테이너가 실행되면서, 컨테이너 안에 포함되어 있는 프로그램이 실행됨)
- 도커허브에서 필요한 이미지를 다운받기
- https://hub.docker.com/ 도커 허브에 방문하여 원하는 것 다운
- 간단한 실습을 위해 httpd 다운받기!
- https://hub.docker.com/_/httpd
terminal에서 docker pull httpd 라는 명령어를 통해 이미지를 받을 수 있음
docker pull 매뉴얼, 참고하여 명령어 사용
https://docs.docker.com/engine/reference/commandline/pull/
이미지가 잘 다운받았는지 확인. 터미널에 docker images 입력하면 알 수 있음
docker images
버전, 생성날짜, 용량이 모두 표시됨
docker dashboard에서도 바로 확인가능
4. 컨테이너 run
Run: 이미지를 컨테이너로 만드는것
dashboard에서 httpd에서 run을 누르면 끝, 관리가 쉽도록 이름만 잘 지어주기
- ws1이라는 이름의 컨테이너를 만들어봄
- 컨테이너가 실행되고, 프로세스도 러닝되기 시작
- 클릭시 log도 확인가능 (컨테이너의 자세한 정보, 통계자료를 볼 수 있음)
실행되고있는 컨테이너는 컴퓨터의 자원을 쓰고있어서, 컨테이너를 끌 필요가 있음!
stop: 컨테이너 끄기, start: 컨테이너 켜기, delete: 컨테이너 삭제
terminal을 이용하여~ docker run 컨테이너를 만들때
docker run [Options] IMAGE [Command]
#IMAGE(이미지 이름)
#[]대괄호는 생략해도 되는 부분임
#[Command] 컨테이너에서 실행시키고 싶은 명령
docker 명령어들
docker run httpd
#httpd 기반으로 컨테이너 만들고, 실행되는 모습이 출력됨
docker ps
#우리가 만든 컨테이너들을 보여줌. 생성한 컴퓨터의 아이디, 생성 시간, 상태, 이름이 나옴
#하나의 이미지는 여러개의 컨테이너를 만들 수 있음
docker run --name ws2 httpd
#docker run --name 컨테이너이름(ws2) 이미지이름(httpd)
#httpd에 ws2 라는 컨테이너 생성! (httpd 에는 ws1도 생성되있는 상태)
docker stop 컨테이너이름(ws2)
#컨테이너 스탑하기
docker ps
#상태 확인, 근데 이건 stop된 컨테이너는 안나옴
docker ps -a (all 이라는뜻)
#all을 이용하면 stop된 컨테이너까지 다 나옴
docker start 컨테이너이름(ws2)
#stop된 컨테이너를 다시 start
docker ps
#start 됐는지 확인, 근데 log가 잘 뜨지 않음
docker logs ws2
#실시간 로그를 확인 가능, 근데 뜨다가 끊김. 실시간으로 끊기지 않고 보려면
docker logs -f ws2
#실시간 로그 확인가능
docker rm 컨테이너이름(ws2)
#컨테이너 삭제하기
#근데 현재 실행중인 컨테이너는 삭제할수 없음,무조건 컨테이너를 stop 하고 삭제!
#현재 실행중인 컨테이너를 한방에 삭제하고 싶을 경우
docker rm --force 컨테이너이름(ws2)
#이러면 stop 안해도 삭제 가능
#이미지를 삭제하는 법: 대쉬보드에서는 httpd(이미지) 누르고 리무브 하면 되는데
#커맨드에서는
docker images
#해당 명령어로 먼저 도커 이미지들을 확인 확인
docker rmi [Options]IMAGE[Command]
#위 명령어 이용
docker rmi httpd
#이렇게 하면 이미지가 삭제됨
docker rmi --force httpd
#나는 잘 안돼서 force로 삭제
docker images
#삭제 됐는지 이미지들 확인
5. 네트워크
도커없이 웹서버를 사용하려면?
→ 두대의 컴퓨터 필요 '웹브라우저가 설치된 컴퓨터'와 '웹서버가 설치된 컴퓨터'
→ 그 다음은? 웹페이지를 파일로 만들어서 웹서버가 설치된 컴퓨터의 저장장치안의 특정 디렉토리에 위치시켜야함
→ 파일시스템(=데이터가 저장된 공간) 내의 특정 디렉토리안에 index.html(웹페이지)을 위치시켜보자
→ 그리고 웹서버에게 누가 웹페이지를 요청하면 이 디렉토리에서 찾아야 해! 라고 설정해두자
→ 컴퓨터에는 65000개의 포트가 있고, 우리의 웹서버(아파치)는 80번 포트에서 접속을 대기하고 있도록 설정되어있음!
→ 웹서버가 설치된 컴퓨터의 주소는 example.com 으로 정해보자
→ 웹브라우저에서 http://example.com:80/index.html 80번 포트로 접속을 하면 웹서버가 대기중임 → 웹서버로 요청이 전달됨 → 웹서버가 디렉토리에서 index.html을 찾아서 웹브라우저로 전달
도커를 이용해서 웹서버를 이용하는 방법
$ docker run httpd
도커를 이용하면 웹서버가 컨테이너에 설치됨
- 컨테이너가 설치된 운영체제는 도커 host
- 하나의 도커 host 에는 여러개의 컨테이너가 만들어질수있음
- 컨테이너와 호스트모두 독립적인 실행환경 = 독립적인 포트와 독립적인 파일시스템!
그렇다면 웹브라우저로 웹서버에 접속을 시도해보자
호스트의 80번 포트와 컨테이너의 80번포트를 연결해주자
$ docker run -p 80:80 httpd
앞에 80은 host포트, 뒤에 80은 container포트
웹브라우저에서 호스트에 80번으로 들어온 신호가 컨테이너의 80번 포트로 전송됨
→ 이렇게 연결된 포트로 신호를 전송하는 것을 port forwarding(포트포워딩)이라고 함 → 요청 신호가 웹서버로 전송이 되고 나머지 과정은 이전과 같음
포트가 8000으로 변경된다면, 이렇게 쓰면됨
$ docker run -p 8000:80 httpd
그렇다면 ws3이라는 새로운 컨테이너를 만들어보자!
$ docker run —name ws3 -p 8081:80 httpd
host포트 8081로 들어오면 컨테이너의 80번 포트로 연결한다는 뜻
http://localhost:8001/index.html
위의 링크로 접속하면 정상 작동하는 것을 확인할 수 있고, 새로고침하면 로그도 계속하여 확인할 수 있음!
6. 명령어 실행
index.html을 편집해서 나의 웹, 앱을 만들려면?
컨테이너 안으로 들어가서 컨테이너를 수정할 수 있어야 함
방법 1: ws3의 cli로 접속 → 컨테이너 터미널로 접속
방법 2: command 에서 실행
docker exec [OPTIONS] CONTAINER Command [ARG..]
docker ps
#현재 실행중인 프로세스 확인
docker exec ws3 /bin/sh #ws3의 shell이 켜짐. 근데 바로 꺼짐!
docker exec -it ws3/bin/sh #지속적인 연결을 위해서 -it 명령어 사용
docker exec -it ws3/bin/bash #bash쉘이 쓰기더 편하니까 bash로 접속
index.html 의 위치는 httpd 메뉴얼에 나와있음! (/usr/local/apache2/htdocs/)
해당 위치를 참고하여 index.html의 디렉토리(/usr/local/apache2/htdocs/)로 접속하기
apt update #html을 바로 수정할 수 없으니 nano를 사용하기 위해 apt 먼저 update
apt install nano #nano 설치
nano index.html #index.html을 수정할 수 있게됨!
해당 과정을 통해 index.html을 수정하면 수정한 결과가 http://localhost:8001/index.html 링크에 나타나는 것을 확인할 수 있음
7. 호스트와 컨테이너의 파일시스템 연결
도커의 파일시스템 안의 index.html을 수정했는데, 컨테이너가 사라진다면? 물거품이 될 것
컨테이너를 우리가 사용하는 이유는 필요할 때 언제든지 생성하고 지울 수 있는 것이 큰 이유!
컨테이너의 디렉토리(/usr/local/apache2/htdocs/)와 호스트의 디렉토리(/Desktop/htdocs)를 연결하고 호스트쪽의 수정이 이루어졌을때 그것이 컨테이너에 반영될 수 있다면, 컨테이너가 날라가도 우리의 소스코드는 여전히 남아있고, 파일의 버전관리가 쉬울것
실행환경은 컨테이너에게 맡기고, 파일을 수정하는 것은 호스트에서 하는 법을 알아보자
컨테이너의 파일 시스템과 호스트의 파일시스템을 연결
Desktop docker run -p 8888:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd
#호스트의 8888포트와 컨테이너의 80번포트연결
#-v : volume의 약자
이 과정을 거치면 호스트에서 파일이 수정되고 노출되기 때문에 파일의 버전관리, 에디터(vscode등)로 코드편집 등이 모두 수월하게 진행된다!