DOCKER 도커
👩💻 5일차 수업에서는 도커와 쉘 스크립트 중 하나를 골라 배우기로 했다. 많은 동기들이 '도커'를 원해 도커 배우기로!
❓그렇다면 기존 수업에서 사용하던 가상머신(가상환경) VM과 도커의 차이는 무엇이고, 또 도커란 무엇일까?
Q1. VM vs Docker?
A1) '게스트 OS의 유무'!
VM에는 Guest OS가 깔리지만 도커의 컨테이너에는 설치하지 않음. VM은 어플리케이션이 하나씩 늘 때마다 OS를 위한 자원을 할당해줘야 하는 반면, 도커는 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있음!
Q2. 도커(Docker)란?
A2) 어플리케이션 실행을 위한 환경을 image로 만들고, 이를 사용하여 여러 다른 환경에서 어플리케이션 실행 , 운영을 지원하는 오픈소스 플랫폼
Container 기반 배포로 동일한 개발/운영 환경 보장 | 고가용성을 위한 서비스 확장 용이 |
ㄴ Q2-1. 도커를 왜 사용할까?
ㄴ A2-1) 1. 애플리케이션 독립성을 가짐. 호스트 OS, 다른 컨테이너와도 독립된 공간 보장받아 충돌 발생 x
2. 컨테이너 내부에 작업 후 배포하려 한다면 도커 이미지로 만들어서 운영서버에 전달만 하면 됨
3. 마이크로 서비스 구조로 변화가 쉬움. 컨테이너 하나당 하나의 기능 제공하는 모듈로 만드는 조정이 가능
= 도커를 사용하면 환경에 구애받지 않고 어플리케이션을 신속하게 배포, 확장 가능
- 도커 이미지 (Docker Image)
: 컨테이너를 실행할 수 있는 실행파일, 설정 값들을 가지고 있는 것으로 더 이상 의존성 파일을 컴파일하거나 이것저것 설치할 필요가 없는 상태의 파일
~> 이미지를 컨테이너에 담고 실행시키면 해당 프로세스가 동작!
ㄴ Q. 도커 이미지는 어떻게 생성하나요?
A) 기존 이미지에 추가적인 구성이 필요할 때 다시 다운로드 하는 게 아닌 기존 이미지에 레이어 추가하여 구성 올려주는 방식
즉, 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일 추가되면 새로운 레이어가 생성되어 추가됨!
- 컨테이너 (Container)
: 이미지를 실행한 상태로 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화 해 격리된 공간에서 프로세스 동작시키는 기술
~> 컨테이너는 이미지 레이어에 읽기/쓰기 레이어를 추가하는 것으로 생성됨
~> 종료되었다고 해도 삭제되지 않음 (읽기/쓰기 레이어 보존)
~> 컨테이너를 삭제한 것은 생성파일이 사라지는 것
~> 한 서버는 여러 개의 컨테이너를 가져도 상관없으며 독립적으로 실행
~> 컨테이너는 커널 공간과 호스트 os 자원을 공유
🔧 자! 이제, 도커 실습 환경을 구축해보자
Ubuntu 기준!
도커 사이트에 접속해서 명령어 확인하고 설치해주자!
[ Docker 명령어 살펴보기 ]
' Docker 기본 동작 명령어 ' ⭐
- Docker Image 검색
docker search nginx
- Docker Image 다운로드docker pull Image명:Tag명
⚠️ Tag명 생략 시 latest로 다운로드
- Docker Image 확인 및 Container 구동
docker image ls
docker run --name [컨테이너명] -d -p 80:80 [이미지]
docker ps
=> Docker Container 구동 확인!
- Docker Container 중지 및 확인docker stop [컨테이너명]
docker ps -a
- Docker Container 및 Image 삭제
docker rm [컨테이너명]
docker image rm [이미지]
' 이미지 조작 ' ⭐
- 이미지 다운로드
docker image pull
- 이미지 목록 표시
docker image ls
- 이미지 상세 정보 확인
docker image inspect
- 이미지 태그 설정
docker image tag
- 이미지 검색docker search
- 이미지 삭제
docker image rm
- Docker hub(io...?) 로그인docker login
- 이미지 업로드
docker image push
- Docker Hub에서 로그아웃
docker logout
' 컨테이너 생성/시작/정지 ' ⭐
- 생성 및 시작
docker container run
- 컨테이너의 백그라운드 실행
docker container run -d (-it)
- 컨테이너 로그 확인
docker container logs -t
- 컨테이너 자동으로 재시작
docker container run -it -restart=always centos /bin/bash
- 컨테이너 네트워크 설정
docker container run -d -p 8080:80 nginx docker container run -d --dns 8.8.8.8 nginx docker container run -d --mac-address="11:11:11:11:11:11" centos docker container run -it --hostname www.test.com centos docker container run -it --add-host test.com:[IP 주소] centos
- 가동 중인 컨테이너 목록 표시docker container ls (-a)
- 컨테이너 가동 확인
docker container stats [컨테이너명]
- 컨테이너 프로세스 확인
docker container top [컨테이너명]
- 컨테이너 시작/정지/재시작
docker container start/stop/restart [컨테이너명]
- 컨테이너 삭제
docker container rm [컨테이너명]
- 정지 중인 컨테이너 삭제
docker container prune
- 컨테이너 중단/재개
docker container pause/unpause
' 가동 중인 컨테이너 조작 ' ⭐
- 가동 중인 컨테이너 연결
docker container attach [컨테이너명]
- 가동 중인 컨테이너에서 프로세스 실행
docker container exec
- 가동 중인 컨테이너 프로세스 확인
docker container top [컨테이너명]
- 가동 중인 컨테이너의 포트 확인
docker container port [컨테이너명]
- 컨테이너 이름 변경
docker container rename [컨테이너명][바꿀 컨테이너명]
- 컨테이너 안의 파일 복사
docker container cp [컨테이너]:/etc/nginx/nginx.conf /home/[사용자]
- 호스트의 파일을 컨테이너 안으로 복사
docker container cp /home/[사용자]/파일명 [컨테이너]:/tmp/파일명
- 컨테이너 변경사항 확인
docker container diff [컨테이너명]
[ 도커 파일 (Doker File) ]
: Docker Container의 구성 정보(Base Image, 수행 명령, 환경 변수 등)을 기술하는 파일
💡 오늘의 실습!
' 내 디스크에 연결된 컨테이너 생성하기 '
1. 연결하기 위한 디렉토리 만들기
⚠️ 디렉토리 만들 때 슈퍼유저가 아니면 나중에 권한이 없어서 브라우저 접속이 차단되니 무조건 슈퍼유저로!
mkdir nginx mkdir nginx/data mkdir nginx/conf
2. conf에 필요한 설정 파일을 임시 컨테이너를 생성하여 복사해오기
docker run -d nginx // 임시로 컨테이너 생성 docker exec -it [컨테이너명] /bin/bash // 컨테이너로 접속 docker cp [컨테이너명]:/etc/nginx/conf.d/default.conf/root/nginx/conf/
⚠️ 임시로 생성한 컨테이너는 삭제해주자!docker container rm -f [컨테이너명]
3. docker 구동
docker run -d --name [컨테이너명] -p 80:80 \ -v /root/nginx/conf:/etc/nginx/conf.d \ -v /root/nginx/data:/usr/share/nginx/html nginx
4. index.html 생성vi /root/nginx/data/index.html
' 톰캣 컨테이너를 만들고 웹서버와 연동해보자 '
0. 연결하기 위한 디렉토리 만들고 index.html 생성하기
⚠️ 디렉토리 만들 때 슈퍼유저가 아니면 나중에 권한이 없어서 브라우저 접속이 차단되니 무조건 슈퍼유저로!
cd /root/tomcat/data mkdir ROOT cd ROOT vi index.html
1. 톰캣 컨테이너 생성docker run -d --name [컨테이너명] -p 8080:8080 \ -v /root/tomcat/data:/usr/local/tomcat/webapps \ tomcat
2. 컨테이너의 ip 확인docker container inspect [컨테이너명]
3. nginx 컨테이너 conf 변경vi nginx/conf/default.conf
변경사항 :proxy_pass http://[컨테이너 IP 주소]:8080;
4. nginx 컨테이너 재구동docker restart [nginx에 올린 컨테이너명]
💡 Mission!
was 서버에 DB 연동하기
1. DB 생성
docker run -d --name [컨테이너명] \ -v /home/[사용자명]/mariadb/data/mysql:/var/lib/mysql \ -e MARIADB_USER=[db 계정명] \ -- env MARIADB_PASSWORD=[비밀번호] \ -- env MARIADB_DATABASE=[db 스키마명] \ -- env MARIADB_ROOT_PASSWORD=[root 비밀번호] \ mariadb
2. DB와 테이블 생성
docker exec -it [컨테이너명] /bin/bash mariadb -u [db 계정명] -p create database [스키마명]; create table [테이블명]...;
3. 하단에 첨부한 connector.jar 파일 다운로드 받아서 was 서버의 tomcat 디렉토리 아래로 넣어주고 docker 재구동
docker cp ./...connector.jar [was 서버 컨테이너명]:/usr/local/tomcat/lib/
4. was 서버의 ROOT 디렉토리 아래에 index.jsp 파일 작성해주고 서버 재구동하고 브라우저 확인!
cd /usr/local/tomcat/webapps/ROOT/ vi index.jsp docker container restart [컨테이너명]
⚠️ 이 때, index.jsp 파일에 DB_URL엔 mariadb 이미지에 올린 컨테이너의 IP 주소를 써줘야 한다! 명심하자... :)
⚠️ 결과 화면은 하단 참고!
보안관님 블로그 참고했습니다 ^^b...
오늘의 후기!
: ㅎㅎ.. 수업 후 4일 지났다고 명령어 다 까먹고 난리났다... 복습은 빨리 또 많이!
'SeSAC > 네트워크 & 리눅스' 카테고리의 다른 글
[SeSAC 성동캠퍼스 1기] 네트워크&리눅스 5일차 (0) | 2023.11.09 |
---|---|
[SeSAC 성동캠퍼스 1기] 네트워크&리눅스 4일차 (2) | 2023.11.08 |
[SeSAC 성동캠퍼스 1기] 네트워크&리눅스 3일차 (2) | 2023.11.07 |
[SeSAC 성동캠퍼스 1기] 네트워크&리눅스 2일차 (0) | 2023.11.07 |
[SeSAC 성동캠퍼스 1기] 네트워크&리눅스 1일차 (0) | 2023.11.06 |