vscode devcontainers

  • 로컬에 있는 프로젝트를 고대로 도커 컨테이너로 가져와 작업 가능..!

쉽게

  • Remote-Containers: Add Development Container Configuration Files...
  • 원하는 환경 선택!
  • 그러면 .devcontainer 폴더와 그아래 Dockerfile 과 컨테이너 devcontainer.json 이 자동 생성된다
  • Remote-Containers: Reopen in Container로 컨테이너에서 개발을 해볼 수 있겠다

참고

docker context use

error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
이 대화 상자 대신 JIT(Just-in-time) 디버깅을 호출하는
방법에 대한 자세한 내용은 이 메시지의 뒷부분을 참조하십시오.

************** 예외 텍스트 **************
System.Threading.Tasks.TaskCanceledException: Cancellation token triggered before we finished reading from the stream.
위치: HttpOverStream.ByLineReader.<ReadLineAsync>d__0.MoveNext()
// 생략...
************** JIT 디버깅 **************
JIT(Just In Time) 디버깅을 사용하려면 이 응용 프로그램 또는 컴퓨터의
config 파일(machine.config)의 jitDebugging 값을
system.windows.forms 섹션에 설정해야 합니다.
또한 응용 프로그램은 디버깅할 수 있도록 컴파일되어야
합니다.

예:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

JIT 디버깅을 사용하면 처리되지 않은 모든 예외는
이 대화 상자에서 처리되지 않고 컴퓨터에 등록된 JIT
디버거에 보내집니다.
  • 다음날 와보니 위 에러가 뜨면서 도커 실행이 안되었다
  • 생각해보니까 어제 컨텍스트 유스한 명령이 생각나서, 이 명령을 실행하기 이전으로 돌아가면 될 듯했다
terminal
1
2
3
4
5
6
7
8
# 명령어 살피기
docker context

# 컨텍스트 목록 보기
docker context list

# 기본값으로 바꾸기
docker context use default
  • 위 명령을 실행하고 다시 도커를 실행하니 잘 동작했다!

참고

파워셸에서 도커 명령어 파이프

linux shell
1
docker stop `docker ps -aq`
  • 모든 컨테이너를 종료하는 명령이다
  • 리눅스에서는 백틱(backtick, `)으로 묶어서 결과를 파이프할 수 있다
  • 윈도우 터미널에서 같은 명령을 사용할 수가 없다… ㅠㅠ

PowerShell

powershell
1
docker ps -aq | ForEach-Object { docker stop $_ }
  • 나는 파워셸 디폴트로 사용하는데, 파워셸에서 이전 명령의 결괏값을 어떻게 다음 명령으로 넘겨줄 수 있는지 알아보았다 (파이프)
powershell
1
2
3
4
echo 1 2 | ForEach-Object { echo "value: $_" }
# output:
# value: 1
# value: 2
  • 단일 값이 아니라 배열 값을 받는 경우 ForEach-Object을 사용해야 하는 것을 알았다

참고

nodejs web dockerizing

  • 기존에 만들었었던 Nodejs Express WEB 프로젝트를 도커라이징 해보았다
  • 얄팍한 코딩사전님의 가장 쉽게 배우는 도커를 보고 시도했다
  • 도커가 이런거구나 하고 느낀 순간이였다.. 마치 신세계…
  • 이번 도커라이징을 통해서 내 프로젝트를 도커가 설치되어있는 다른컴퓨터에서 매우 쉽게 돌려볼 수 있다는걸 알게되었다

기존 상태 설명

디렉터리 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
├── node_modules/
├── web
│ ├── bin
│ │ └── www
│ ├── public/
│ ├── routes/
│ ├── utils/
│ ├── views/
│ └── app.js
├── .gitattributes
├── .gitignore
├── package-lock.json
├── package.json
├── README.md
└── sqldump.sql
  • 그냥 node express 서버와 db덤프 파일인 sqldump.sql 가 구분없이 한 디렉터리에 있었다

벡엔드와 데이터베이스로 분리하기

  • backend, database 폴더를 만든다
  • backend폴더로 sqldump.sql와 깃허브, 프리티어 세팅 등을 제외한 99.9999%의 소스파일들을 이동한다
  • database폴더로 sqldump.sql을 이동
sqldump.sql 이동
1
2
3
database
└── scripts
└── sqldump.sql
  • 이런식으로 node express 서버와 db를 분리할 수 있었다

Dockerfile 작성하기

backend

backend/Dockerfile
1
2
3
4
5
6
7
8
FROM node:12.18.3

WORKDIR /usr/src/app

COPY . .
RUN npm i

CMD ["npm", "start"]
  • 내가 로컬에서 사용하는 환경을 토대로
  • 내 앱에 맞는 노드버전을 가져와서
  • /usr/src/app 라는 워크디렉터리에
  • backend 아래있는 모든 파일들을 복사해오고
  • RUN 명령어로 npm i로 종속성을 설치한다
  • 그리고 CMD 명령으로 backend 서버를 실행시킨다

database

database/Dockerfile
1
2
3
4
5
6
7
8
FROM mariadb:10.5

ENV MYSQL_USER mysql_user
ENV MYSQL_PASSWORD 1234
ENV MYSQL_ROOT_PASSWORD 1234
ENV MYSQL_DATABASE webtest

COPY ./scripts/ /docker-entrypoint-initdb.d/
  • 내가 로컬에서 사용했던 마리아디비 버전 그대로 가져왔다
  • 데이터베이스 관련 환경변수들을 정의해주고
  • scripts 디렉터리에 있는 dump파일을 /docker-entrypoint-initdb.d/ 로 복사한다
  • /docker-entrypoint-initdb.d/ 는 데이터베이스를 생성할 때,
  • 하위 sql을 가지고 데이터베이스를 초기화해준다

후기

  • 메모리 딸린다…
  • 처음에는 좋아서 이것저것 다 도커라이징할려고 했는데,
  • 하다보니까 메모리가 딸려서 마우스가 뚝뚝 끊겼다…

참고

도커 실행 명령어

1
sudo service docker start

sudo service docker start

  • ec2 리눅스에서 도커 실행할때 주로 쓴다
  • 윈도우에서는 그냥 docker desktop을 실행시킨다

denied: requested access to the resource is denied

denied: requested access to the resource is denied

  • docker hub에 내가 연습했던 이미지를 업로드하려고 했는데 실패했다

이미지명 변경

cmd
1
2
3
docker image tag {이미지} {내 유저명}/{이미지}

docker image tag my-react:0.0.1 chinsung/my-react:0.0.1
  • 이런식으로 {내 유저명}/을 붙여주면 된다

로컬에서 sam 테스트하기

  • 이제 테스트할 때 build, deploy 기다리기… 할 필요가 없다!

전제조건


sam local start-api

cmd
1
sam local start-api --skip-pull-image
cmd log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\tmp\hello-world>sam local start-api --skip-pull-image
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM
CLI if you update your AWS SAM template
2020-09-21 13:40:36 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
2020-09-21 13:40:41 127.0.0.1 - - [21/Sep/2020 13:40:41] "GET / HTTP/1.1" 403 -
2020-09-21 13:40:41 127.0.0.1 - - [21/Sep/2020 13:40:41] "GET /favicon.ico HTTP/1.1" 403 -
Invoking app.lambdaHandler (nodejs12.x)
Requested to skip pulling images ...

Mounting C:\tmp\hello-world\.aws-sam\build\HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: 00b5b190-1c8d-184f-5ab5-c0e0764041d3 Version: $LATEST
END RequestId: 00b5b190-1c8d-184f-5ab5-c0e0764041d3
REPORT RequestId: 00b5b190-1c8d-184f-5ab5-c0e0764041d3 Init Duration: 438.88 ms
Duration: 4.53 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 44 MB
No Content-Type given. Defaulting to 'application/json'.
2020-09-21 13:40:48 127.0.0.1 - - [21/Sep/2020 13:40:48] "GET /hello HTTP/1.1" 200 -
2020-09-21 13:40:48 127.0.0.1 - - [21/Sep/2020 13:40:48] "GET /favicon.ico HTTP/1.1" 403 -
  • 나는 이렇게 명령을 쓴다
  • 나는 보통 매 실행마다 3-4초 정도 걸린다
  • build, deploy 하면서 테스트할때보다 획기적으로 빠르게 로컬에서 테스트 해볼 수 있다
  • --skip-pull-image옵션을 주는 이유는 매 실행마다 이미지를 받아오는 과정이 있는게 그걸 스킵하면 2초정도 빨라진다
  • 변경 사항은 자동으로 반영된다
  • 단점 ; 근데 변경사항이 없어도 매 실행 3초이상 걸린다
  • template.yaml 파일을 수정하면 수동으로 재시작 해줘야한다