준비사항
- oracle virtualbox
- virtualbox에서 가상환경으로 생성할ubuntu 이미지 파일(os는 관계없음 linux로만)
- virtualbox에서 ubuntu 이미지파일을 이용하여 ubuntu 가상환경 생성
- 열 서버(webapp)이 배포되는 상태로 github repository에 push되어있어야 함
나의 경우는 virtualbox에서 ubuntu 22.04.3으로 진행함,
준비사항이 끝났다고 가정하고 ubuntu 초기설정에 대하여 다룸
ubuntu 초기설정
터미널을 단축키로 여는 걸 좋아해서 이건 꼭 해줘야한다.(내가)
gnome-terminal 터미널 열기 단축키 설정
리눅스→설정→키보드→사용자 설정 shortcut 설정
gnome-terminal
단축키는 보통 Ctrl+T로 하는 편이다.
터미널이 뜨지 않는 오류 발생시 Language 변경
Settings → Region & Language 탭 → Language를 English(Canada) 로 변경
이후 root 계정으로 접근할 수 있는지 확인해보자,
su root
정상적으로 root 계정에 접근할 수 있다면 상관없음, 그러나 su: Authentication failure root 에러가 발생한다면?
su: Authentication failure root 계정 비밀번호 설정 안했을 때
결론적으로는 root 계정의 비밀번호를 먼저 설정해줘야한다.
우분투를 처음 설치하고 root 계정은 비밀번호가 설정되어있지 않지만, 그렇다고 비밀번호 입력시 엔터만 누른다고 되는 것도 아니다.
sudo passwd root
위의 명령어를 실행해 root 계정의 비밀번호를 설정해야하는데,
아래의 다른 오류가 발생할 수도 있다.
user is not in the sudoers file" error after installing Ubuntu on VirtualBox
무슨말인지 이해는된다. 현재 root계정 비밀번호가 설정이안되어있고, 그로인해 root 계정으로 전환할 수 없으며, root 계정의 비밀번호를 설정하려면 sudo passwd root 명령어를 사용해야하는데, 현재 내 계정이 sudoers안에 없어서 sudo 명령도 못쓴다.
에러 메세지 자체는 골치아프지만,
사실 초기 설정이 안되어있을 땐 su - 명령어로 현재 계정 비밀번호를 입력하면 root 계정으로 전환할 수 있다.
다시 말하면 su root 명령어나 sudo passwd root 명령어 말고 su - 명령어로 root 계정에 접근했어야했다.
su -
입력 후 현재 계정의 비밀번호 입력 하면 root 계정으로 전환됨 아직 root 계정의 비밀번호는 없는 상태이므로,
이제 다시 sudo passwd root 명령을 사용하여 root 계정 비밀번호를 설정하고
usermod -aG sudo username
위의 명령을 통해서 내 user가 sudo 명령을 사용할 수 있도록 하자
[선택] 버추얼 박스에서 ubuntu와 내 윈도우 공유폴더 설정하기
우분투환경과 파일을 쉽게 주고받을 수 있도록 공유폴더를 설정할 수 있는데, 필수는 아니다. 우분투에서 git pull하고 하면 되니
가상환경 선택 → 설정 → 공유 폴더 탭으로 가서
- 경로 : 내 원래 pc에서 공유폴더 디렉토리
- 자동 마운트 : 예
설정하고나서, 우분투를 재부팅 할 필요 없이 우분투에서 mount해주면 폴더가 연결된다.
참고로 아래 명령어는 ubuntu에 /media/share 디렉토리가 이미 존재해야함,
/media 에서 mkdir share를 입력해 디렉토리 생성 후 입력하자
root@ubuntu22: mount -t vboxsf virtualbox_share /media/share
만약 잘못된 곳에 mount했다면
umount {내가 잘못 지정한 디렉터리}
명령어로 취소할 수 있다.
이제 vm 단에서는 준비 끝!
ubuntu에서 ssh 키 생성하여 내 프로젝트 clone하기
나중에 docker image 생성할 때 편하게 /work 디렉토리에서 일을 하자
sudo su - root
mkdir /work
cd work
또, 컨테이너 이미지에 포함될 내 Web application 프로그램을 github에서 clone해야하므로 public ssh 키가 필요하다!
github에 접근하여 내 원격 리포지터리를 clone해올 수 있는 권한을 설정해주는 것과 같다. (리눅스는 윈도우보다 보안이 세니까)
vm linux에서 public ssh 키 생성
ssh-keygen
위의 명령을 입력하면 이후 3개의 값을 입력하게 된다.
- 키를 저장할 경로( 기본값 : $HOME/.ssh/id_rsa)
- passphrase (추가로 사용할 암호, 기본값 없음)
- passphrase 확인
추가하거나 변경할 이유가 없으니까 모두 엔터 누르면 된다.
그럼 아래와 같이 ssh key를 시각화해서 보여줄 것이다.
아래 명령어로 public ssh access key의 내용을 출력하고, 출력된 내용을 전부 복사해두자
cat ~/.ssh/id_rsa.pub
vm linux에 git 설치
생성할 컨테이너 이미지에 내 webapp이 있어야 서버가 돌아가겠죠? 내 webapp을 github에서 clone하기 위해서 git 설치
sudo apt install git -y
github-계정-Settings-SSH and GPG keys-에 New SSH Key를 눌러 새 ssh key를 설정해줄건데,
Key type을 Authentication Keys로, 제목은 맘대로, 내용에 아까 복사한 내용을 붙여넣으면 된다.
위의 내용처럼 생성되면 된것이다.
아래 명령어로 git config 설정과 clone을 진행할 것이다.
git config --global user.name "BYEONGRYEOL"
git config --global user.email "lyulbyung@gmail.com"
git clone { 배포하고싶은 프로젝트git 주소}
만약 git clone 진행시 아래와 같은 오류가 발생한다면?
현재 내 계정이 /work 디렉토리에 write 권한이 없는 것을 의심해볼 수 있다.
linux 디렉토리 수정(write) 권한 부여를 위해 권한 수정하기
아래 명령어로 /work 디렉토리의 상위 디렉토리로 이동해서
cd ../
아래 명령어로 권한들과 함께 파일및 디렉토리를 확인할 수 있다.
ll (ls -al과 같음)
출력을 확인해봤을 때, w(수정) 권한이 없는게 확인되었다면
sudo chmod 777 work
모든 권한을 주던지, 아니면 root 계정에서 사용하면 된다.
(참고로 755(읽기, 실행) 권한을 주고 root 계정으로 권한을 받아서 하는 것 당연히 보안에 안전할것이다.)
도커 설치하기
https://get.docker.com/ 여기에 들어 가서 아래에 있는 명령어 1, 2, 3, 4 내용 부분 그대로 한줄씩 입력하면 설치된다.
To install the latest stable versions of Docker CLI, Docker Engine, and their
# dependencies:
#
# 1. download the script
#
# $ curl -fsSL <https://get.docker.com> -o install-docker.sh
#
# 2. verify the script's content
#
# $ cat install-docker.sh
#
# 3. run the script with --dry-run to verify the steps it executes
#
# $ sh install-docker.sh --dry-run
#
# 4. run the script either as root, or using sudo to perform the installation.
#
# $ sudo sh install-docker.sh
#
# Command-line options
잘 설치되었는지는 아래 명령어로 확인할 수 있다.
docker 설치 확인
docker -v
docker ps
docker의 설치 확인은 위의 명령어로 version과 현재 상태를 확인해볼 수 있다.
docker ps permission denied error
만약 docker ps를 실행했는데 결과가 아래와 같다면,
username@ubunut22:~$ docker ps
permission denied while trying to connect to the Docker daemon socket at
unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json:
dial unix /var/run/docker.sock: connect: permission denied
위처럼 permission denied 된 경우 현재 username user가 docker group에 포함되지 않은 상황이다.
아래 명령어로 docker group에 유저를 추가한다.
$ sudo usermod -aG docker {username}
만약에 docker 라는 이름의 group이 없다고하면 group을 생성해줘야한다.
$ sudo groupadd docker
docker단에선 내 username의 user가 권한이 있는지 아직 모르기 때문에 재부팅, 로그아웃 로그인, 혹은 아래 명령어로 변경한 설정을 반영할 수 있음
$ newgrp docker
참고로 정상적인 docker ps 명령의 출력은 아래 사진과 같아야한다.
추가로, 의존성 문제 때문에 버전을 고정하고싶다면 다음 명령어를입력한다.
sudo apt-mark hold {패키지이름}
dockerfile 생성
현재 /work 디렉토리에 내 git repository를 clone한 상태, 프로젝트 디렉토리(app.py와 동등한 위치)로 들어가서
Dockerfile을 생성한다.
vi Dockerfile
python 서버의 경우 기본적으로는 아래와 같이 작성하면 된다.
1. 도커 컨테이너의 베이스
2. python, pip 설치
3. 프로젝트 /app에 복사
4. 프로젝트 종속성 설정(라이브러리 등)
5. 포트설정
6. 서버실행
아래는 나의 dockerfile
#base가 ubuntu20.04
FROM ubuntu:20.04
# apt update 및 python, pip 설치
RUN apt-get update
RUN apt-get install python3 python3-pip -y
# /app에서 진행
WORKDIR /app
#현재 디렉토리에 있는 모든 clone한것 /app에 옮기기
COPY . /app
# pip로 필요한 패키지 설치
RUN pip3 install -r requirements.txt
# 80포트사용
EXPOSE 80
# 권한변경인데 해야하는지 잘모름
RUN chmod +x /app/app.py
# app.py 실행
CMD python3 app.py
도커 허브 계정 생성
도커 허브를 활용할 생각이라면 build하기 전에 도커 허브에 가입을 하는 편이 좋다.
왜냐하면 도커 허브 repository에 내 이미지를 push하려면
docker push {내dockerhub이름}/{이미지이름 = 리포지터리 이름}:{태그(버전)}
위 명령어를 실행해야하는데,
명령어를 잘 살펴보면 내 이미지를 어디에 어떤 태그로 push하겠다는 내용은 있으나, 무슨 이미지를 올릴지 지정하는 부분이 없다?
docker hub에 push할 이미지의 이름은 {dockerhubname}/{imagename}:{tag} 로!
이미지 이름을 저렇게 만들어야 docker push 명령어가 듣는다.
이후에 빌드 된 image들을 확인할 수 있는 명령어를 입력한 아래 사진을 보면 좀 더 이해할 수 있는데, 애초에 image name 이라는 column 조차 없고 그 자리에 REPOSITORY가 있다.
docker build로 container 이미지 생성하기
docker build --force-rm -t byeongryeol/hanghaeeats:1.0 .
build명령의 옵션을 하나하나 풀이해보면,
- docker build
- —force-rm : 중간중간 생성되는 임시 컨테이너 제거 (build 실패시 모든 컨테이너 제거 && build 성공시 임시 컨테이너 제거)
- -t : 생성될 이미지의 이름을 설정하기 위해(이 옵션이 없으면 16진수 이름이된다. docker hub에 push하고싶다면 필수인 조건)
- byeongryeol/hanghaeeats:1.0 . : 도커허브이름/이미지이름 : 태그(버전)
- . : Dockerfile의 경로 (현재는 Dockerfile이 있는 디렉토리에서 명령어를 실행하므로 .이다.)
이미지가 잘 생성되었는지는 아래 명령어로 확인한다.
docker images
(hello-world는 docker hub 설치 확인용이라서 무시하셔도됩니다.)
docker hub에 push
docker push (내dockerhub이름)/hanghaeeats:1.0
만약에 아까 빌드할때 build 옵션중 -t와 함께 이미지 이름을 {내dockerhub이름}/{프로젝트 이름}:1.0 과같이 지정하지 않았다면, 이름을 변경하면 된다.
image 이름 변경하기 (tag 명령어)
docker tag {기존 이미지 이름} (dockerhub 이름)/hanghaeeats:1.0
이후 원한다면 서버에 접속할 수 있는지 확인해 볼 수 있다.
docker hub에 run하고자하는 image가 push되어있다고 가정하고,
vm에서 방화벽 포트가 열려 있다고 가정하고, (현재 80)
docker run으로 서버 열기
docker run -it -d -p 80:8080/tcp --name {container name} {dockerhubname}/{repository}:{tag}
- -it : 터미널 입력 활성화하여 컨테이너로 전달하기 위함
- -d : container를 백그라운드로 실행 한다.
- -p 80:8080/tcp : vm환경으로 80포트로 접근한다면 container에 8080으로 port fowarding해줌
- —name {container name} : container 이름 지정
- {dockerhubname}/{repository}:{tag} : 내 리포지터리에서 tag에 해당하는 버전의 이미지를 pull 해서 run 하겠다.
vm의 public ip로 local에서 접속해보면 서버에 접속할 수 있다.