728x90
반응형

1. 이미지 vs 컨테이너

 컨테이너는 애플리케이션, 웹사이트, 노드 서버, 애플리케이션을 실행하는 전체 환경 등 무엇이든 포함하는 유닛 패키지다.

이미지는 쉽게 말해 컨테이너의 블루프린트가 되는 것인데, 실제로 코드와 코드를 실행하는데 필요한 도구를 포함한다.

예를 들어 NodeJS 환경이 깔린 이미지가 있으면 도장처럼 찍어서 여러개의 nodeJS 환경이 구성된 컨테이너를 만들어낼 수 있다.

 

2. 외부 (사전 빌드된) 이미지의 사용 및 실행

 도커 허브 사이트에 가보면 매우 일반적인 ( 우분투나 node 같은 ) 이미지를 받을 수 있다.  아래 명령어를 입력해보자.

$ docker run node

 그 다음 아래 명령어를 입력하면 컨테이너가 생성되어 실행되는 것을 확인할 수 있다.

 

$ docker ps -a

 

도커 프로그램을 켜봐도 알 수 있다.

 

보통은 이렇게 일반적인 이미지로 컨테이너를 만들고 자신의 환경에 맞게 코딩한 다음 나만의 이미지로 만들어서 사용한다.

 

3. 나만의 node 이미지 만들기

1. 먼저 파일을 다운로드 받고 VSCode 에서 폴더를 연다.

nodejs-app-starting-setup.zip
0.00MB

 

2. 설치된 npm 패키지들을 받기 위해 아래 명령어를 입력한다.

$npm install

 

 

3. Docker 확장 프로그램을 설치하고 다운로드 받았던 프로젝트 안에 Dockerfile 을 만들어준다.

 

 

/Dockerfile

# 위에서 도커 허브 node 이미지를 기반으로 로컬로 다운로드 및 캐싱 되었기 때문에 이미지를 가져올 수 있다.
FROM node 

# 만약 컨테이너 안의 이미지의 경로가 /app 이런식으로 되어있다면 작업할 div 경로를 설정할 수도 있다.
# 설정해주면 COPY 의 두번째 경로를 ./ 이것으로 했을 때 자동으로 /app 경로가 된다.
WORKDIR /app

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 도커에게 우리가 서버를 실행할 포트를 말해준다.
EXPOSE 80

# 이미지가 생성될 때 실행되지 않고 컨테이너가 실행될 때 수행하는 명령어
CMD ["node", "server.js"]

 

4. 터미널에서 아래 명령어를 입력해보자

$docker build .

위에 생성된 image ID 를 복사해서 docker run을 해보면,

이렇게 컨테이너가 실행된 것을 확인할 수 있다.

 

이제 이미지로 만들었고 컨테이너 실행도 했겠다 80번 포트에 열린 사이트를 확인해 보자.

??? 화면이 뜨질 않는다 이 이유는 아래에 나온다.

 

 

5. docker ps 명령어를 입력하면 현재 실행중인 프로세스를 확인할 수 있다.

컨테이너 실행도 잘 되었다. 하지만 우리는 문서상으로만 포트 80번을 expose 한다고 명시하였고, 실제로 컨테이너안의 포트를 로컬 포트에 할당시켜주질 않았다. 이는 run 명령어를 실행할 때 쓰면 된다. 일단 컨테이너를 중지시키고 포트를 할당해준 뒤 다시 시작해보자.

 

$ docker stop '위에서 확인한 컨테이너의 이름'

 

 

포트를 할당해주고 다시 실행한다. (위에서 만들었던 컨테이너의 id 를 씁니다.)

$ docker run -p 3000:80 sha256:5ed67ec470b78df4b721d82a9ae3924059e432e58d710782d2f73a6efd6dbb75

 

그 다음 웹을 켜보면

로컬 3000번 포트에 컨테이너의 80번 포트가 할당되어 잘 나타나는 것을 볼 수 있다.

 

이미지는 읽기 전용이기 때문에 이 방법으로는 만약 변경사항이 생겨 적용하고 싶으면 이미지를 다시 빌드해야 한다.

 

 

또한 Dockerfile 이미지 레이어에는 캐시를 사용하는데, 빌드했었던 이미지를 다시 빌드할 때 변경사항이 없으면 매우 빠르게 빌드된다. 

이것을 이용해서 다음과 같이 npm package에 대한 변경사항이 없을 때 npm install 을 빠르게 넘어갈 수도 있다

 

/Dockerfile

# 위에서 도커 허브 node 이미지를 기반으로 로컬로 다운로드 및 캐싱 되었기 때문에 이미지를 가져올 수 있다.
FROM node 

# 만약 컨테이너 안의 이미지의 경로가 /app 이런식으로 되어있다면 작업할 div 경로를 설정할 수도 있다.
# 설정해주면 COPY 의 두번째 경로를 ./ 이것으로 했을 때 자동으로 /app 경로가 된다.
WORKDIR /app

# package.json 파일을 복사한다. 만약 다시 빌드할 때 변경사항이 없을 경우 npm install까지 그냥 넘어간다.
COPY package.json /app

# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 도케에게 우리가 서버를 실행할 포트를 말해준다.
EXPOSE 80

# 이미지가 생성될 때 실행되지 않고 컨테이너가 실행될 때 수행하는 명령어
CMD ["node", "server.js"]

 

 

728x90
반응형
728x90
반응형

1. Docker 란?

 Docker란 컨테이너를 생성하고 관리하기 위한 도구이다. 여기서 컨테이너란 표준화된 소프트웨어 유닛을 말한다.

기본적으로 해당 코드를 실행하는데 필요한 종속성과 도구가 포함된 패키지라고 보면 된다. 컨테이너라는 곳에 우리가 개발을 한 환경 자체를 넣어버리고 그 환경을 다른 곳에서 불러오면 문제없이 동일하게 사용할 수 있다.

 

2. 컨테이너가 왜 필요한가?

소프트웨어에서 왜 독립적인 표준화된 애플리케이션 패키지를 원하는지에 대한 이유를 생각해보면 컨테이너의 중요성을 좀 더 정확하게 깨닫게 된다. 도커의 주요 사용 사례 중 하나는 우리가 종종 다른 개발 제품 생산 환경을 가지게 될 때 환경 별로 관리하기 위한 사례인데,

 

예를 들어 Node js 버전이 14.3인 환경에서 

다음과 같은 코드를 짰을 때 에러가 뜨는 것을 확인할 수 있고 이에 따라 우리는 14.13 보다 높은 버전이 필요한 것을 알게 된다.

이와 같이 버전 문제로 인해 문법에 에러가 뜨는데 우리가 사용할 수 있는 환경이 로컬밖에 없다면 이 코드는 아예 사용할 수 없을 것이다.

그렇다고 코드 자체를 버리기엔 애매한 상황이 있을 때 우리가 로컬 환경 자체를 바꾼다고 해서(Node js 버전 업그레이드 등)는 상당한 소요가 필요할 것이다. (이 코드 뿐만 아니라 다른 곳에서 에러가 뜰 수도 있기 때문에)

이 때 애플리케이션이 자체적으로 필요한 Node 버전을 제공하는 컨테이너를 사용한다면 테스트를 해보기에 훨씬 편리할 수 있다.

 

물론 프로젝트가 몇 개 안되고 모든 프로젝트가 하나의 버전을 똑같이 사용한다면 별로 필요가 없겠지만, 큰 회사에서 복잡한 프로젝트들이 여러개 있을 경우 각각의 프로젝트에 적합한 버전이 있을 수도 있을 것이고, 그 복잡한 프로젝트를 똑같은 버전으로 만드는 것 자체가 큰 일이 될 수도 있다고 생각되었다. 그럴 때 컨테이너를 여러개 만들고 버전별로 관리하면 상당히 유용할 것이다.

 

3. 가상 머신과 도커 컨테이너의 차이점?

물론 위의 상황이 있을 때 가상머신으로도 버전 별로 프로젝트를 관리하는 것은 가능하다. 하지만 가상 머신을 사용할 때 가장 큰 문제점은 오버헤드이다. 컴퓨터 안에 컴퓨터를 집어넣는 행동을 여러번 반복하다보면 메모리, cpu, 내 하드 드라이브의 공간을 낭비하게 될 것이고 컴퓨터는 계속 무거워지고 나중엔 오버헤드가 발생할 것이다. 실제로 학생 때 가상 머신을 사용해봤는데 가상 환경을 한 개만 만들었어도 컴퓨터 성능이 별로 좋지 않으면 내 컴퓨터 자체가 느려지는 것을 볼 수 있었다. 이에 비해 컨테이너는 자체에 OS를 가지고 있고, 가상 머신보단 훨씬 가벼운 느낌이 있다.

 

4. Windows 에서 도커 설치하기

https://typo.tistory.com/entry/Docker-in-Windows?category=896128 

 

Docker | Windows |Docker in Windows

먼저 Windows 에서 도커를 사용하기 위해선 WSL2(Windows Subsystem for Linux 2)가 필요하다. 마이크로소프트 스토어에서 Windows Terminal을 다운받는다. 그다음 관리자 권한으로 실행한다. 터미널에 DISM 명..

typo.tistory.com

 

 

5. MacOS 에서 도커 설치하기

https://www.docker.com/products/docker-desktop/

 

Docker Desktop - Docker

MOST COMMON

www.docker.com

 

해당 사이트에서 다운로드 받으면 된다.

 

 

728x90
반응형
728x90
반응형

윈도우 하위시스템에서 우분투 컨테이너를 사용할 때 기존 mongo 사용법과 달리

sudo service mongod start 명령어가 안먹힐 때가 있다.

 

그럴 땐 먼저 아래 링크로 들어가 복사를 한다.

https://github.com/mongodb/mongo/blob/master/debian/init.d

 

GitHub - mongodb/mongo: The MongoDB Database

The MongoDB Database. Contribute to mongodb/mongo development by creating an account on GitHub.

github.com

 

데비안 계열의 우분투에서 쓰는 init script 내용을 아래 명령어로 들어가 붙여넣기한다.

$ sudo vi /etc/init.d/mongod

 

그 다음 권한을 설정해준다.

$ chmod 755 mongod

 

이제는 명령어가 잘 먹히는 것을 확인할 수 있다.

 $ sudo service mongod start
728x90
반응형
728x90
반응형

윈도우에서 도커에 우분투를 설치했을 때 sudo 명령어가 안먹히면 아래 방법을 써보자.

 

1. 도커 컨테이너 ID 확인

# docker ps -a

 

2. 확인한 ID로 컨테이너 접속

# docker exec -u root -t -i 컨테이너ID /bin/bash

 

3. 아래 명령어 입력

apt-get update && \
      apt-get -y install sudo

 

728x90
반응형
728x90
반응형

Dockerhub를 이용하기 위해 먼저 로그인을 해준다( 계정이 없을 시 사이트에서 회원가입 후 진행 )

 


Dockerhub 사이트에 들어가면 자동으로 생성된 Repository를 볼 수 있다. (새로 만든 것도 가능)

 

 


클릭하고 들어가보면 그림 우측하단에 보이듯이 명령어를 알려준다.

 

 

 

 


쉘에서 docker login을 입력한다.

root@DESKTOP-AF9FQM1:/mnt/c/Users/gsjun# docker login
Authenticating with existing credentials...
Login Succeeded

 

 

전 포스트에서 이미지화 했던 것을 확인한다.

 

위에 도커허브에서 알려준 명령어를 맞게 입력한다.

 

 

정상적으로 이미지가 업로드된 것을 확인할 수 있다.

728x90
반응형
728x90
반응형

컨테이너 상태 확인

  • 실행중인 컨테이너의 상태를 확인할 때에는 ps 명령어를 사용한다.

 

  • 모든 컨테이너의 상태를 확인할 때에는 ps -a 명령어를 사용한다.

 

컨테이너 삭제

컨테이너를 삭제할 때에는 rm 명령어를 사용한다. 삭제 한 후 ps -a 명령어로 확인해보자.

 

 

이번에는 실행중인 컨테이너를 삭제해보자.

 

실행 중인 컨테이너는 삭제할 수 없다는 문구가 출력된다.

 

 

이미지 상태 확인

로컬에 저장된 이미지를 확인할 때에는 images 명령어를 이용한다.

 

 

이미지 삭제

 

이미지를 삭제할 때에는 rmi 명령어를 사용한다. 이미지 이름이 아닌 이미지의 ID를 이용해서 삭제 가능하다.

보통은 해당 이미지를 참조하는 컨테이너를 먼저 삭제한 후 이미지를 삭제해야 되지만 -f 옵션을 이용해서 강제로 삭제가 가능하다.

 

 

728x90
반응형
728x90
반응형

컨테이너 생성 시 포트를 부여하는 방법

기본적으로 -p옵션을 이용해서 바인딩할 포트를 부여한다.

예를 들어 아래와 같이 명령어를 입력하면 myserver라는 컨테이너를 생성하고 호스트 머신의 80번 포트가 컨테이너의 80번 포트로 바인딩된다.

 

# sudo docker run -it -p 80:80 --name myserver ubuntu:18.04

 

 

 

이와같이 전 포스트와 다르게 별도의 다운로드 없이 신속하게 컨테이너가 생성되었다. 이는 한번 다운로드한 이미지를

로컬에 저장하고 있다가 재사용했기 때문이다.

 

정상적인 포트 부여 여부를 확인하기 위해 nginx를 설치하고 실행해보자.

 

root@c628d61e15e8:/# apt-get update
root@c628d61e15e8:/# apt-get upgrade
root@c628d61e15e8:/# apt-get install nginx
root@c628d61e15e8:/# service nginx start

 

정상적으로 로컬에 80포트가 바인딩 된 myserver가 나타나는 것을 확인할 수 있다.

 

 

컨테이너 이미지화 하기

1. 컨테이너가 실행중이면 멈춘다.

 

# sudo docker stop myserver

 

 

 2. 종료된 컨테이너의 이름을 알아낸다.

 

# sudo docker ps -a

 

 

3. 컨테이너를 이미지화한다. ( 위에 컨테이너 ID 참조 )

 

# sudo docker commit -a "commit_message" container_id docker_id/image_name:tag

 

  • commit_message : commit 할 때의 메세지
  • container_id : 컨테이너를 만들 id
  • docker_id : 사용하고있는 계정
  • image_name : 사용하고있는 image의 이름
  • tag : 태그 번호
728x90
반응형
728x90
반응형

컨테이너 생성

wsl 접속 후 우분투 18.04 이미지를 이용해 teepo라는 이름의 컨테이너를 생성한다.

 

PS C:\Users\gsjun> wsl
root@teepo:/mnt/c/Users/gsjun# sudo docker run -it --name teepo ubuntu:18.04
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
284055322776: Pull complete
Digest: sha256:bfb4cabd667790ead5c95d9fe341937f0c21118fa79bc768d51c5da9d1dbe917
Status: Downloaded newer image for ubuntu:18.04

-it 옵션은 인터렉션을 위한 옵션으로 해당 컨테이너의 터미널고 접근 및 제어가 가능하게 해준다.

 

이미지

 

컨테이너

 

컨테이너 종료

컨테이너 종료 시 exit 명령어를 입력하면 된다.

root@c50ce07e6a9c:/# exit
exit

다만 exit 명령어는 컨테이너에서 빠져나오면서 종료까지 되기 때문에 서비스가 종료된다.

Container를 running 상태로 두면서 빠져나오기 위해서는 Ctrl+p, Ctrl+q를 순서대로 입력(중간에 메세지가 안떠도 끝까지 입력)해주면 아래와 같이 메세지가 뜨면서 Container를 빠져나올 수 있다.

 

 

컨테이너 시작 및 재진입

종료된 컨테이너를 시작할 땐 start 명령어를 사용하고, 실행중인 컨테이너에 진입할 때는 attach 명령어를 사용한다.

 

 

컨테이너의 정보 확인

ps 명령어를 이용해 실행중인 컨테이너들의 정보를 확인할 수 있으며, -a 옵션으로 모든 컨테이너의 정보를 확인할 수 있다.

 

root@teepo:/mnt/c/Users/gsjun# sudo docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS     NAMES
c50ce07e6a9c   ubuntu:18.04   "bash"    19 minutes ago   Up 15 seconds             teepo

root@teepo:/mnt/c/Users/gsjun# sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS     NAMES
c50ce07e6a9c   ubuntu:18.04   "bash"    19 minutes ago   Up 24 seconds             teepo
728x90
반응형
728x90
반응형

 

 

먼저 Windows 에서 도커를 사용하기 위해선 WSL2(Windows Subsystem for Linux 2)가 필요하다.

 

마이크로소프트 스토어에서 Windows Terminal을 다운받는다.

 

 

그다음 관리자 권한으로 실행한다.

 

 

 

터미널에 DISM 명령어를 실행한다.

> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

 

 

wsl을 입력해보면 아래와같이 linux를 설치하라고 뜬다.

 

 

https://aka.ms/wslstore

위의 주소를 클릭하고 마이크로소프트 스토어에서 Ubuntu를 검색하여 설치한다.

 

 

아래와같이 명령어를 입력하면 잘 되고있는지 확인할 수 있다.

 

 

이제는 버전을 2로 바꿔보자. 먼저 버전을 확인해준다.

> wsl -l -v
  Name           State         Version
* Ubuntu         Running       1

 

 

버전을 바꾸어준다.

> wsl --set-version Ubuntu 2

 

 

 

아래와 같은 에러가 뜬다면 아래 링크에 접속해 다운로드 한다.

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

WSL 2에 커널 구성 요소 업데이트가 필요합니다. 자세한 내용은 https://aka.ms/wsl2kernel을 참조하십시오.

 

 

기본값도 바꾸어준다.

> wsl --set-default-version 2

 

 

확인해본다.

> wsl -l -v
  Name           State         Version
* Ubuntu         Running       2

 

 

 

이제 WSL2는 세팅이 완료되었다. 도커를 설치해보자

 

https://hub.docker.com/editions/community/docker-ce-desktop-windows

 

Docker Desktop for Windows by Docker | Docker Hub

Docker Desktop for Windows Docker Desktop for Windows is Docker designed to run on Windows 10. It is a native Windows application that provides an easy-to-use development environment for building, shipping, and running dockerized apps. Docker Desktop for W

hub.docker.com

 

 

추가적으로 WSL2 우분투 터미널에서 docker 명령어를 사용할 수 있다.

728x90
반응형

+ Recent posts