일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 탐욕 알고리즘
- 전자레인지 문제
- 코테
- date_format
- 디버깅
- sqlplus
- java.io
- Java
- Greedy 알고리즘
- 자바스크립트 기초
- 클라우드
- docker 개념
- MySQL
- docker image
- 거스름돈
- Access Modifier
- 백준
- 브론즈
- 서브넷
- join
- debugging
- 알고리즘
- Docker 핵심
- docker
- SQL
- reference data type
- DevOps
- 프로그래머스
- 그리디 알고리즘
- greedy
- Today
- Total
나는매일가운데
Docker (1) - Docker 사용하기 본문
0. 시작하기전...
- 도커는 도구일 뿐이다 최대한 사용법에 익숙해지자
1. 도커 리터러시
- 리터러시 : 어떤 분야에 대한 지식과 이해를 가지고 그것을 활용할 수 있는 능력
(1) 컨테이너
- 배경 :
과거 항해 시 화물마다 다른 무게, 선적 방법으로 인해 선적 과정에서 발생하는 비용, 기간이 길어졌다.
=> 컨테이너를 통해 이를 규격화시킴 => 선적 과정 단축으로 인해 비용, 기간 단축 및 환적이 쉬워졌다.
과거 개발 환경을 통일 시키기 위해 다양한 app, 환경변수 설정하기 까지에 기간이 길게 걸렸다. 또한 오픈소스의 치명적인 단점인 버전 이를 해결해야 했었다.
이 처럼 컨테이너의 개념은 개발 환경, 배포를 규격화 시킴으로 인해 개발 비용, 배포, 기간이 단축되었다.
- 개념 :
- 도커의 아키텍쳐
- VM : 가상 컴퓨터 => HostOS를 사용하여 동작 => 다른 OS를 가상 머신에 설치하여 프로세스가 작동한다.
- 하이퍼 바이저 : 별도의 가상 컴퓨터를 만드는 것을 지원해주는 것.
- Docker :
HostOS와 Container를 Docker Engine을 통해 분리하여 외부 환경으로 부터 격리된 공간에서 프로세스가 동작한다.
- 가상 서버 Vs 컨테이너
- Docker : Guest OS를 사용하지 않는다 -> 가볍다
- VM : Guest OS를 사용 -> 무겁다.
- 이미지 : Java에서 class
- 컨테이너 : Java에서 Instance
- 유니온 파일 시스템 : 도커에 적층식으로 이미지 생성이 가능 => 여러개의 파일 시스템을 계층적으로 쌓아 컨테이너 이미지의 크기를 줄이는 파일 시스템
- Open Container Initiative : 컨테이너 표준 사양 책정 단체
(2) 도커
- 도커의 구성
- 컨테이너를 이미지화 하여 여러 물리 서버에서 사용이 가능하다.
- 도커 이미지
- 이미지 : 컨테이너를 생성하기위한 틀(?) => 실행되는 것이 아닌 데이터의 형태 => 컨테이너로 전환되어야 실행이 가능하다.
=> 컨테이너에 Modifier하고 이미지로 재생성해서 배포 할 수 있다.
- Repository
- 도커 허브
- 앱스토어와 유사 -> 이미지만 가져와서 run시킬 수 있다.
- public Repository
- 도커의 특징
- 독립된 환경 : 여러 개의 프로그램을 띄울 수 있고, 똑같은 app도 여러개 만들어 띄울 수 있다.
- 이미지를 만들 수 있다. : 다른 환경에서 동일한 개발 환경으로 사용이 가능하다. 따라서 환경이동이 편리하고 어플리케이션을 배포하기 쉽다.
- 커널이 없다 => 컨테이너는 이미지에 OS를 가지지 않으므로 가볍고 배포판을 쉽게 변경할 수 있다.
- 도커 레지스트리가 있다. => 도커 허브라는 레지스트리가 있기 때문에 이미지를 직접 만들지 않아도 다양한 이미지를 내려받을 수 있다. 하나의 컨테이너에 하나의 SW만 관리하면 교체가 편리하다.
- 도커 사용
- 동일한 개발환경 제공
- 새로운 버전의 테스트 환경 구축 가능 => 여러 대 만든다음 각각 다른 테스트를 시도할 수 있다.
- 동일 서버가 여러 대 필요한 경우
2. 도커 명령어들
- 도커 데몬 확인 방법
- 도커 기본 명령방법
- ex) docker container run
(1) 컨테이너 조작 관련 커맨드
- container를 생략해도 명령어 인식 가능하다.
(2) 이미지 조작 관련 커맨드
- 이미지를 내려 받거나 검색하는 등 이미지와 관련된 기능을 실행한다.
3. 도커 컨테이너 다루기
(1) 이미지 -> 컨테이너
- 명령어 입력 시 클라이언트에서 명령어를 수행 => 이미지가 없으면 도커 허브에서 puling 후 이미지를 컨테이너화 한다.
(2) 컨테이너 생애주기 (Container Life Cycle)
- docker container run => docker pull (이미지 내려받기) + docker create(컨테이너 생성) + docker start (컨테이너 실행)
즉, run을 통해 컨테이너를 생성하고 실행 할 수 있다.
- 컨테이너가 실행중이면 이미지를 제거 할 수 없다.
(3) 컨테이너 통신
- 컨테이너 간 통신을 할 수 있다. (포트포워딩을 통해)
- 포트 포워딩 :
네트워크에서 하나의 호스트로 들어오는 패킷을 다른 호스트로 전달하는 네트워크 전송 방식
컨테이너 뿐만 아니라 외부에서 들어오는 패킷또한 컨테이너의 포트와 맵핑시켜 통신을 가능하게 한다.
docker run --name ex001 -p 8080:80 -d httpd
docker run --name ex001 -p 8081:80 -d mysql
// 이 경우 호스트의 포트를 다르게 지정하였기 때문에 충돌이 나지 않지만, 호스트 포트를
동일하게 지정할 경우 충돌이 난다. 따라서 호스트 포트는 다르게 지정해 주어야 한다.
ex) 8080(호스트 포트 / 컨테이너 외부에서 접근하는 포트) : 80(컨테이너 포트) => 8080 포트로 접근하는 패킷을 컨테이너 포트인 80으로 포트 포워딩 => 외부에서 접근 가능.
- 통신 컨테이너 실습 -1
(1)
docker run --name apa000ex2 -d -p 8080:80 httpd
// 이미 생성한 컨테이너에 포트포워딩 하려면...
docker container update --publish 8080:80 mycontainer
//혹은 삭제하고 다시 만들기
// (2) 여러 아파치 서버 컨테이너 생성 후 확인
docker run --name ex003 -p 8080:80 -d httpd
docker run --name ex004 -p 8081:80 -d httpd
docker run --name ex005 -p 8082:80 -d httpd
// mysql 실행하기
docker container run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql
// -dit : 백그라운드에서 실행 및 키보드를 통해 컨테이너 내부의 파일 시스템을 조작한다.
// -e : 이 컨테이너를 만들때 접근하기 위한 환경을 지정해준다.
* docker container prune => 정지된 컨테이너 일괄 삭제
(4) 여러개의 컨테이너 연동
- 각각의 컨테이너는 도커 네트워크로 연결하여 통신하고 데이터를 주고 받는다.
- Docker Compose를 이용하여 여러개의 컨테이너를 띄워 컨테이너 간 네트워크를 설정하여 관리할 수 있다.
- Docker Compose : 컨테이너를 정의하고 실행하는 도구로, 컨테이너 간의 연결을 정의한다. 컨테이너들의 이름, 이미지, 포트, 환경변수 볼륨 등을 정의한 파일
- Dockefile : 도커 이미지를 생성하기 위한 빌드 파일
- 실습
//여러개의 컨테이너 연동하기 실습
// (1) 네트워크 생성
docker network create wordpress000net1
// (2) MySql 컨테이너 생성
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass
-e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass
mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
// (3) 워드프레스 컨테이너 생성
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80
-e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db
-e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
// (4) 컨테이너 및 네트워크 확인
docker ps
// (5) 정리
- 실습 2 레드마인 설치하기
네트워크 설정
docker network create redmine000net2
Mysql 설정
docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmibne000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
레드마인 설치하기
docker run -dit --name redmine000ex14 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmibne000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine
- 실습 3 mySQL -> mariaDB 변경
네트워크 생성
docker network create redmine000net3
MariaDB 컨테이너 생성 및 실행
docker run --name mariadb000ex15 -dit --net=redmine000net3 -e MYSQL_ROOT_PASSWORD=mariarootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASWORD=rkunpass mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
레드마인 설치하기
docker run -dit --name redmine000ex16 --network redmine000net3 -p 8087:3000 -e REDMINE_DB_MYSQL=mariadb000ex15 -e REDMINE_DB_DATABASE=redmibne000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine
(5) 볼륨
docker container exec -it (컨테이너 이름) => 컨테이너 내부로 접속
컨테이너 내부는 리눅스 환경이다.
- 도커 컨테이너 내부에 파일 넣기
- 볼륨
- 볼륨 : 스토리지의 한 영역을 분할한 것 (부피) ≒ 파티션(?)
=> 논리적인 저장소의 영역
- 볼륨 마운트 / 바인드 마운트
- 볼륨 마운트 : 도커 엔진에 위치함 즉, 도커에서 관리
- 바인드 마운트 : 운영체제 위에 존재함 / 이미 생성한 파일 또는 폴더를 바인딩함 => 네트워크 볼륨을 사용하는 것과 비슷
- 도커에서 볼륨 커맨드
'Docker & Kubernetes > Docker' 카테고리의 다른 글
Docker(2) - 도커 이미지 생성 및 도커 레지스트리 (4) | 2023.05.01 |
---|---|
Docker (1) docker 기본 (1) | 2023.04.13 |