본문 바로가기
SeSAC/네트워크 & 리눅스

[SeSAC 성동캠퍼스 1기] 네트워크&리눅스 6일차

by zivvon 2023. 11. 14.
목차 접기

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 기준!

 

 

Home

Home page for Docker's documentation

docs.docker.com

 

도커 사이트에 접속해서 명령어 확인하고 설치해주자!


 

[ 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 주소를 써줘야 한다! 명심하자... :)

⚠️ 결과 화면은 하단 참고!
 

MySQL :: Download MySQL Connector/J (Archived Versions)

Please note that these are old versions. New releases will have recent bug fixes and features! To download the latest release of MySQL Connector/J, please visit MySQL Downloads. MySQL open source software is provided under the GPL License.

downloads.mysql.com

DB 연동 성공 화면

 

 

꿈꾸는 클라우드 융합 보안 전문가 : 네이버 블로그

안녕하세요!! 현재 SK쉴더스 새싹 성동 1기에서 클라우드 모빌리티 융합 보안 과정을 수강 중에 있습니다. 클라우드 융합 보안 전문가 과정에서 어떤 직무를 선택하고 어떻게 공부했는지, 노력의

blog.naver.com

보안관님 블로그 참고했습니다 ^^b...

 


 

오늘의 후기!

: ㅎㅎ.. 수업 후 4일 지났다고 명령어 다 까먹고 난리났다... 복습은 빨리 또 많이!