1) 실습용 AWS EC2 인스턴스 생성 및 접속
[서론]
•
AWS로 서버 구축하고 구축한 서버에 docker machine 설치, jenkins로 배포 자동화
◦
AWS에서 동일한 서버 환경 구축해 실습 진행할 예정
•
AWS에서 인스턴스를 만들어서(하나의 서버를 만들어서) 서버에 접속
•
AWS는 기본적인 성능의 서브 만듦에 있어선 12개월동안 무료임(프리티어 정책)
•
AWS 로그인 후 콘솔창 들어가서 실습 진행
•
EC2는 하나의 서버 자체를 대여해주는 서비스
[본론: 실습]
1. EC2 - 인스턴스 시작 - Amazon Machine Image로 ubuntu 18.04 버전 선택해 ubuntu 서버 만듦
•
18.04는 aws에서 오랫동안 지원할 것임
•
정확한 이름은 Ubuntu Server 18.04 LTS (HVM), SSD Volume Type (프리티어 사용 가능)
2. 인스턴스 유형으로 t2.micro(프리티어 사용가능) 유형 선택
•
docker 실습에서 성능 요구 크게 없어서 괜찮
3. 새 키 페어 생성
•
AWS의 경우 아무나 우리 서버에 접속하면 안되기에 보안 관련 문제로 키 페어 이용함
•
키 페어 이름은 Atties_Docker로 지었음
•
키 페어 유형은 .pem
•
키 페어 파일 위치는 C:\Users\PC\Documents\AWS\Atties_Docker 로 했음
4. 인스턴스 생성 후 인스턴스 보기로 실행 중인 거 확인
5. 키 페어 파일 보안 설정
•
속성-보안으로 이동해 파일에 접근할 수 있는 유저 설정
◦
속성-보안-고급-상속 사용 안함
▪
상속된 사용 권한을 이 개체에 대한 명시적 사용 권한으로 변환
◦
사용 권한 항목에서 User 제거
◦
System, Administrators 남기기 (관리자만 남기기)
•
보안설정 하는 이유
◦
서버에 접속하기 위해선 ssh라는 프로토콜 사용해 접속할 수 있음
◦
키 페어 파일(특정 서버에 접속할 수 있게 해줌)은 컴퓨터에서 누구든 이용할수없게 하기위해, 관리자만 이용할 수 있게끔 보안설정해줘야함.
◦
애초에 보안설정안해주면 서버에 접속조차 못함
6. 명령 프롬프트에서 ssh이용해 서버 접속
•
관리자 권한으로 명령 프롬프트 실행
•
키 페어 파일 존재하는 위치로 이동
•
ssh 명령어 이용해 서버에 접속
◦
인스턴스 선택 후 연결 버튼 눌러서 나오는 ssh 클라이언트의 예:에 쓰여진 명령어 복붙
◦
ssh -i "Atties_Docker.pem" ubuntu@ec2-3-39-144-84.ap-northeast-2.compute.amazonaws.com
•
연결할 건지 물어보는거 yes라 하면 서버에 접속됨
•
pwd 명령어(ubuntu 명령어) 이용해서 현재 접속한 서버에서의 사용자 위치 확인 가능
결과창
[결론]
•
AWS 이용해 docker machine 설치할 서버 만듦
•
AWS 인스턴스 생성 시 우리 서버만의 고유한 ip가 하나씩 부여됨
◦
퍼블릭 IPv4 주소 (IPv4 퍼블릭 IP) → 탄력적 ip 부여함
▪
3.39.144.84
참고: 안 쓰는 탄력적 ip 는 꼭 삭제해 줘야함. 안 그러면 비용 청구됨
•
만든 인스턴스에 접속해봤음
2) Jupyter Notebook 설치, HTTPS 적용, 시스템 서비스 설정하기
[서론]
•
docker 활용한 배포 자동화 실전 예제 위해 실습용 aws ec2 instance 만들어서 instance 접속해봤음
•
콘솔창에서 instance에 접근해 서버 관리하는 건 불편
•
gui환경으로 서버 관리하는데 도움 받기 위해 주피터 노트북 설치하자
◦
콘솔창이 아닌 웹브라우저 환경에서 서버에 바로 접근해 관리할 수 있게 해줌
[본론: 실습]
1. 주피터 노트북 설치
•
apt-get 명령어 이용해서 설치할 거라서 먼저 apt-get 명령어 업데이트 진행
◦
sudo apt-get update
•
ubuntu 14.04 버전엔 파이썬3가 기본적으로 깔려있음
•
파이썬 관련 패키지 사용할 수 있게 도와주는 python3-pip 설치
◦
sudo apt-get install python3-pip
◦
python3-pip 사용해서 주피터 노트북 설치할 수 있게 함
•
설치된 pip 이용해서 주피터 노트북 설치
◦
sudo pip3 install notebook
◦
만들어진 주피터 이용해서 서버 외부에서 서버 접근 가능
에러 발생 → 해결
•
아무나 접근 가능하면 안되니 주피터 접속을 위한 비밀번호 설정
◦
기본적으로 주피터는 argon2(sha1이제 안씀)이라는 hash 알고리즘 이용해 비밀번호 기록할 수 있게 해줌
◦
python3를 이용해서 notebook.auth 라이브러리 이용하면 됨
◦
비밀번호 설정하겠다고 password 함수 호출
ubuntu@ip-172-31-4-7:~$ python3
Python 3.6.9 (default, Nov 25 2022, 14:10:45)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from notebook.auth import passwd
>>> passwd()
Enter password:
Verify password:
'설정한 비밀번호의 hash값 나옴'
C++
복사
◦
설정한 비밀번호의 hash값 나온 건 메모장에 복붙해두기
◦
exit() 바깥으로 나오기
•
주피터 환경설정 파일 만들기
◦
서버에서 주피터 노트북 실행해서 외부에서 접속했을 때 비번 입력해야 우리 서버에 접속할 수 있도록 하기 위해 주피터 환경설정 진행하는 것임
ubuntu@ip-172-31-4-7:~$ jupyter notebook --generate-config
Writing default config to: /home/ubuntu/.jupyter/jupyter_notebook_config.py
C++
복사
•
vi 에디터 이용해 환경설정 파일 수정하기
ubuntu@ip-172-31-4-7:~$ sudo vi /home/ubuntu/.jupyter/jupyter_notebook_config.py
C++
복사
◦
맨 아래로 내려가서 a눌러 수정
c.NotebookApp.password=u'각자의 hash 값'
c.NotebookApp.ip='172.31.4.7'
c.NotebookApp.notebook_dir='/'
C++
복사
◦
get_config()로 환경설정 객체 하나 만듦
◦
password로 방금 만든 hash값 넣어줌.
◦
ip는 현재 서버의 내부 ip넣으면 됨. 콘솔상에 나오는 ip
◦
노트북 디렉토리는 루트로 설정했음(변경 가능)
◦
esc하고 :wq! 해서 저장하고 밖으로 나감
에러 → 해결
2. 루트 권한으로 주피터 노트북 실행해서 외부에서 접속할 수 있게 함
ubuntu@ip-172-31-4-7:~$ sudo jupyter-notebook --allow-root
[I 09:53:11.245 NotebookApp] Writing notebook server cookie secret to /home/ubuntu/.local/share/jupyter/runtime/notebook_cookie_secret
[I 09:53:11.484 NotebookApp] Serving notebooks from local directory: /
[I 09:53:11.485 NotebookApp] Jupyter Notebook 6.4.10 is running at:
[I 09:53:11.485 NotebookApp] http://172.31.4.7:8888/
[I 09:53:11.485 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 09:53:11.489 NotebookApp] No web browser found: could not locate runnable browser.
C++
복사
•
8888포트로 주피터 노트북 서버가 열렸음
3. 방화벽 열어주기
•
보안그룹 가서 aws 상에서 실제로 방화벽 처리로 8888포트로 언제 어디서나 누구나 다 접속할 수 있도록 방화벽 열어줌
•
보안-보안그룹-인바운드 규칙 편집 들어가서 8888포트 규칙 추가
4. 퍼블릭 IPv4 주소로 접속 가능
•
http://3.39.144.84:8888로 접속해 비번 입력
•
주피터 노트북에서 new 눌러서 터미널 열면 ssh사용 없이 웹브라우저로 터미널 사용해 서버 접속 가능
에러 → 해결
5. 주피터 노트북을 항상 실행될 수 있는 형태로 만들기
•
ctrl+z로 서버 잠시 종료
•
bg: 백그라운드 상태에서 돌아갈 수 있게 하기
•
disown -h: 소유권 포기하게 하기
6. https 적용
•
현재 실행중인 주피터 노트북 실행 종료
ubuntu@ip-172-31-3-36:/$ sudo netstat -nap | grep 8888
tcp 0 0 172.31.3.36:8888 0.0.0.0:* LISTEN 19523/python3
C++
복사
ubuntu@ip-172-31-4-7:~$ sudo netstat -nap | grep 8888
tcp 0 0 172.31.4.7:8888 0.0.0.0:* LISTEN 19523/python3
tcp 0 0 172.31.4.7:8888 180.230.78.35:13555 ESTABLISHED 19523/python3
tcp 0 0 172.31.4.7:8888 180.230.78.35:4709 ESTABLISHED 19523/python3
tcp 0 0 172.31.4.7:8888 180.230.78.35:4710 ESTABLISHED 19523/python3
tcp 0 0 172.31.4.7:8888 180.230.78.35:4716 ESTABLISHED 19523/python3
tcp 0 0 172.31.4.7:8888 180.230.78.35:4713 ESTABLISHED 19523/python3
tcp 0 0 172.31.4.7:8888 180.230.78.35:4715 ESTABLISHED 19523/python3
Plain Text
복사
◦
포트 실행중인 pid: 19523
▪
sudo kill -9 19523 로 노트북 종료시킴
•
주피터 노트북에 https 적용
◦
홈으로 경로 이동해 ssl 이란 폴더 만들고 그 안으로 들어감
ubuntu@ip-172-31-3-36:/$ pwd
/
ubuntu@ip-172-31-3-36:/$ cd /home/ubuntu
ubuntu@ip-172-31-3-36:~$ pwd
/home/ubuntu
ubuntu@ip-172-31-3-36:~$ mkdir ssl
ubuntu@ip-172-31-3-36:~$ cd ssl
ubuntu@ip-172-31-3-36:~/ssl$
C++
복사
◦
사설 인증서 만듦
sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "cert.key" -out "cert.pem" -batch
C++
복사
▪
인증서 유효기간: 365일
▪
rsa 알고리즘 이용해 key만듦
•
일반적으로 ssl인증서는 공개키 기반 구조에 입각한 알고리즘 채택함
◦
인증과정은 개인키와 공개키 두가지로 구분되는 각각의 키를 이용하는 방식을 채택함
◦
개인키와 공개키를 만듦
▪
개인키: cert.key
▪
공개키: cert.pem
에러: 인증서 생성시
◦
환경변수 파일 설정 추가
▪
주피터 이용해서 ssl통신하겠다고 명시
c.NotebookApp.certfile=u'/home/ubuntu/ssl/cert.pem'
c.NotebookApp.keyfile=u'/home/ubuntu/ssl/cert.key'
C++
복사
◦
주피터노트북 실행 → https. ssl 적용된 형태로 서버 구동중임
ubuntu@ip-172-31-4-7:~$ sudo jupyter-notebook --allow-root
[I 10:08:18.206 NotebookApp] Serving notebooks from local directory: /
[I 10:08:18.206 NotebookApp] Jupyter Notebook 6.4.10 is running at:
[I 10:08:18.206 NotebookApp] https://172.31.4.7:8888/
[I 10:08:18.206 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 10:08:18.211 NotebookApp] No web browser found: could not locate runnable browser.
C++
복사
▪
https://3.39.144.84:8888 로 접속
▪
사설인증서로 ssl통신 적용한거라서 크롬 브라우저가 우리 인증서 신뢰하지 못해 오류메시지 띄우지만 무시하고 접속할수있도록 하면 됨
•
고급-안전하지 않음으로 이동
7. 주피터 노트북을 시스템 서비스로 등록
•
ctrl+c로 서버 종료
•
jupyter-notebook 위치 찾기
ubuntu@ip-172-31-3-36:~/ssl$ which jupyter-notebook
/usr/local/bin/jupyter-notebook
C++
복사
•
서비스 파일 작성 → sudo vi /etc/systemd/system/jupyter.service
[Unit]
Description=Jupyter Notebook Server
[Service]
Type=simple
User=ubuntu
ExecStart=/usr/bin/sudo /usr/local/bin/jupyter-notebook --allow-root --config=/home/ubuntu/.jupyter/jupyter_notebook_config.py
[Install]
WantedBy=multi-user.target
C++
복사
◦
User=ubuntu
▪
aws ec2의 ssh명령어로 접속할 땐 ubuntu 계정으로 접속하게 됨
◦
ExecStart
▪
실행할 명령어
▪
sudo명령어로 주피터 노트북을 루트 권한 허용한 상태로서 설정했던 환경설정파일을 환경설정 내용으로 설정해서 구동시키겠다
8. systemcl 명령어로 주피터 노트북 서비스 구동시키기
ubuntu@ip-172-31-3-36:~/ssl$ sudo systemctl daemon-reload
ubuntu@ip-172-31-3-36:~/ssl$ sudo systemctl enable jupyter
Created symlink /etc/systemd/system/multi-user.target.wants/jupyter.service → /etc/systemd/system/jupyter.service.
ubuntu@ip-172-31-3-36:~/ssl$ sudo systemctl start jupyter
C++
복사
•
daemon을 다시 로드할 수 있게 해줌
•
주피터 서비스를 사용가능한 상태로 만들어줌
•
주피터서비스를 항상 실행상태 되도록 만들어줌
참고
9. 실제로 실행중인 주피터 서비스 확인하기
ubuntu@ip-172-31-4-7:~/ssl$ sudo systemctl status jupyter
● jupyter.service - Jupyter Notebook Server
Loaded: loaded (/etc/systemd/system/jupyter.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2023-01-01 10:16:56 UTC; 4s ago
Main PID: 19970 (sudo)
Tasks: 2 (limit: 1134)
CGroup: /system.slice/jupyter.service
├─19970 /usr/bin/sudo /usr/local/bin/jupyter-notebook --allow-root --config=/home/ubuntu/.jupyter/jupyter_not
└─19971 /usr/bin/python3 /usr/local/bin/jupyter-notebook --allow-root --config=/home/ubuntu/.jupyter/jupyter_
Jan 01 10:16:56 ip-172-31-4-7 systemd[1]: Started Jupyter Notebook Server.
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: ubuntu : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/local/bin/jupyter-n
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: [I 10:16:56.714 NotebookApp] Serving notebooks from local directory: /
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: [I 10:16:56.715 NotebookApp] Jupyter Notebook 6.4.10 is running at:
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: [I 10:16:56.715 NotebookApp] https://172.31.4.7:8888/
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: [I 10:16:56.715 NotebookApp] Use Control-C to stop this server and shut down
Jan 01 10:16:56 ip-172-31-4-7 sudo[19970]: [W 10:16:56.723 NotebookApp] No web browser found: could not locate runnable
Plain Text
복사
•
기본 주피터 실행 명령어로 주피터노트북 실행했을 때와 마찮가지로 ssl로 8888포트로 열렸다고 로그 그대로 찍힌거 확인 가능
•
q로 상태확인 마치기
•
주피터 서비스 다시 시작하고자할 땐 restart 명령 이용
◦
ubuntu@ip-172-31-3-36:~/ssl$ sudo systemctl restart jupyter
[결론]
•
서버에 주피터 노트북 설치해서 언제 어디서나 웹브라우저로 서버를 관리할 수 있도록 설정함
•
5번까지의 주피터 노트북의 경우 ssl(인증서) 적용 안 된 상태라 통신과정에서 위험함
◦
https를 적용하자
•
ssl 적용된 상태로 서버 접속
◦
중간에 악의적 사용자가 패킷 가로채도 서버에 어떤 명령어 넣는지 알아낼 수 없음
•
주피터 노트북을 시스템 서비스로서 등록
◦
지금은 aws ec2 instance(우리 서버)를 재부팅 하는 중에 작업 수행하면 노트북도 자동으로 종료되어 계속 ssh로 노트북실행하는 명령어 계속해서 넣어줘야함
◦
서버 재부팅 되었을 때에도 자동으로 주피터 노트북 자동 실행하도록 처리하기 위해 주피터 노트북을 시스템 서비스로 등록시킬 필요가 있는 거임
•
aws ec2를 재부팅해도 주피터 노트북서비스는 자동으로 실행되어 구동중인 상태될수있게 처리해줬음.
◦
항상 주피터 이용해서 서버 접속해 서버 관리 가능
•
aws ec2 서버의 기본 환경 설정 완료
3) AWS EC2에 도커(Docker) 설치 및 Dockerfile로 웹 서버 구동시키기
[서론]
•
aws ec2 인스턴스 생성 후 그 위에 주피터 노트북 설치해서 웹브라우저환경에서 손쉽게 서버 관리할 수 있게 환경설정하는거까지 완료함
•
docker 설치하고 docker 파일 작성해서 웹 서버 구동시켜보겠음
[본론: 실습]
1. docker 설치
•
docker는 다양한 컨테이너를 이미지로부터 불러와 띄운단 점에서 예상보다 많은 메모리 공간 사용할 수 있음.
◦
메모리 용량 중간중간 체크하기 → 현재 25% 사용 중
root@ip-172-31-3-36:/# df -h
Filesystem Size Used Avail Use% Mounted on
udev 473M 0 473M 0% /dev
tmpfs 98M 764K 97M 1% /run
/dev/xvda1 7.6G 1.9G 5.7G 25% /
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/xvda15 105M 4.4M 100M 5% /boot/efi
/dev/loop0 50M 50M 0 100% /snap/snapd/17883
/dev/loop1 56M 56M 0 100% /snap/core18/2632
/dev/loop2 25M 25M 0 100% /snap/amazon-ssm-agent/6312
Plain Text
복사
•
apt 업데이트 sudo apt update
•
몇 가지 util 설치
◦
sudo apt install apt-transport-https
◦
sudo apt install ca-certificates
◦
sudo apt install curl
◦
sudo apt install software-properties-common
•
curl 이용해서 실제 docker 설치하기 위해 gpg 내용 다운 받음
◦
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
•
그 내용을 apt 기능을 위한 리스트에 추가함
◦
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
◦
bionic stable 버전으로 repository list에 추가
에러 → 해결
•
update 구문 실행할수있게함
◦
docker 다운받을 수 있도록 함
◦
apt-cache policy docker-ce
•
apt로 docker 설치
◦
docker-ce를 다운받음
◦
sudo apt install docker-ce
◦
docker는 설치하게 되면 자동으로 시스템서비스로서 등록되어 언제어디서나 편하게 도커 이용 가능
▪
systemctl 명령 이용해서 도커서비스 상태 확인 가능 → 도커엔진 구동중임
root@ip-172-31-3-36:/# sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: ena
Active: active (running) since Thu 2022-12-29 18:46:24 UTC; 1min 16s ago
Docs: https://docs.docker.com
Main PID: 29101 (dockerd)
Tasks: 7
CGroup: /system.slice/docker.service
└─29101 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containe
Dec 29 18:46:23 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:23.942516888
Dec 29 18:46:23 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:23.942708948
Dec 29 18:46:23 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:23.942879998
Dec 29 18:46:23 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:23.943304584
Dec 29 18:46:24 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:24.112289839
Dec 29 18:46:24 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:24.245021226
Dec 29 18:46:24 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:24.336385592
Dec 29 18:46:24 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:24.336806521
Dec 29 18:46:24 ip-172-31-3-36 systemd[1]: Started Docker Application Container En
Dec 29 18:46:24 ip-172-31-3-36 dockerd[29101]: time="2022-12-29T18:46:24.370931831
lines 1-19/19 (END)
Plain Text
복사
2. 이미지 다운 받아 실행
•
이미지 다운로드
◦
pull: 특정 서버 파일 자체를 이미지 형태로 다운받을수있게 해줌
◦
docker pull hello-world
•
이미지 확인
◦
docker images
root@ip-172-31-3-36:/# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:c77be1d3a47d0caf71a82dd893ee61ce01f32fc758031a6ec4cf1389248bb833
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
root@ip-172-31-3-36:/# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 15 months ago 13.3kB
Plain Text
복사
3. 다운받은 이미지를 컨테이너로 만들어 띄우기
•
컨테이너 만들어 띄우기
docker run hello-world
◦
우리 서버 위에 하나의 서버가 별도로 더 생성되어 서버가 동작하고 작업 종료된거임
•
동작한 컨테이너 확인
docker ps -a
◦
hello는 사용 마쳐진 상태인거 확인 가능
•
컨테이너 id 확인해 도커 컨테이너 삭제
◦
docker rm cd14b2c2ee6d
◦
삭제하더라도 이미지 파일은 그대로 남아있음
▪
docker images
◦
언제든 다시 run으로 컨테이너 만들 수 있음
4. docker 파일 직접 작성해 하나의 서버 이미지 직접 만들어보기
•
경로 이동 → cd /home/ubuntu
•
example 폴더 만들기 → mkdir example cd example
•
docker 파일 만들기
◦
sudo vi Dockerfile
▪
docker 파일의 이름은 고정임 → Dockerfile
◦
파일 내용
FROM ubuntu:18.04
MAINTAINER Seoyeon Choo <choo000407@naver.com>
RUN apt-get update
RUN apt-get install -y apache2
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
Plain Text
복사
▪
FROM → 우리가 만들 서버 이미지는 ubuntu:18.04버전으로 구동함
▪
MAINTAINER → docker file 작성자
▪
ubuntu 18.04 서버(컨테이너)가 구동되었다면
•
서버가 웹서버 간단히 구동할수있게 설정할 거임(apache2)
•
RUN apt-get update → 서버가 apt-get update 실행할 수 있게 함
•
RUN apt-get install -y apache2 → apache2 웹 서버 설치할 수 있게 함
◦
-y는 무조건 yes option 붙여서 설치하겠단 의미
•
EXPOSE 80
◦
뒤에 주석 있으면 오류남
◦
apache 웹서버는 기본적으로 80 포트를 이용함.
◦
컨테이너를 실제로 구동하고있는 서버컴퓨터에서 컨테이너 접속위해 몇번 포트이용해 접속할지 설정 가능
◦
apache 웹서버의 기본포트인 80번 포트를 열수있게 만들어줌
•
CMD [”apachectl”, “-D”, “FOREGRROUND”]
◦
특정한 컨테이너는 특정 작업 실행하자마자 곧바로 종료되기에 기본적으로 아파치가 항상 실행중인 상태가 되게 하기 위해 apachectl을 항상 구동 중인 상태(데몬 상태)로 만들어줌
•
docker 파일 빌드해보기
◦
docker build -t example .
▪
docker 파일의 이름(태그) 붙일 수 있음 → example로 지음
▪
. → 현재 경로에서 빌드 수행할 수 있게 함
▪
자동으로 도커 이미지를 하나 만듦
▪
도커 이미지는 하나의 서버로서 명령 실행함
▪
서버 이미지에 아파치 서버 정상적으로 깔림
에러
docker images → 이미지 명단 확인
◦
이미지 이용해 웹 서버 컨테이너 구동시키기(이미지 구동시키기)
▪
docker run -p 80:80 example
•
example 이미지는 실제로 컨테이너로 구동될 때 80번 포트가 열림.
•
80번 포트와 아마존 ec2 서버의 포트 연결시켜줘야함.
•
p 옵션으로 왼쪽엔 서버(호스트)의 포트, 오른쪽엔 컨테이너의 포트 넣어 연결됨
•
호스트 서버의 80번 포트에 접속햇을 때 사용자는 컨테이너의 80번 포트에 접속할 수 있게 됨
▪
aws ec2 인스턴스의 보안그룹에서 방화벽 설정해주기
http 선택해서 80번 포트 열리도록 설정
◦
우리 서버의 80번 포트 접속해보기
▪
http://3.39.144.84:80
▪
에러) err_ssl_protocol_error
•
해결) https 아직 안했는데 https로 접근했음…
•
현재 실행중인 컨테이너 모두 제거
◦
새 터미널 열어서
◦
docker rm -f `docker ps -a -q`
▪
f → 무조건 삭제
▪
a, q → 현재 존재하는 모든 컨테이너 명단 가져와 전부 제거
4) 도커(Docker) 이미지로 Apache 및 PHP 개발환경 구축하기
서론
•
80번 포트로 웹서버 포함되어있는 컨테이너 구동 중
◦
aws ec2 인스턴스에 도커 설치하고, 도커파일 작성해 아파치 웹서버 동작할수있게함
◦
포트 개방해 하나의 웹서버가 우리 서버에 구동될 수 있게 개발해봤음
•
아파치 웹서버만 포함되어있는 도커이미지 수정해 php까지 추가해보겠음
•
볼륨 공유할수있게해서 php소스코드가 동작할수있게 개발해보겠음
본론: 실습
1. DockerFile 수정해 php 설치
•
cd home/ubuntu/example
•
sudo vi Dockerfile
•
기존엔 서버 이미지 만들 때 아파치만 설치할 수 있게 만들었음
•
이제 아파트 설치 이후 php까지 설치할 수 있게 하겠음
FROM ubuntu:18.04
MAINTAINER Seoyeon Choo <choo000407@naver.com>
RUN apt-get update
RUN apt-get install -y apache2
RUN apt-get install software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y php5.6
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
Plain Text
복사
•
빌드 → docker build -t example . → 중간에 설치환경 묻는 질문 답 못함
•
설치환경 묻는 명령 나오는 거 방지(사용자 인터렉션 방지)
◦
환경 변수 설정 진행
FROM ubuntu:18.04
MAINTAINER Seoyeon Choo <choo000407@naver.com>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y apache2
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y php5.6
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
Plain Text
복사
•
재빌드 → docker build -t example .
Successfully built a3ff79bb7f78
Successfully tagged example:latest
root@ip-172-31-4-7:~/example# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
example latest a3ff79bb7f78 About a minute ago 270MB
<none> <none> f39756a00c04 2 hours ago 203MB
ubuntu 18.04 251b86c83674 3 weeks ago 63.1MB
hello-world latest feb5d9fea6a5 15 months ago 13.3kB
Plain Text
복사
◦
example이라는 새로운 이미지 만들어짐
◦
실패했거나 기존에 존재하는 example 이미지는 none으로 바뀜
2. 안쓰는 이미지 파일 삭제
•
사용 중이지 않은 이미지들 삭제
◦
docker rmi -f 이미지id
◦
현재 특정 컨티이너에서 구동중인 이미지는 삭제안될 수 있음.
▪
컨테이너부터 삭제하기 → docker rm -f 컨테이너id
root@ip-172-31-4-7:~/example# docker images -> 도커 이미지id 확인
REPOSITORY TAG IMAGE ID CREATED SIZE
example latest 14c1a9f46dc5 7 minutes ago 270MB
ubuntu 18.04 251b86c83674 3 weeks ago 63.1MB
hello-world latest feb5d9fea6a5 15 months ago 13.3kB
root@ip-172-31-4-7:~/example# docker ps -a -> 도커 컨테이너id 확인
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Plain Text
복사
•
컨테이너 전부 삭제
◦
docker rm -f `docker ps -a -q`
•
도커 이미지 전부 삭제
◦
docker rmi -f `docker images`
3. 빌드한 example 리포지토리를 컨테이너로서 띄어보기
•
docker run -p 80:80 -v /home/ubuntu/example/html:/var/www/html example
◦
80번 포트 열어줌
◦
volume 옵션 넣어줌 → 마운팅
▪
호스트: 현재 폴더의 html
▪
호스트를 컨테이너 내부에 있는 var/www/html 경로를 서로 연결해줌
•
php 소스코드가 놓이는 기본경로임
▪
호스트에 어떠한 파일 넣어주면 자동으로 컨테이너의 해당 경로에 실제로 파일이 놓인 것과 같은 효과를 냄
◦
결과 확인 → http://3.39.144.84:80
◦
docker run으로 컨테이너 얼마든지 띄울 수 있음
▪
81:80 → 81번 포트를 열어 컨테이너의 80번 포트와 연결할 수도 있음
4. php 소스 코드 작성
•
경로 이동 및 index.php 파일 생성
◦
cd /home/ubuntu/example/html
◦
sudo vi index.php
•
index.php 코드 작성
◦
<?php phpinfo(); ?>
•
결과 확인
◦
서버에 설치된, 컨테이너 안에 설치되어있는 php버전명과 각종 환경설정내용이 출력됨
◦
성공적으로 php를 우리의 컨테이너에 설치해서, 작성한 php소스코드를 웹서버에서 확인한 것임
결론
•
php와 apache가 설치되어있는 하나의 이미지를 만들어봤음
•
컨테이너 장점
◦
컨테이너를 새롭게 만드는 과정만으로도 새롭게 컨테이너 띄울 수 있기에, 다양한 웹서버를 하나의 서버 내에서 여러 개 만들어서 구동 가능
◦
서비스 자체를 배포하고 관리하는 과정에 있어 편리함을 얻을 수 있음
5) Docker로 MySQL 컨테이너 만들어 보기
서론
•
docker 이용해서 apache와 php 개발 환경 설치되어 있는 컨테이너 띄어봤음
•
docker 이용해서 하나의 mysql 데이터베이스가 포함되어있는 컨테이너 만들어보겠음
본론: 실습
1. 모든 도커 컨테이너, 이미지 삭제
•
docker rm -f `docker ps -a -q`
•
docker rmi -f `docker images`
2. MYSQL 도커 컨테이너 띄우기
•
mysql은 기본적으로 도커허브에 존재하는 이미지임
•
별도의 가정없이 즉시 도커허브에서 mysql이미지 다운받아 사용 가능함
•
docker run -d -p 9876:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.6
◦
바로 run명령어 이용해 우리 서버의 9876포트와 mysql의 기본 포트인 3306포트를 연결
◦
환경변수로 mysql비밀번호 지정
◦
mysql:5.6 → 다운받을 이미지
3. MYSQL 도커 컨테이너 접속하기 - 방법(1) 컨테이너 접속 후 mysql 접속
•
docker exec -it 72624659b71b /bin/bash
◦
exec명령어 이용해 컨테이너 접속
◦
bash명령 실행할 수 있게 해서 해당 컨테이너에 접속한 것과 같은 효과 낼 수 있음
◦
72624659b71b는 컨테이너id
•
mysql -u root -p
◦
mysql 실행해 접속
◦
이후 비밀번호(위에서 password라고 지정함) 입력해 로그인
•
데이터베이스 만들기
◦
create database test; // db 생성
◦
show databases; // db명단 확인
•
host로 돌아가기
◦
exit 두 번 // mysql, 컨테이너 둘다 나가서 host로 돌아가기
4. MYSQL 도커 컨테이너 접속하기 - 방법(2) 컨테이너ip 이용해 접속
•
docker inspect 컨테이너id
◦
컨테이너 안에 설치된 mysql에 접속해야 해서
◦
docker 컨테이너의 세부 정보 확인
•
세부 정보의 맨 아래쪽에서 Networks.bridge.IPAddress 로 ip주소 확인
◦
"IPAddress": "172.17.0.2"
•
sudo apt install mysql-client-core-5.7
◦
컨테이너ip 이용해 접속할 땐 mysql 이용해 접속 가능함
◦
aws ec2 인스턴스에 mysql 깔기
•
mysql -u root -p --host 172.17.0.2 --port 3306
◦
컨테이너ip주소와 포트 넣어주어, 컨테이너에 포함되어있는 mysql에 접속하기
5. MYSQL 도커 컨테이너 접속하기 - 방법(3) 호스트ip 이용해 접속
•
mysql -u root -p --host 127.0.0.1 --port 9876
◦
호스트 자기 자신의 9876 포트로 접속
6. MYSQL 컨테이너 실제로 사용 잘 안 함
•
도커 컨테이너는 언제든 제거될 수 있단 점에서 일반적으로 도커 컨테이너를 mysql서버로 이용하진 않음
•
mysql은 말그대로 다른 사용자들의 데이터가 영구적으로 기록될 수 있는 공간이어야 해서 컨테이너처럼 일시적인 서버로서 mysql을 이용하지 않음
•
일반적으로 aws rds와 같은 데이터베이스 기능 많이 이용함
7. 관리자 유저 만들기
•
mysql 접속 → mysql -u root -p --host 172.17.0.2 --port 3306
•
관리자 역할의 유저 만들기
◦
create user 'test'@'%' identified by 'password';
◦
test라는 이름의 유저 만듦
◦
비밀번호는 password라고 지정함
•
유저에게 권한 주기
◦
grant all privileges on . to 'test'@'%';
◦
test 계정에 권한을 주고 외부에서 접속할 수 있게 설정하기
8. 외부에서 db 접속 테스트
•
컨테이너 재시작
◦
exit
◦
docker ps -a
◦
docker restart 72624659b71b
•
인바운드 규칙 편집
◦
9876 포트 열어주기
•
HeidiSQL 이용해 db 접속 [참고만 함]
◦
호스트명: aws ec2 인스턴스 공인ip
◦
사용자: test
◦
비밀번호: password
◦
포트: 9876
결론
•
docker mysql 이미지 이용해 mysql 컨테이너 띄어봤음
6) PHP 컨테이너와 MySQL 컨테이너 연동해보기
서론
•
mysql 컨테이너와 php 컨테이너를 각각 분리해서 php와 mysql 연동해볼 것
본론: 실습
1. php 컨테이너 띄우기
•
mysql과의 연동 위해 php관련 패키지 추가 설치
◦
cd /home/ubuntu/example
◦
sudo vi Dockerfile
FROM ubuntu:18.04
MAINTAINER Seoyeon Choo <choo000407@naver.com>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y apache2
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y php5.6
RUN apt-get install -y php5.6-mysql # 추가함
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
Plain Text
복사
•
도커 파일 build
◦
root@ip-172-31-4-7:~/example# docker build -t example .
•
만들어진 이미지 이용해 컨테이너 띄우기
◦
docker run -p 80:80 -v /home/ubuntu/example/html:/var/www/html example
2. php문서 작업
•
index.php를 vi로 열기 혹은 주피터로 열기!(주피터로 열길 추천)
root@ip-172-31-4-7:/# cd home/ubuntu/example/html
root@ip-172-31-4-7:~/example/html# ls
index.php
root@ip-172-31-4-7:~/example/html# cat index.php
<?php phpinfo(); ?>
root@ip-172-31-4-7:~/example/html# sudo vi index.php
Plain Text
복사
◦
이전 코드는 php의 기본 버전 정보 출력하도록 작성했었음
◦
mysql과 연동할 수 있도록 작업하기
•
index.php → mysql 버전 띄어보기
<?php
$conn=mysqli_connect(
'3.39.144.84',
'test',
'password',
'test',
'9876'
);
if(mysqli_connect_errno()){
echo "Failed to connect to MySQL: ".mysqli_connect_error();
}
$sql = "SELECT VERSION()";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
print_r($row["VERSION()"]);
?>
Plain Text
복사
결론
•
db는 실제론 컨테이너 이용하지 않음
7) AWS RDS를 이용한 데이터베이스 구축
서론
•
aws rds 이용해서 영속성 가지는 (컨테이너 꺼지더라도) db 구축
본론: 실습
1. RDS 데이터베이스 생성
•
한글 파라미터 설정
◦
rds - 파리미터 그룹 - 파라미터 그룹 생성
▪
파리미터 그룹: 데이터베이스 설정관련한 부분
▪
파라미터 그룹 패밀리: mysql5.7
▪
그룹이름: docker-mysql
▪
생성
◦
생성한 파리미터 선택 후 파리미터 그룹 작업 - 편집
▪
docker-mysql 파리미터 수정
▪
char 검색
•
변경가능한 모든 값을 다 utf8으로 바꾸기
▪
collation 검색
•
변경가능한 모든 값을 다 utf8_general_ci로 바꾸기
▪
변경사항 저장
•
데이터베이스 생성
◦
엔진: mysql 선택
◦
버전: mysql 5.7.40 선택
◦
템플릿: 프리티어 선택
◦
db 인스턴스 식별자: docker-mysql
◦
마스터 사용자 이름: user
◦
마스터 암호: 비밀~
◦
초기 데이터베이스 이름: TEST
◦
DB 파라미터 그룹: docker-mysql
•
데이터베이스 인스턴스의 보안그룹
◦
인바운드 규칙 편집
▪
기본방화벽 설정: 특정 소스에서만 접근 가능
▪
실습용이니 기존 규칙을 0.0.0.0/0으로 편집
▪
난 생성했음
•
데이터베이스 인스턴스의 엔드포인트
◦
해당 mysql에 접속하기 위한 주소
◦
주소만 알고 있으면 누구나 접근 가능
2. php문서 편집
•
정확한 접속설정 내용 들어가게 설정하기
◦
host 주소로 데이터베이스 주소 넣기
◦
port 번호 3307으로 바꾸기
◦
비밀번호도 바꾸기
<?php
$conn=mysqli_connect(
'docker-mysql.cgbr3pjfc7a1.ap-northeast-2.rds.amazonaws.com',
'user',
'비번',
'TEST',
'3306'
);
if(mysqli_connect_errno()){
echo "Failed to connect to MySQL: ".mysqli_connect_error();
}
$sql = "SELECT VERSION()";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
print_r($row["VERSION()"]);
?>
Plain Text
복사
•
페이지 재접속
3. MYSQL 컨테이너 지워주기
•
docker rm -f 컨테이너id
결론
•
aws rds db서버 구축해서 mysql 컨테이너 이용 안하고 안전하게 기록하는 db 만들 수 있게 됐음
•
dockerfile, 각종 설정파일 깃헙에 올려서 관리하는 법 배울 것임
8) GitHub에 Docker 프로젝트 올리기
본론: 실습
1. 리포지토리 생성
•
private으로 했음
2. 만든 리포지토리와 서버 연동
•
클론받기
◦
주피터 노트북 터미널에 git 입력
▪
aws ec2의 ubuntu 18.04버전엔 깃 설치되어있음
◦
cd home/ubuntu
◦
git clone https://github.com/ChooSeoyeon/Docker-Practice.git
에러) remote: Support for password authentication was removed on August 13, 2021.
◦
cd Docker-Practice
•
Dockerfile 만들기
◦
sudo vi Dockerfile
◦
생성 후 저장만 하고 주피터로 편집함
◦
이전에 만들어둔 example의 Dockerfile 그대로 복붙
FROM ubuntu:18.04 # ubuntu18.04에 특정 프로그램 설치한 이미지 만들 거임
MAINTAINER Seoyeon Choo <choo000407@naver.com>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y apache2 # 설치할 프로그램
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y php5.6 # 설치할 프로그램
# php웹서버를 구동시킴
RUN apt-get install -y php5.6-mysql # mysql과 연동 위함
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
Plain Text
복사
▪
설명 위해 주석 달았음. 주석이 문제 될 수도 있음
•
php 파일 만들기
◦
주피터 노트북에서 new-TextFile
◦
이것도 이전에 만들어둔 거 복붙
•
일반적으로 특정 프로젝트에 도커 기능 포함되는 경우, 도커파일과 해당 프로젝트의 소스코드를 한꺼번에 같은 경로에 둠.
◦
한꺼번에 빌드해서 사용할 수 있도록 하기 위함.
3. 깃에 올리기
•
git add . # 전체 파일 git에 반영
•
git commit -m “초기 프로젝트 구성”
•
git push
결론
•
다음 시간엔 dockerhub에서 자동으로 github 소스코드 참고해서 도커이미지 빌드할 수 있도록 처리하겠음
9) DockerHub와 GitHub 연동하기
서론 ⇒ 지금은 유료임.. 패스..
•
소스코드 수정해서 깃헙에 업로드만 하면 자동으로 dockerhub에서 이를 감지해 dockerfile이용해 다시 빌드 수행해줌
•
도커이미지를 컨테이너로 쉽게 띄울 수 있음
본론: 실습
1. 도커허브 리포지토리 생성
•
name: Atties
•
visibility: Private