개발하고 싶은 초심자
220329 D+69 Docker 본문
✷ Docker Download
(intelChip / Apple Chip(M1) 설치 방법 따로 존재하기 때문에 설치 과정에서 주의할 것)
M1으로 Docker 설치 방법
(인텔칩이나 우분투는 사용하지 않아 자세히 쓰지 않음)
(우분투 도커 설치 방법 / Docker Engine 설치 후 Docker Compose 설치 진행할 것 /
우분투는 무조건 명령어 앞에 sudo 붙일 것)
① Mac with Apple silicon을 클릭하여 다음 명령어로 로제타 2 설치하기.
softwareupdate --install-rosetta
② 사이트에 들어가서 보이는 Mac with Apple Chip으로 설치하기
③ Docker.dmg 파일 더블 클릭 - Docker 아이콘을 Application 폴더로 옮겨놓기.
④ Docker 열어서 동의할 것에 동의하고 Docker에 나오는 명령어를 CLI에 입력하기.
⑤ docker --version 명령어로 버전 확인 메시지가 잘 나오면 끝.
1. 컨테이너 기술과 Docker의 탄생 배경
✷ 컨테이너
: 애플리케이션의 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고
도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자.
→ 개발자들은 물자의 수송에 획기적인 단축을 가져다준 컨테이너 기술을
"소프트웨어 수송, 즉 배포에 사용할 수는 없을까?" 하는 생각을 하기 시작했고,
그 결과로 리눅스 컨테이너(lxc)라는 것을 만들어냈다.
리눅스 컨테이너 기술은 그 자체로 훌륭하고 완성된 기술이었지만,
애플리케이션을 쉽게 컨테이너화할 수 있는 생태계 혹은 커뮤니티가 없었다.
→ Docker는 소프트웨어 저장소 Docker Hub와 함께 빠르게 성장하고
개발자들은 쉽게 애플리케이션을 포장하고 컨테이너 방식으로 실행할 수 있게 되었다.
⇒ 한 컴퓨터 안에 여러 대의 컨테이너가 존재하고, 이를 통해 애플리케이션 실행 환경이 격리되어 있음
⇒ 컨테이너 기술은 실행 환경에 구애받지 않고 애플리케이션을 실행할 수 있다
(=== 애플리케이션 실행이 어떠한 환경에 구애를 받는다)
2. Why we use Docker?(컨테이너 방식의 장점)
① 의존성 충돌 문제를 해결해준다
‣ 어떤 애플리케이션은 해당 애플리케이션을 실행하기 위해 반드시 어떤 환경이 구축되어 있어야 한다
(맥 용 프로그램 설치를 위해 맥 운영체제가 필요한 것처럼)
→ A 프로그램 실행에 B 프로그램이 필요한 경우, A 프로그램은 B 프로그램에 의존 관계를 가지고 있다고 한다.
→ 하지만 예를 들어 wordpress 프로그램이 다른 프로그램 php에 대해 의존 관계를 가질 때,
특정 버전을 요구하는 경우가 생길 수 있다.
ex)
wordpress 5.2 → php 7
이러한 상황에서 동일한 컴퓨터에 php 프로그램이 무조건 필요한 drupal 프로그램을 실행시켜야하는데,
php 7버전이 아닌 6버전을 사용할 때만 제대로 작동할 수 있다고 가정한다면
ex)
drupal 8.1 → php 6
일반적으로 한 컴퓨터에 여러 버전의 동일한 애플리케이션이 설치 되지 않는다.
→ php의 의존 관계를 갖고 있는 다른 두 애플리케이션(wordpress, drupal)들 중 하나는 제대로 된 실행을 보장할 수 없다.
⇒ 이런 상황을 의존성이 충돌한다고 한다.
‣ 컨테이너 기술은 애플리케이션을 컨테이너 내에 구성하기 때문에 이런 문제를 해결할 수 있다.
⇒ 각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문에
컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함할 수 있다.
✷ 컨테이너가 호스트 pc와 격리하는 것들과 독립적으로 소유하는 자원들
① 프로세스
→ 특정 컨테이너에서만 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있다.
→ 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에 영향을 줄 수 없다.
② 네트워크
→ 기본적으로 컨테이너 하나에는 하나의 IP 주소가 할당되어 있다.
⇒ 컨테이너마다 별도의 localhost(각각이 자체 IP)가 있다.
③ 파일 시스템(파일)
→ 컨테이너 안에서 사용되는 파일 시스템은 구획화 되어있기 때문에(별도의 파일 시스템이 있다)
해당 컨테이너에서의 명령 / 파일 등의 액세스를 제한할 수 있다.
⇒ 루트 디렉토리가 컨테이너마다 각각 있다.
✷ 공유하는 것
CPU 성능, 메모리, 리눅스 커널
✷ 컨테이너는 가상 머신(Virtual Machine / VM)과 비슷한 수준의 격리성을 제공한다
(도커를 비롯한 리눅스 컨테이너 기술은 가상 머신의 접근 방법과는 조금 다르지만)
② 개발 환경 / 배포 환경을 일치시킨다
‣ 여러 개발자가 하나의 애플리케이션을 진행하기 위해
특정 버전 이상의 node.js 라거나 mysql 등을 본인의 운영체제에 맞게 설치하는 과정에서
발생하는 사소한 실수, 설치 항목의 부재에서 시간이 오래 걸린다.
⇒ 도커가 실행 중이라면 어떤 운영체제인지 상관하지 않고 즉시 원하는 애플리케이션 실행 환경을 만들 수 있다.
⇒ 개발을 컨테이너 위에서 진행하는 경우 모든 개발팀이 동일한 환경 하에 개발을 진행할 수 있다.
ex)
docker run --name postgres -e POSTGRES_PASSWORD=mysecret -d postgres
⇒ 애플리케이션 구성 자체가 컨테이너화 되면
YAML 파일 하나 + 명령어 하나로 모든 애플리케이션 실행 환경 구성이 완료된다
ex)
docker-compose.yaml(혹은 yml, 확장자명은 yaml과 yml 둘 다 똑같음)으로 파일을 구성하고
파일 내용을 넣고
예시 코드
version: '3.8'
services:
nginx:
image: sebcontents/client
restart: 'always'
ports:
- "8080:80"
container_name: client
node:
image: sebcontents/server
restart: 'always'
ports:
- "4999:80"
container_name: server
mysql:
image: amd64/mysql
restart: 'always'
container_name: database
environment:
MYSQL_ROOT_PASSWORD: supersecret # root 계정 비밀번호
MYSQL_DATABASE: test # 초기 생성 데이터베이스
MYSQL_USER: kimcoding # 생성할 사용자 이름
MYSQL_PASSWORD: supersecret # 생성할 사용자 비밀번호
docker-compose up -d
docker compose up -d
다음 명령어를 실행하면 바로 실행됨.
⇒ 서버도 이제 컨테이너에 담긴 애플리케이션을 실행하는 방식으로 서비스를 제공하기 때문에
AWS의 EC2 상에 도커를 설치하거나
ECS(docker container를 EC2 서버에서 실행할 수 있게 하는 서비스,
애플리케이션을 도커 컨터이너 째로 배포할 수 있게 해줌)를 이용하여 쉽게 애플리케이션 배포 가능.
③ 수평 확장을 쉽게 해준다
✷ 이미지
: 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿
→ 실행되는 모든 컨테이너는 이미지로부터 생성되며 이를 이용해 즉시 컨테이너를 만들 수 있다.
→ 이미지를 이용해 여러 개의 컨테이너 생성 가능.
⇒ 이미지 안에 컨테이너, 일대 다 관계
이미지는 기본 이미지(base image)로부터 (마치 git을 사용하는 것처럼)
변경 사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있다.
ex)
node.js로 작성된 애플리케이션을 이미지로 만들고 싶은 경우,
nodejs 이미지를 기본 이미지로 삼고 내가 만든 애플리케이션을 추가해 넣고, 이미지화할 수 있다.
✷ 레지스트리
: 이미지는 레지스트리에 저장되며, 대표적으로는 Docker Hub, Amazon ECR이 있다.
→ 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때
호스트 컴퓨터에 이미지가 존재하지 않으면 기본 레지스트리로부터 다운로드 받게 된다.
④ 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다
‣ 서비스 제공자들은 트래픽 분산을 위해 프록시 서버를 운영하며,
이러한 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 돕는다.
(=== 이러한 서버를 리버스 프록시의 한 종류인 로드 밸런서라고 한다)
⇒ 컨테이너 기술의 가장 큰 장점은 실행 환경의 일치다.
더 많은 트래픽으로 인한 서버 증설에 컨테이너 기술은 아주 활발하게 이용되고 있다.
동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고,
로드 밸런서에 이 서버를 추가하기만 하면 되고, 심지어 AWS는 서버를 만들고 삭제하는 일을 자동으로 해준다.
⇒ 이러한 기술을 응용하여, 새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하여 테스트하는 방법도 가능하다.
이를 통해 새 버전의 애플리케이션에서 발생할 수 있는 문제들을 미리 확인하고,
이러한 문제가 사용자 전체에게 영향을 끼치지 않도록 만들 수도 있다.
→ 쿠버네티스와 같이 오케스트레이션 도구가 이런 일들을 해주는 도구이며, 이는 컨테이너 기술이 있어 가능하다.
3. Docker CLI
‣ 사용법 : Docker CLI, Docker-Compose CLI, API Reference
‣ 환경 및 빌드 파일 구성 : DockerFile, Docker-Compose File
① use Docker
‣ 먼저 제공된 이미지를 읽을 수 있어야 하는데,
이미지는 레지스트리 계정, 레포지토리 이름, 태그 세 가지 정보로 구성되어 있다.
Registry_Account/Repository_Name:Tag
‣ 레지스트리(Registry)
: 도커 이미지를 관리하는 공간.
특별히 다른 것을 지정하지 않으면 도커 허브(Docker Hub)를 기본 레지스트리로 설정한다.
Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나뉠 수 있다.
Docker image를 찾거나 사용방법을 확인할 때 사용할 수 있다.
‣ 레포지토리(Repository)
: 깃헙의 레포지토리와 유사하게 생각하면 되는 것으로,
레지스트리 내에 도커 이미지가 저장되는 공간. 이미지의 이름이 사용되기도 함.
‣ 태그(Tag)
: 해당 이미지를 설명하는 버전 정보를 주로 입력하며,
같은 이미지라 해도 버전 별로 안의 내용이 조금씩은 다를 수 있다.
특별히 다른 것을 지정하지 않으면 latest 태그를 붙인 이미지를 가져온다.
ex) docker/whalesay 예시
1. docker/whalesay의 최신 이미지를 받아온다
image pull: 레지스트리에서 이미지 혹은 레포지토리를 가져오는 명령어
docker image pull docker/whalesay:latest
2. 이미지 리스트를 출력한다.
docker image ls
3. 받아온 이미지를 실행한다(이미지 → 컨테이너)
docker container run [OPTIONS] [COMMAND] [ARG ...]
docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo
[OPTIONS]의 종류인 --name: 컨테이너 이름을 할당한다.
[COMMAND]의 종류인 cowsay: 컨테이너 실행시 호출하는 명령어(node 호출하는 것처럼 이용한다)
[ARG ... ]에 들어가는 boo: cowsay에 넘겨질 파라미터
docker container run --name whalesay docker/whalesay:latest cowsay boo
4. 모든 컨테이너의 리스트를 출력한다.
docker container ps -a
container ps: 컨테이너 리스트 출력
-a : 디폴트로는 실행되는 컨테이너지만 종료된 컨테이너를 포함한 모든 컨테이너 출력
5. 컨테이너 삭제
컨테이너를 명시할 때는 ps 명령어를 통해
확인할 수 있는 NAMES 혹은 CONTAINER ID를 사용한다.
docker container rm 컨테이너_이름
// 도커 이미지 용량 확인
docker image ls
// 이미지 지우기
docker image rm docker/whalesay
// 세 가지 작업을 동시에 실행하는 명령어
docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo
container run: 이미지가 없다면 이미지를 받아온 후(pull) 컨테이너 실행
--rm: 컨테이너 일회성 실행.
컨테이너 중지 / 종료될 때 컨테이너와 관련된 리소스를 모두 제거한다.
// 또다른 예시
docker container run -it --rm danielkraic/asciiquarium:latest
-it
: -i, -t를 동시에 사용한 옵션으로
사용자와 컨테이너 간에 상호작용(interaction)이 필요할 때 사용한다.
(출력되는 화면을 사용자가 지속적으로 보기 위해 사용하는 것처럼)
(python 명령이 필요하거나 추가로 다른 입력을 받을 때 이 옵션을 지정한 후 사용한다)
✷ 컨테이너는 ctrl + C로 종료할 수 있다.
② Copy / Dockerfile
1) Docker Container에 파일 복사하기
(다른 사람이 제공한 도커 이미지를 받아 사용하는 경우,
원하는 모든 기능이 구성되어 있지 않을 수 있어
도커 이미지에 파일을 추가하고, 도커 이미지를 만드는 방법을 학습했다.)
✷ 게임 / 웹 서버 같이 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우가 있는데,
다음과 같은 경우를 예시로 들 수 있다.
• 웹 서버는 도커 컨테이너로 실행하는 경우
• 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일 구성인 경우
→ 서버에 문제가 생기는 것을 호스트와 별개로 파악할 수 있음.
→ 문제가 생긴 서버를 끄고 공장 초기화 하듯 도커 이미지로 서버를 재구동할 수 있음
‣ 로컬에 있는 파일과 도커 이미지를 연결하는 방법
• CP(Copy): 호스트와 컨테이너 사이에 파일을 복사
• Volume: 호스트와 컨테이너 사이에 공간을 마운드(Mount)
✷ Mount(마운트)
: 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용하여
마치 하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업.
: Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어.
→ usr/local/apache/htdocs 경로에 웹 서버와 관련된 파일들이 저장되어 있다면
해당 파일을 기반으로 웹 서버가 실행되도록 한다.
2) pacman-canvas 실습
(여기서 사용한 도커 이미지가 httpd)
git clone으로 레포지토리 클론
docker container run 명령어로 httpd 실행
-d 옵션을 붙여주지 않으면 백그라운드에서 실행이 되지 않아 계속 Exited 상태가 되기 때문에
꼭 -d 옵션을 붙일 것
docker container run -d --name 컨테이너_이름 -p 818:80 httpd
docker container run -d --name pacman-canvas -p 818:80 httpd
127.0.0.1:818 혹은 localhost:818 을 통해 웹 서버가 작동되는 것을 확인한 후,
새로운 터미널을 열어 로컬 호스트에 있는 파일을 컨테이너에 전달한다.
이 명령어를 실행할 때 위치는 pecman-canvas 디렉토리여야만 한다.
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
docker container cp ./ pacman-canvas:/usr/local/apache2/htdocs/
명령어 실행 후, 서버에서 게임 서버가 작동되고 있는지 확인할 수 있다.
✷ docker container run 명령어에서 -d 옵션이 없는 경우와 있는 경우의 차이
httpd 실행이 되기는 하지만 서버를 실행해보면 실행이 되어 있지 않다.
docker container ps -a 명령어를 통해 STATUS에 보면 Exited라고 나와있는 것을 볼 수 있다.
이는 docker가 가상 머신이 아니라 컨테이너 내에서 서버가 실행되는 것이 아니기 때문이다.
docker의 컨테이너에서 실행되는 명령이 계속 실행되는 상황이 아니면
그 명령이 종료됨과 동시에 컨테이너도 종료됨.
그래서 종료되지 않도록 docker 컨테이너 프로세스를 백그라운드로 실행시켜준 뒤
127.0.0.1:818 혹은 localhost:818을 통해 웹 서버가 작동하고 있다는 것을 확인할 수 있다.
✷ how to remove running docker(실행중인 도커 제거하기)
docker stop CONTAINER ID
docker rm CONTAINER ID
✷ how to restart docker container(도커 컨테이너 재시작하기)
container restart CONTAINER ID
✷ Error response from daemon: Container ~~~ is not running
docker exec -it 컨테이너_이름 bash 명령어를 통해
컨테이너 내부 터미널로 접속할 수 있다고 하여 해보았는데, 컨테이너가 작동하지 않고 있다는 에러가 떴다.
컨테이너 에러를 보고 구글링을 해서 찾아본 결과, exec 명령어는 container가 up인 상태에서만 가능하기 때문에,
docker start CONTAINER ID 명령어를 통해 접속하고자 하는 컨테이너를 실행시키고 나서 사용할 수 있었다.
컨테이너 터미널은 exit 명령어로 종료할 수 있다.
2-1) pacman-canvas 실습 - 도커 이미지 만드는 두 가지 방법
• Docker Container를 이미지 파일로 변환할 때 장점
→ 이전에 작업했던 내용을 다시 수행하지 않아도 됨
→ 배포 및 관리 유용
‣ 구동한 Docker Container를 이미지로 만드는 방법
(이미지를 컨테이너로 실행하고, 변경사항을 다시 이미지로 만드는 명령어)
• docker container commit 명령어 사용
docker container commit 컨테이너_이름 my_pacman:1.0
docker images 명령어로 my_pacman 1.0을 확인할 수 있다.
생성된 이미지를 900 포트에서 웹 서버로 구동할 수 있다.
127.0.0.1:900 혹은 localhost:900을 통해 웹 서버가 작동하고 있는지 확인할 수 있다.
docker run --name my_web2 -p 900:80 my_pacman:1.0
‣ Docker Image 빌드를 위한 파일인 Dockerfile로 만드는 방법
→ Dockerfile(이미지 파일의 설명서)을 만들고 Dockerfile대로 이미지를 build 하는 방법.
(dockerfile을 이용하여 실행환경을 구성함)
--tag는 name:tag 형식으로 이미지를 생성할 수 있다
지정한 경로에 있는 Dockerfile을 찾아서 빌드한다.
.도 명령어에 꼭 포함되어 있어야 하는 것이므로 빠뜨리지 말 것
docker build -t 사용자/이미지:태그 .
docker build --tag my_pacman:2.0 .
[+] Building 3.6s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 203B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/httpd:2.4 3.0s
// 베이스 이미지를 httpd:2.4 로 사용한다.
=> [1/3] FROM docker.io/library/httpd:2.4@sha256:5238710afda67227f805b7563455365588afd4b7d9abcddbdfe76b01463c9df3 0.1s
=> [internal] load build context 0.4s
=> => transferring context: 17.22MB 0.4s
=> [2/3] WORKDIR /usr/local/apache2 0.0s
// 호스트의 현재 경로에 있는 파일을 생성할 이미지 /usr/local/apache2/htdocs/ 에 복사한다.
=> [3/3] COPY ./ /usr/local/apache2/htdocs/ 0.1s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:4e94da220d2077dab0bab9719264f6c451bcf083bafdba1c7109f90903c47d8c 0.0s
=> => naming to docker.io/library/my_pacman:2.0
생성된 이미지를 통해 901 포트에 웹 서버 구동하기
127.0.0.1:901 혹은 localhost:901을 통해 웹 서버가 작동하는지 확인 가능
docker run -d --name my_web3 -p 901:80 my_pacman:2.0
4. Docker 이미지 다루기
1) 한 개의 Docker 이미지를 다루는 방식 연습
1) 도커 이미지 pull
docker pull sebcontents/part1:latest
2) 80포트 서버에서 실행하는 도커 컨테이너 생성하기
([컨테이너명]은 내가 알아볼 수 있는 이름으로 알아서 지정할 것)
// docker container cp 명령어를 입력해 로컬호스트에 있는 파일을 컨테이너에 전달
docker run --name [컨테이너명] -d -p 3000:80 sebcontents/part1
docker container cp ./ [컨테이너명]:/usr/local/apache2/htdocs/
3) 컨테이너 안에 있는 내용(txt파일)확인해보기
컨테이너 안에서 bash shell 실행하기
docker exec -it [컨테이너명] bash
cd / 명령어로 루트 디렉토리로 이동
ls 명령어로 data 폴더의 존재유무 확인
cd data - ls 명령어로 내가 찾는 파일의 존재유무 확인
apt update - apt install nano 명령어로 nano 텍스트 에디터 설치
nano 명령어로 파일 들어가기.
컨테이너 종료는 exit 명령어 사용하기.
✷ 한 개의 도커 이미지를 다루는 방식에서의 에러 핸들링
분명 컨테이너를 생성하고 3000번 포트에 연결한 후
컨테이너에 로컬호스트의 내용을 복사하는 명령어를 사용했음에도 불구하고
3000번 포트를 열면 게임 화면이 구동되지 않고 It Works!라는 화면만 떴다.
그 방법을 알아보기 위해 제너럴 채널에 질문을 올려봤더니,
It Works!라고 뜨는 것이라면 httpd 웹 서버가 백그라운드에서 실행되고 있기 때문에 그럴 것이라는 답변을 받았다.
docker stop [httpd CONTAINER ID] 명령어를 실행한 후 다시 복사를 했더니 제대로 게임 화면이 구동되었다.
2) 두 개의 Docker 이미지를 다루는 방식 연습
1. mkdir 폴더명 - cd 폴더명
2. touch 파일명.yaml(혹은 yml / 둘다 똑같음)
3. 소스코드 복붙하기
4. yaml 파일이 있는 위치에서 yaml 파일을 실행
docker-compose up -d
5. 브라우저에서 localhost:8080 혹은 127.0.0.1:8080 에서 실행된 client 화면을 확인 후 로그인
// 사용한 소스코드
version: '3.8'
services:
nginx:
image: sebcontents/client
restart: 'always'
ports:
- "8080:80"
container_name: client
node:
image: sebcontents/server
restart: 'always'
ports:
- "4999:80"
container_name: server
3) advanced challenge
아까 만들었던 docker-compose.yaml 파일에 아래 있는 소스코드 복붙 후
데이터베이스 비밀번호 각각 설정하기.
// m1 전용 소스코드
version: '3.8'
services:
nginx:
image: sebcontents/client
restart: 'always'
ports:
- "8080:80"
container_name: client
node:
image: sebcontents/server
restart: 'always'
ports:
- "4999:80"
container_name: server
volumes:
- "./volumefolder:/data"
mysql:
image: amd64/mysql
restart: 'always'
container_name: database
environment:
MYSQL_ROOT_PASSWORD: supersecret # root 계정 비밀번호
MYSQL_DATABASE: test # 초기 생성 데이터베이스
MYSQL_USER: kimcoding # 생성할 사용자 이름
MYSQL_PASSWORD: supersecret # 생성할 사용자 비밀번호
docker compose up -d 명령어 실행 후
docker-compose.yaml 파일이 있는 곳에 volumefolder가 있는지 확인.
volumefolder 안에 임의의 텍스트 파일 생성.
docker exec -it server sh 명령어로 server 컨테이너 터미널로 접속.
cd / 명령어로 루트 디렉토리 진입
ls 명령어로 data 폴더가 있는 지 확인한 후 data 폴더에 진입
아까 volumefolder에 만들었던 텍스트파일이 있는지 확인. 있으면 끝.
✷ node.js 도커라이징 하는 방법
mkdir backend
touch app.js
npm i express
npm i cors
npm init -y
node app.js
curl http://localhost:8080
Dockerfile 생성
docker build -t backend 1.0 .
docker images
// 콜론 사이로 숫자 두개 넣는 것은 호스트포트:컨테이너포트 의미이다.
docker run -d --name backend-container -p 3000:8080 backend:1.0
curl http://localhost:3000
docker container ps -a(혹은 docker ps -a)
docker stop CONTAINER ID
docker rm CONTAINER ID
mkdir frontend
touch index.html
touch script.js
(3333을 3000으로 변경)
Dockerfile 생성
docker build -t frontend:1.0 .
docker run -d --name frontend-container -p 8080:80 frontend:1.0
docker ps -a
curl http://localhost:8080하면 정적 웹 호스팅 빌드 완료.
(ajax call은 안되는 상황)
클라와 서버를 같이 띄우려면
mkdir docker-compose
touch docker-compose.yaml(yml)
(3333은 3000으로 바꾸고, 80은 8080으로 바꿀 것)
저장 후
docker-compose up --build
localhost:8080
localhost:3000
이후
docker-compose down 하면 컨테이너까지 완전히 삭제된다.
'기술개념정리(in Javascript)' 카테고리의 다른 글
220330 D+70 배포 자동화(Automated Deployment), IAM (0) | 2022.03.29 |
---|---|
220330 D+70 Client & Server Deployment Pipeline, 환경 변수 설정 (0) | 2022.03.29 |
220328 D+68 도메인 주소를 이용한 HTTPS 인증 (0) | 2022.03.28 |
220325(28) D+67(68) 백엔드&프론트엔드 배포, 데이터베이스 연결 (0) | 2022.03.28 |
220325 D+67 AWS (0) | 2022.03.25 |