AWS EC2 Ubuntu
서버에ASP.NET Core
업로드 테스트를 진행중이다.
서버는Ubuntu 18.04 LTS
이며, 모든 작업은 CLI 환경에서 진행했다.
도커(Docker)는 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. - 위키백과
그렇게 어려운 말로 적혀있는건 아닌데, 모르는 사람이 들으면 이게 무슨 소리인가 싶을거다.
어느정도 현실에 빗대어 이야기하자.
어떤 API 서버를 구축했고, 클라우드 서비스를 통해 배포 해야한다.
이 상황에서 모든 클라우드 플랫폼이 동일한 환경을 가지고 있지 않고, 개발 당시의 환경과도 다르기 때문에 개발된 환경과 동일한 환경이 클라우드상에도 설정되어야 한다.
서비스가 정상적으로 운영되기 위한 모든 환경을 규격화하는 것이다. 이렇게 규격화된 환경은 차후 다른 서비스를 개발하거나, 유사한 서비스를 개발할 때 시간(자원)을 아껴주는 역할을 한다.
Docker
의 가장 큰 장점은 변경 불가능한 인프라(Immutable Infrastructure)이다. 소프트웨어는 자주 수정된다면 여러가지 오류가 발생한다. 특히 변경에 따른 이력관리도 매우 중요한데 Docker
는 서버를 구축한 이후 변경이나 업데이트를 할 수 없다.
위와 같은 이유로 인해 Docker
는 업데이트 개념이 아닌 서버를 통째로 바꾸는 개념이다. 서버를 업데이트 하기 위해 새로운 도커 이미지를 업데이트해서 컨테이너에 담는다.
불편하다고 생각이 들 수 있겠지만 자잘한 소프트웨어 업데이트로 인해 머리를 쥐어 뜯는것보다 변경하기 위한 이미지를 올리는 것으로 배포를 끝낼 수 있다.
아래 방법은 repository
를 이용한 설치법이다. package
를 이용하여 Docker
를 설치하려면 Install from a package - Docker Engine 를 참고하길 바란다.
혹시 이전에 설치했던 Docker
가 있을 경우를 대비하여 사전에 지워주도록 하자.
$ sudo apt-get remove docker docker-engine docker.io containerd runc
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'docker-engine' is not installed, so not removed
Package 'docker' is not installed, so not removed
Package 'containerd' is not installed, so not removed
Package 'docker.io' is not installed, so not removed
Package 'runc' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
apt
를 업데이트하고, https
를 통해 리포지토리를 쉽게 사용할 수 있도록 패키지를 설치한다.$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release
Docker
공식 GPG Key를 추가한다.$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFit2ioBEADhWpZ8/wvZ6hUTiXOwQHXMAlaFHcPH9hAtr4F1y2+OYdbtMuth
lqqwp028AqyY+PRfVMtSYMbjuQuu5byyKR01BbqYhuS3jtqQmljZ/bJvXqnmiVXh
38UuLa+z077PxyxQhu5BbqntTPQMfiyqEiU+BKbq2WmANUKQf+1AmZY/IruOXbnq
...
YT90qFF93M3v01BbxP+EIY2/9tiIPbrd
=0YYh
-----END PGP PUBLIC KEY BLOCK-----
추가된 gpg key는 /usr/share/keyrings
에 저장된다. 열어볼 필요 없다. 어차피 읽지도 못한다.
stable
리포지토리를 설정하는 경우 아래와 같이 작성하고, nightly
or test
버전을 원하는 경우 stable
대신에 nightly
or test
를 넣어주면 된다.$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
Hit:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease
Get:4 https://download.docker.com/linux/ubuntu bionic InRelease [64.4 kB]
Get:5 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages [22.5 kB]
Get:6 https://download.docker.com/linux/ubuntu bionic/nightly amd64 Packages [59.8 kB]
Get:7 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Fetched 236 kB in 2s (153 kB/s)
Reading package lists... Done
docker-ce
, docker-ce-cli
, containerd.io
를 설치한다.$ sudo apt-get install docker-ce docker-ce-cli containerd.io
Reading package lists... Done
Building dependency tree
Reading state information... Done
...
설치가 완료되었고, stable repository
에서 가장 최신 버전으로 설치되었다.
특정 버전을 설치해야되는 경우에는 apt-cache
명령어를 사용해서 원하는 버전을 설치한다.
$ apt-cache madison docker-ce
docker-ce | 5:20.10.12~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.11~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.10~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
...
docker-ce | 18.06.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.06.0~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.03.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
만약 5:20.10.10~3-0~ubuntu-bionic
버전을 설치하고 싶은 경우
$ sudo apt-get install docker-ce=5:20.10.10~3-0~ubuntu-bionic docker-ce-cli=5:20.10.10~3-0~ubuntu-bionic containerd.io
<VERSION_STRING>
에 원하는 버전을 입력해서 설치하면 된다.
동작하는지 확인은 해봐야하니까 hello-world
컨테이너를 실행해보자. 로컬에 hello-world
라는 컨테이너가 없으니 Docker Hub
에서 자동으로 컨테이너를 다운받아 실행된다.
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5...4f685
Status: Downloaded newer image for hello-world:latest
제대로 실행된건지 확인하기 위해 docker ps -a
명령어 실행(sudo
권한으로 해야함)
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e42a5f4182f1 hello-world "/hello" 29 seconds ago Exited (0) 29 seconds ago competent_joliot
$ systemctl status docker
정상적으로 실행되고 있음을 확인할 수 있다.
일주일에 적어도 한 번은 적어보려고 노력하는데 그게 생각처럼 쉽지가 않다.
앞으로 기록할 것들
- AWS Lambda에 업로드한 코드 수정하기(json parsing)
- dotnet publish 패키지 증발 현상
- AWS Lambda 함수와 AWS API Gateway 연동하기
AWS EC2 ubuntu에 Docker 환경 구축하기+ ASP.NET Core Docker Image
꼼꼼하게 확인해가면서 배우는 습관을 들여야겠다.