[도커 컨테이너와 이미지 조사하기]
docker 조사하기
docker history Names
docker cp
docker cp 컨테이너이름:컨테이너내부의_특정파일경로 호스트PC_경로 // 컨테이너에서 특정 파일을 호스트 PC로 가져오기
ex)
docker cp mywebserver:/etc/apache2/sites-available/000-default.conf ./
// 호스트 PC의 ./(현재 디렉토리) 에 복사
docker cp 호스트PC_특정파일 컨테이너이름:컨테이너
ex)
docker cp 000-default.conf mywebserver:/etc/apache2/sites-available/000-default.conf
//현재 디렉토리의 000-default.conf를 해당 컨테이너의 경로에 복사한다.
컨테이너에서 특정 파일을 호스트 PC로 가져오는 명령어
반대로 호스트 PC에서 컨테이너에 특정 파일을 넣는것도 가능.
이제 기존에 /var/www/html 이었던 폴더가 /var/www/html/xxx로 변경됨 ( 설정 변경 완료 )
Docker commit
컨테이너 변경사항을 이미지 파일로 생성하는 명령어
docker commit 옵션 컨테이너_이름 이미지이름
ex)
docker commit -m "vi add" httpd_history myweb_history
컨테이너에 VIM 을 설치한 뒤, exec 로 쉘 ( /bin/bash 등) 을 실행한 뒤, vim 을통해서 000-default.conf 를 수정하면 올바르게 동작할까?
기본적으로 vim은 설치되어 있지 않기에, apt-get update (install 명령어 위해서 ) -> apt get install vim 으로 vim을 설치해야한다.
하지만, 컨테이너를 삭제하고 이미지로 다시 컨테이너 만들면 이 vim은 제거되고, 다시 설치해야만한다.
따라서 commit 명령어로 커밋해줘야한다.
docker commit -m "설명" mywebserver viweb
docker commit -m "설명" 컨테이너_이름 Names
이제 해당 컨테이너를 지우고, 똑같은 이미지 ( viweb) 을통해 컨테이너를 새로만들어도, vim을 설치하지 않아도 된다.( 커밋하여 변경사항을 업데이트 했기에)
docker diff
-컨테이너가 실행되면서, 본래의 이미지와 비교하여 변경된 파일 목록을 출력한다.
ex) 내가 어떤 파일을 추가,변경, 삭제하더라도, 결국 어떠한 파일이 "삭제" 된 것만 확인 가능.
docker inspect
- 이미지, 컨테이너 세부 정보 확인
docker logs
- 컨테이너의 출력결과(STDOUT)을 확인
[도커 활용하기: 주피터 노트북 서버 만들기]
목표
- 주피터 노트북, mysql을 각각 이미지로 실행 시킨 뒤, jupiter 노트북을 사용해서 mysql로 통신하는법을 익히기
- link 옵션 사용법을 익히기
docker run --rm -d -p 8888:8888 -v /home/ubuntu/2021_LEARN:/home/jovyan/work jupyter/datascience-notebook
이제 login하기위한 토큰을 가져와서 붙여 넣으면 된다.
이제 mysql db에 대한 이미지를 생성해주자.
mysql은 3306포트가 기본이기에 3306으로 설정.
이제 주피터 노트북에서, 이미지로 만든 mysql을 사용해보자.
1) 설정
Dockerfile에서 설정한 db명, 비밀번호로 설정해주고 비밀번호를 입력한 뒤, EC2를 사용 중이라면, EC2 보안 그룹에서 3306포트를 열어두고 실행하면, 접속에 성공한다.
자기 서버의 3306포트로 다시 접속하여 mysql의 컨테이너에 접속하는 방식이다. (자기 자신으로 부터 가져오는 것. )
컨테이너와 컨테이너를 내부에서 직접적으로 연결할 수 있는 방식: --link 옵션을 사용하면 된다!
[도커와 도커 연결하기]
--link
컨테이너와 컨테이너를 내부에서 직접적으로 연결할 수 있는 방식
컨테이너가 다른 컨테이너를 내부적인 네트워크로 연결하는 방식
보통 데이터베이스 컨테이너에는 -p 옵션을 제외해야한다.
( -p 옵션은 외부에서 접근 가능하게 만든다. 외부 ip:포트 -> 내부ip:포트 로 매핑됨... 이는 보안적으로 문제점.)
이전의 컨테이너를 없애고, -p 옵션을 제외하고 다시 컨테이너를 실행 시키자.
** 만약에 ~/ubuntu/ 에 mysqldata 폴더가 없더라도 자동 생성한다.
주피터: j (컨테이너)
폴더 --link 접속하려고하는컨테이너:새롭게만들컨테이너에서해당컨테이너를사용할새로운이름 ㅅ
mysqldb --link db컨테이너이름:j안에서컨테이너명칭 j
사용하는컨테이너 -> Jupiter 노트북이다. jupyter/datascience-notebook 을 J로 명칭하겠다.
사용할컨테이너경로 --link 사용할_컨테이너_이름:J에서식별할이름 J
docker run --rm -d -p 8888:8888 -v /home/ubuntu/2021_LEARN:/home/jovyan/work --link
mydb:myjupyterdb jupyter/datascience-notebook
이제 다시 mysql로 접속하자.
기존에는 호스트가 ec2의 ip였지만, 이제는 myjupyterdb 컨테이너와 연결되었기에 myjupyterdb로 변경할 수 있다.
기존에 -p 옵션을 통해 호스트 pc를 거쳐 주피터 노트북에서 DB 가져오는 방법
-p 3306:3306
주피터 노트북 -> 호스트PC (3306)-> 내부ubuntu 컨테이너의 3306(mysql db 컨테이너)
--link 설정으로 바뀐 과정.
주피터 노트북 -> 내부 ubuntu컨테이너의 3306(mysql db 컨테이너)
즉 --link 옵션을 통해 내부 컨테이너들간의 통신이 가능해진 것.
이렇게하면 mysql DB를 "외부 서버" 에서 접속 할 수 없기에 보안적 이점을 얻을 수 있다.
ex). 외부에 열려있는 A 컨테이너를 사용자가 사용 -> A컨테이너는 DB 컨테이너를 내부적으로 --link를 통해 연결하여 가진다.
사용자는 A를 통해 DB를 사용하지만, DB에 직접 접근할 수는 없다. ( 클래스에서 private, public 같은 느낌 )
'DevOps' 카테고리의 다른 글
[도커] Nginx 웹서버 설정 이해하기 (1) | 2023.04.20 |
---|---|
[도커] Docker Compose (0) | 2023.04.19 |
[도커] Docker File 기본 사용법 (0) | 2023.04.18 |
[도커] Mac에서 도커 세팅법 (0) | 2023.04.14 |
[도커] 리눅스 기본 지식 (2) | 2023.04.14 |