[Docker] Window 도커로 프로젝트 실행하기 1
환경
- Windows 10 Pro
- docker window
- CentOS 7.5
- Java 11
- Tomcat
순서
1. Docker 란?
2. Docker window 설치
3. 컨테이너 생성
4. SFTP 사용해보기
5. JAVA 설치
6. TOMCAT 설치
7. GIT 프로젝트 받기
8. MySql 컨테이너 설치, network 사용
9. 프로젝트 실행하기
10. docker compose, dockerFile 사용하기
1. Docker 란?
도커 Docker : 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀더 쉽게 사용할수 있게 만들어진 오픈소스프로젝트. 일반적으로 도커라고 하면 도커 엔진 혹은 도커에 관련된 모든 프로젝트를 의미함.
1.1 가상머신과 도커 컨테이너
* 가상화 기술
기존의 가상화 기술은 하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었다.
여러개의 운영체제는 가상머신이라는 단위로 구별되고, 각 가상 머신에는 우분투, CentOS등의 운영체제가 설치되어 사용된다. 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제(Guest OS)라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당 받아 사용함.
가상화방식을 사용할 수 있는 가상화 툴 : VirtualBox, VMware
단점 : 시스템자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생함. 또한 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을때 이미지의 크기가 크다. 즉, 완벽한 운영체제를 생성할 수 있지만 일반 호스트에 비해 성능손실, 이미지 크기가 커 배포하기 부담됨.
* 도커 컨테이너
가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 컨테이너에 필요한 커널은 호스트의 커널 공유, 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상머신에 비해 대폭 줄어든다. 따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다.
(리눅스커널 : 컴퓨터자원을 관리하는 OS의 주요 구성 요소)
요약하자면
VM은 OS위에 게스트 OS전체를 가상화하여 사용하는 방식이기 때문에 사용하는 컴퓨터의 리소스를 분할하여 사용하며 따라서 속도저하와 이미지 크기가 크다는 단점이 있다.
이를 보완하기 위해 프로세스를 격리하는 방식이 등장했다.
리눅스에서는 프로세스를 격리하는 방식을 리눅스 컨테이너 라고 하며 가볍고 빠르게 동작한다. 도커는 이 리눅스 컨테이너 방식을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 빠르고 성능손실도 거의 없다.
1.2 도커를 시작해야하는 이유
1.2.1 애플리케이션의 개발과 배포가 편리해짐
- 서버를 부팅할때 실행되는 OS를 호스트OS라고 부르며, 도커컨테이너는 호스트OS 위애서 실행되는 격리된 공간이기 때문에 호스트OS에 영향을 끼치지 않고 독립된 개발 환경을 보장받을 수 있다.
- 운영환경에 배포하려고 한다면, 해당 컨테이너를 도커이미지라고 하는 일종의 패키지로 만들어 운영서버에 전달하기만 하면 된다.
- 도커이미지는 커널을 포함하고 있지 않기 때문에 이미지 크기가 그다지 크지 않다.
- 이미지 내용을 레이어 단위로 구성하며, 중복되는 레이어를 재사용할 수 있어서 애플리케이션의 배포 속도가 매우 빨라진다.
1.2.2 여러 애플리케이션의 독립성과 확장성이 높아짐
- SW의 여러 모듈이 상호작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식을 모놀리스 애플리케이션이라고 한다. 규모가 거대해질수록 SW 자체의 확상성과 유연성이 줄어든다는 단점이 있는데, 이를 대체하기위해 마이크로 서비스(Micro-service) 구조가 떠올랐다. 웹서비스를 DB컨테이너와 웹서버 컨테이너로 분리하여 동적으로 관리할 수 있는 것처럼 마이크로서비스 구조는 여러 모듈을 독립된 형태로 구성하기 때문에 언어에 종속되지 않고 유연하고 관리가 쉬워진다. 이미지 버전을 독립적으로 관리하기 때문에 유지보수가 용이해지는데 보통 개발자가 그 구조를 직접 구현하기 보다는 도커스웜모드, 쿠버네티스 등의 컨테이너 오케스트레이션 플랫폼을 통해 사용하는것이 일반적이다.
1.3 용어정리
도커 엔진이 사용하는 기본 단위는 이미지와 컨테이너이다.
도커 이미지
컨테이너를 생성할 때 필요한 요소이며, 가상머신을 생성할 때 사용하는 iso 파일과 비슷한 개념
[저장소이름]/[이미지이름]:[태그] ex. alicek106/ubuntu:14.04
도커 컨테이너
이미지로 생성한 독립된 공간. 해당 이미지의 목적에 맞는 파일이 들어있는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있다.
1.4 동작방식
도커는 이미지 내용을 레이어 단위로 구성한다. 이미지를 통째로 생성하지 않고, 바뀐 부분만 생성한 뒤 부모 이미지를 계속 참조하는 방식으로 동작한다.
ubuntu 이미지가 Layer A,B,C로 구성되어있고 nginx 이미지가 이를 베이스로 nginx 레이어를 추가하여 구성되었다.
web app은 nginx 이미지 위에 source를 추가하여 이미지 구성되었고, web app 이미지를 수정하려면 새로운 source(Ver2)만 수정하여 다시 이미지를 만들면된다. ubuntu 와 nginx 이미지는 수정되지 않는다.
컨테이너를 생성할 때도 레이어 방식을 사용하며, 기존의 이미지를 읽기 전용으로 사용하되 그 위에 읽기/쓰기 레이어를 추가한다. 컨테이어가 실행 중 일때 생성하는 파일이나 변경된 사항만 읽기/쓰기 레이어에 저장하여 컨테이너 계층에 따로 저장한다. 때문에 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
출저
시작하세요! 도커/쿠버네티스
2. Docker Window 설치
2.1 컴퓨터 하드웨어가 가상화를 지원하는지 확인
작업 관리자 > 성능 > 가상화:사용 인지 확인
2.2 윈도우의 Hyper-V 설치
프로그램 추가/제거 > Windows 기능 켜기/끄기 > Hyper-V 체크
2.3 Docker for Windows 설치
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
Stable channel , Edge channel 중 아무거나 다운로드!
2.4 도커 실행
cmd 창에서 docker -v 입력시 Docker version 나온다.
docker images 도커 이미지 목록 출력
docker ps 시작된 컨테이너 목록 출력
docker ps -a 모든 컨테이너 목록 출력
docker ps 참고
pyrasis.com/book/DockerForTheReallyImpatient/Chapter20/22
3. 컨테이너 생성
3.1 CentOS 7 서버 만들어보기
docker search centos 로 CentOS 7 이미지 찾기
docker pull centos:7
도커 컨테이너 실행
docker run --privileged -d -i -t -p 8022:22 -p 8081:8080 --name ApiTest centos:7 /sbin/init
docker run : 컨테이너를 생성하고 실행하는 역할
-i -t : 컨테이너와 상호(interactive) 입출력을 가능하게 함
-d : -i -t 가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정한다면 -d 는 Detached 모드로 컨테이너를 실행한다. 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정함
-p : 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정함 (호스트 8022와 컨테이너 22 바인딩)
--name : 컨테이너 이름 설정
-e : 컨테이너 내부의 환경변수 설정
--privileged : 컨테이너를 Privileged 모드로 실행하면 시스템의 모든 장치에 접근할 수 있으며 커널의 기능을 대부분 사용할 수 있다.
다음단계에서 FileZilla 를 연결할 예정이기 때문에 22포트 바인딩해놨다.
docker exec -it ApiTest bash
컨테이너 접속
exec : 컨테이너 내부의 셀 사용
/bin/bash : 컨테이너 내부에 /bin/bash 프로세스를 실행
-i -t : 배시 셀을 쓸 수 있게 유지
자 이제 순수한 CentOS 서버가 생성되었다.
exit 하면 다시 Window cmd 창으로 나온다.
도커 컨테이너로 이미지 만들기
docker commit ApiTest testimg1
방금 생성한 ApiTest 컨테이너로 testimg1 도커 이미지를 생성했다.
나중에 포트나 새로운 설정을 추가할때는 이렇게 이미지를 새로 만들어서 다시 docker run 해야한다.
4. SFTP 사용해보기
4.1 CentOS7에 Filezilla연결하기
다시 ApiTest 컨테이너에 접속한다.
yum -y update
yum -y install net-tools
yum -y install firewalld
yum -y install initscripts && yum clean all
firewalld 설정
systemctl unmask firewalld
systemctl enable firewalld
systemctl start firewalld
systemctl status firewalld 상태확인
참고 : 원래 centos:7.5~ 로 만들었는데 firewalld 의 버전이 안맞아서 CentOS:7 최신버전으로 변경했다.
여기서는 systemctl 사용을 위해 아래와 같은 처리를 해야한다.
https://jenakim47.tistory.com/47?category=476176
[docker] Failed to get D-Bus connection 에러 해결
이미지 centos:7를 사용하려고 했더니 systemctl을 사용할 수가 없다 ;; ubuntu에서는 잘 됐던거 같은데 centos은 안되는게 왜케 많은지 모르겠다 [user01@master ~]$ docker run -it centos:7 bash [root@9fa1db1..
jenakim47.tistory.com
OpenSSH 설치
yum -y install openssh-server openssh-clients openssh-askpass
설정 파일 수정
Port 22 부분 주석 풀기
PermitRootLogin yes 부분 주석 풀기
# vi /etc/ssh/sshd_config
방화벽 설정
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --reload
firewall-cmd --permanent --list-all (확인용)
ssh 설치가 끝났고
그룹과 사용자 추가
groupadd dockeruser
groups 또는 cat /etc/group 로 dockeruser 생성되었는지 확인
dockeruser:x:1000:
그룹명:그룹비밀번호:그룹UID:콤마(,)로 분리된 그룹에 속한 사용자들의 아이디
useradd -g dockeruser duser1
usermod -aG dockeruser duser1 (혹시나 사용자의 그룹변경)
yum install -y passwd
passwd duser1 비번 변경
사용자(그룹)에게 관리자 권한주기
yum install sudo
사용자변경
su duser1 에서 sudo 권한 테스트해보기 (생략해도됨)
exit 입력시 다시 root 로 돌아옴
vi /etc/sudoers
# 다음을 추가
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
dockeruser ALL=(ALL) ALL
도커 컨테이너 재시작
docker stop ApiTest
docker start ApiTest
SSH 설정 확인
테스트용 디렉토리 생성
cd /home/duser1/
mkdir test
도커 api 서버 정보를 알아야 fileZilla를 사용해서 접속할수있다.
docker inspect ApiTest -f "{{json .NetworkSettings.Networks }}"
"IPAddress":"172.~~~"
근데 로컬 윈도우로 테스트하니 저 아이피말고 그냥 로컬로 확인하면 된다.
호스트 : sftp://127.0.0.1
사용자명 : duser1
비밀번호 : 변경한비밀번호
포트 : 8022
(로컬 포트 8022 로 들어오면 도커 포트22로 바인딩 된다.)
성공~~
5. JAVA 설치
아까 설치 성공한 filezilla 로 jdk 파일과 apache-tomcat 파일을 CentOS 서버로 옮긴다.
만약 파일질라 설치에 실패했다고 해도 구글 드라이브를 통해 파일을 전달할 수 있다.
참고
https://m.blog.naver.com/sssang97/221786881113
tar -zxvf jdk-11.0.6_linux-x64_bin.tar.gz
tar -zxvf apache-tomcat-8.5.51.tar.gz
ln -s jdk-11.0.6 jdk
ln -s apache-tomcat-8.5.51 tomcat
vi /etc/profile
export TOMCAT_HOME=/home/duser1/tomcat
export JAVA_HOME=/home/duser1/jdk
export PATH=${TOMCAT_HOME}/bin:${JAVA_HOME}/bin:$PATH:
(나중에 잘 사용하려면 /usr/local/ 에 위치하는게 좋다)
source /etc/profile
6. TOMCAT 설치
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
(방화벽 리스트 확인)
firewall-cmd --permanent --list-all
톰캣 실행
cd /home/duser1/tomcat/bin
./startup.sh
톰캣 확인
netstat -an | grep 8080
로컬에서 확인
http://127.0.0.1:8081/index.jsp
톰캣 종료
./shutdown.sh
참조
ftp, ftps, sftp(ssh) 개념 정리
IT를 전공하거나 아니면 실무를 접하다보면 이 놈의 ftp, ftps, sftp(ssh) 프로토콜에 대해서 이야길 하게 되거나 듣거나 사용하게 됩니다만 개념이라도 좀 정확하게 갈무리하고 접해야한다는 생각이
nhj12311.tistory.com
hyeonakim.github.io/development/2018/02/25/development-linux-1/
CentOS 7 그룹, 사용자 생성, 권한
지난 프로젝트에서는 플랫폼 담당자분께서 계정 관리를 해주셨어요. 옆에서 어떻게 하시나 지켜보려고 했지만, 빛과 같은 속도로 계정을 생성하시기에 .. 놓쳐버렸죠.. 이렇게 평생 놓치나 했는
hyeonakim.github.io