본문 바로가기

프로그래밍/BackEnd Study - Node.js, Docker

2021-02-11 AWS EC2 서버에 Docker Image 받고 실행하기

Docker를 처음 사용해 보면서 다양한 문제를 겪었다. 본 항목에 여러 시행착오를 기록해 두었다.

EC2 Ubuntu 서버에 Docker 설치하기

Ubuntu에 Docker를 설치하기 위해 우선 apt-get을 업데이트한다.

sudo apt-get update

Docker를 설치하기 전 Docker 사용에 필요한 Dependancy를 미리 설치한다. 다음 네 개의 명령어를 실행하면 된다.

sudo apt install apt-transport-https
sudo apt install ca-certificates
sudo apt install curl
sudo apt install software-properties-common

이후 curl을 사용해 Docker를 설치한 뒤 apt-key를 추가한다. 다음 명령어가 정상적으로 실행되었다면 OK가 출력된다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

apt repository를 등록 및 업데이트하고 docker-ce를 설치한다.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/
ubuntu bionic stable"

sudo apt update
sudo apt install docker-ce

설치가 완료되면 다음 명령어를 통해 Docker를 실행할 수 있다.

sudo systemctl start docker

Docker Hub에 게시한 Image 받기

EC2 Ubuntu 서버에서 Docker Hub의 Image를 받으려면 다음과 같이 입력한다.

sudo docker pull IMAGE_NAME:TAG_NAME

SFTP로 EC2에 파일 전송

db.js 파일에는 서버의 중요한 연결 정보(IP, DB 사용자 ID 및 비밀번호 등)가 포함되어 있으므로, .dockerignore로 제외하였다. 하지만 여전히 db.js가 없으면 오류가 발생하므로, 로컬 작업 환경에 있는 파일을 EC2 서버로 옮길 필요가 있다. wget 명령어를 사용하여 구글 드라이브에 게시한 파일을 받으려 하였으나, 받은 파일이 알아볼 수 없게 변조되어 간편하게 FTP 소프트웨어인 FileZilla를 활용하기로 하였다.

FileZilla
Advertisement: Welcome to the homepage of FileZilla®, the free FTP solution. The FileZilla Client not only supports FTP, but also FTP over TLS (FTPS) and SFTP. It is open source software distributed free of charge under the terms of the GNU General Public License.
https://filezilla-project.org/

FileZilla 설치 이후 열린 화면에서, 빠른 연결을 통해 연결을 시도하였으나 SSH 인증이 설정이 되어있지 않았다. 편집-설정의 SFTP 탭에서 접속용 Private Key를 등록할 수 있다.

키 파일 추가를 선택해 *.ppk 파일을 등록하여 서버 계정을 인증할 수 있다. *.ppk파일은 PuTTYgen을 사용해 생성한다.

위 입력창의 호스트에는 서버의 IP주소, 사용자명에는 ubuntu 계정, 비밀번호는 있을 경우 입력하고 SSH 인증 접속일 경우 아무것도 입력하지 않아도 된다. 포트는 Console Program들을 통해 접속하기 위해 인바운드 규칙에 설정해 둔 22번 포트로 하였다. 빠른 연결을 눌러 EC2 볼륨에 저장된 파일을 조회 및 편집할 수 있다.

연결이 되었다면 위와 같이 원하는 폴더에 접속할 수 있으며 왼쪽은 로컬 개발 환경의 파일, 오른쪽은 원격 서버의 파일 트리이다. 옮기고자 했던 db.js파일을 왼쪽에서 찾아 오른쪽에서 원하는 폴더에 Drag & Drop하면 된다. / Directory 등은 root 권한이 없으면 이용할 수 없으므로 권한이 있는 폴더에 전송해야 한다.

cat db.js한 결과

Docker Image 수정

Docker Image를 Docker Hub에서 Pull한 뒤 존재하지 않는 db.js를 로컬에서 추가해야 했으나 Docker의 Image 내 파일은 로컬 장치의 디렉토리에 접근하는 방식으로는 접근할 수 없다. 하지만 Docker 명령어를 활용하여 Image 내 파일을 수정할 수 있다. 정확히는, Docker Image를 Container로 Build한 뒤 해당 Container에서 파일을 수정, 다시 이를 Commit하여 새로운 이미지를 로컬에만 만드는 방식을 사용했다.

파일을 이미지 내의 원하는 폴더로 복사하려면 다음과 같이 입력한다.

sudo docker cp SRC_FILE CONTAINER_NAME:/DEST_LOCATION

즉 나는 다음과 같이 입력하였다.

sudo docker cp ./db.js infallible_hertz:/app/lib/

* infallible_hertz는 Docker에서 임의로 설정한 Container 이름이다.

Dockerfile에서 작업 폴더의 이름을 /app으로 하였으므로 해당 폴더 내에서 자신의 프로젝트 파일 구조에 맞게 파일이 위치하도록 하면 된다. 이후 Commit은 다음과 같이 진행한다.

sudo docker commit CONTAINER_NAME [IMAGE_NAME] 

IMAGE_NAME은 생성될 Image의 이름을 정할 때 쓰이며, 입력하지 않으면 이후 docker images 명령어로 조회했을 때 <None>이라는 이름으로 생성된다. 나는 다음과 같이 입력하였다.

sudo docker commit infallible_hertz 20210211node-test

위와 같이 입력한 뒤 docker images 명령어로 조회하면 새 Image가 생성되어 있다. 다음과 같이 입력하여 변경된 이미지의 Container를 실행하면 된다.

sudo docker run -d -p 8080:3000 20210211node-test

* 회색으로 처리한 부분은 detached mode를 위한 -d Option, 포트 포워딩을 위한 -p Option 및 매개변수이다.

실행 중인 Container를 확인하려면 docker ps 명령어를, 이전에 종료된 Container까지 확인하려면 docker ps -a 명령어를 사용한다.

정상적으로 서버가 실행되고 있는 것을 PostMan을 사용하여 확인하였다. 이제 EC2 서버에는 MySQL과 BackEnd 서버가 같이 실행되고 있다.

실행 직후 종료되는 Container

Node.js 서버 및 Dockerfile이 정상적으로 작성 및 포함된 Docker Container를 실행하였으나 실행이 즉시 종료될 때가 있다. docker ps -a 명령어로 확인해 보면 다음과 같이 종료되었다는 문구가 표시된다.

이러한 상황이라면, 서버 스크립트 혹은 Docker Container 실행에 문제가 발생한 것이므로 다음과 같이 입력하여 특정 컨테이너에 발생한 문제가 무엇인지 파악할 수 있다.

sudo docker logs CONTAINER_NAME

다음은 Log의 예시이다.

위 사례는 db.js를 복사해 넣기 전 해당 파일을 찾을 수 없어 서버가 바로 종료된 것이다. 위와 같은 방식으로 Container에 발생한 문제를 확인할 수 있다.

참고 자료

[Docker] Ubuntu 18.04 도커 시작하기
개발 실전 입문 책을 바탕으로 작성 한 내용입니다:) - 우분투는 apt 패키지 관리자를 사용, 먼저 패키지 목록 업데이트 $ sudo apt update -y - 도커CE는 몇가지 패키지에 의존하므로, 아래 4가지 패키지를 설치한다 $ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common - 도커 패키지 저장소를 apt에 등록한다.
https://soyoung-new-challenge.tistory.com/52
Install docker on AWS EC2 Ubuntu 18.04 (script method) | GeekyLane
Whenever it comes to run or deploy a particular piece of code or software or a server it can be, docker is the mainstream answer and solution for the same. Moreover, aws ec2 + docker combined leads to great power. In today's post, we are going to learn about " Install docker on aws ec2 ".
https://geekylane.com/install-docker-on-aws-ec2-ubuntu-18-04-script-method/
docker pull
Pull an image or a repository from a registry Most of your images will be created on top of a base image from the Docker Hub registry. Docker Hub contains many pre-built images that you can pull and try without needing to define and configure your own.
https://docs.docker.com/engine/reference/commandline/pull/
FileZilla Forums
Moderator: Project members boco Contributor Posts: 25403 Joined: 2006-05-01 03:28 Location: Germany For Public key authentication to work, FileZilla needs to know the private key.
https://forum.filezilla-project.org/viewtopic.php?t=50166
Docker - 실행하자마자 exit 될 경우
간단한 장고 백엔드 프로젝트와 그 환경을 이미지로 만들어서 도커 컨테이너를 실행할 때, 정상적으로 실행되지 않고 바로 exit 될 수 있습니다. docker ps 했을 때 목록에 없고 docker ps -a 를 실행하면 exited 라고 돼있을 겁니다. 이 때 shell로 들어가서 확인하는 방법도 있지만 docker run -i -t ubuntu /bin/bash 로그를 확인하면 좀 더 쉽게 어디서 오류가 났는지 확인할 수 있습니다.
https://velog.io/@swhybein/Docker-%EC%8B%A4%ED%96%89%ED%95%98%EC%9E%90%EB%A7%88%EC%9E%90-exit-%EB%90%A0-%EA%B2%BD%EC%9A%B0
[Docker] 도커 이미지와 컨테이너 삭제 방법
도커 이미지는 docker images 명령어로 보면 점점 늘어나는 것을 확인할 수 있다. 이것들은 어떻게 하면 삭제할 수 있는지를 정리했다. 컨테이너 삭제 동작중인 컨테이너 확인 $ docker ps 정지된 컨테이너 확인 $ docker ps -a 컨테이너 삭제 $ docker rm [컨테이너id] 삭제된 것 확인 $ docker ps -a 복
https://brunch.co.kr/@hopeless/10
[Docker] Docker cp : host 에서 Container 로 file copy
host , docker container file copy host filesystem 에서 docker 의 container 에 file 을 copy 하고 싶을 때 1. host -> docker container - test file 생성 - docker cp [hostFilePath] [container_name]:[..
https://hello-bryan.tistory.com/163
[Docker] 도커 파일 복사 (로컬 컨테이너)
도커 컨테이너 안에 있는 파일을 로컬로 복사하는 방법과 로컬의 파일을 컨테이너로 복사하는 명령어를 간단히 알아보자. docker cp 라는 명령어로 간단히 가능하다. "tmp-container"라는 컨테이너 내부에 "/root/data/test.md" 라는 파일이 있다고 하자. 이 파일을 로컬(호스트)의 "~/data/" 위치로 가져오려면 다음과 같이 하면 된다. $ docker cp tmp_container:/root/data/test.md ~/data/ cp 명령어 뒤에 컨테이너 이름과 컨테이너 내부 데이터 경로를 ":" 로 구분해 적어준다.
https://itholic.github.io/docker-copy/
Where are Docker Images Stored? Docker Container Paths Explained
Docker has been widely adopted and is used to run and scale applications in production. Additionally, it can be used to start applications quickly by executing a single Docker command. Companies also are investing more and more effort into improving development in local and remote Docker containers, which comes with
https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/
Ubuntu 에서 Docker 로 폴더 or 파일 옮기기(복사하기)
Ubuntu 가상머신에서 openface를 돌려보던 중 image 파일을 도커로 옮길 필요가 있어서 구글링으로 알아본 내용을 공유하려 합니다. Windows 10 운영체제에 VMware를 설치하여 가상머신으로 Ubuntu를 돌리고 있고 Ubuntu에 내려 받은 Docker로 파일 or 폴더를 옮기는 법을 알아 보겠습니다. 파일을 이동시키기 위해서는 도커 컨테이너의 이름을 알아야 합니다. Ubuntu bash를 열고 다음과 같이 입력합니다.
https://jayharvey.tistory.com/9
Docker 설치 후 이미지 보관 디렉토리 변경
(이미지 출처 : https://www.docker.com) Docker를 설치하고 난 뒤 반드시 Docker image, container 등의 정보가 쌓이는 디렉토리의 위치를 변경해줘야 합니다. 기본설정을 유지하면 나중에 root(/) 가 꽉차는 불상사를 당할 수 있습니다. 설치방법은 공식 Docker 페이지 에서 확인을 부탁드립니다. 예전에 다른 글에서 설치방법을 적었었는데 Docker 버전이 올라가면서 설치방법이 바뀌더군요. 적어놓더라도 의미가 없을 것 같아서 링크를 남깁니다.
http://dveamer.github.io/backend/DockerImageDirectory.html