전체 보기
🐋

Docker 활용 및 배포 자동화 실습

작성일자
2023/01/10
태그
INFRA
프로젝트
책 종류
1 more property
목차

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